php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
  #16 (permalink)  
Alt 06-08-2007, 00:17
Xadine
 Newbie
Links : Onlinestatus : Xadine ist offline
Registriert seit: Aug 2007
Beiträge: 23
Xadine ist zur Zeit noch ein unbeschriebenes Blatt
Standard

hatte ich schon versucht, auch mit ner while true schleife aber da ist er dann überlasetet glaub ich *g*
wenn ich sleep mache zb. sleep(10) dann dauert es 10 sekunden bis er das script ausführt.

PHP-Code:
<?php
session_start
();
require_once(
'datenbankverbindung.php');

$id $_POST['transmit'];
echo(
$id);
$sql=db_connect();


$result=$sql->query("START TRANSACTION");
UPDATE NOWAIT");
$result=$sql->query("
SELECT FROM angebot WHERE id='$id' FOR UPDATE");
if(!$result)
echo("
gesperrt");
else
echo("
nicht gesperrt");
sleep(10);
$angebot=$result->fetch_assoc();


?>
oben steht zb. echo($id); das gib der dann erst nach 10 sekunden aus und dann auch eben 'nicht gesperrt'. im zweiten browser vom anderen rechner genauso.

also die table angebot ist innoDB und in xampp steht eben have innoDB =YES bei den variablen
Mit Zitat antworten
  #17 (permalink)  
Alt 06-08-2007, 00:38
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Das zweite Skript wartet darauf, dass der Lock frei gegeben wird, d.h. es ist durchaus natürlich, dass bei beiden "nicht gesperrt" zurück gegeben wird. Was wichtig ist, ist die Zeit, nach der "nicht gesperrt" beim zweiten Skript ausgegeben wird - wenn es sofort geschieht ist was falsch, wenn das erst geschieht, wenn das erste Skript beendet wurde, ist alles richtig.
Mit Zitat antworten
  #18 (permalink)  
Alt 06-08-2007, 01:01
Xadine
 Newbie
Links : Onlinestatus : Xadine ist offline
Registriert seit: Aug 2007
Beiträge: 23
Xadine ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ja passiert erst wenn das erste script zuende ist.

allerdings krieg ich jetzt die kriese

wieso funktioniert die update anweisung nicht?
in xampp als sql befehl eingegeben funktioniert es.
hier aber nicht
PHP-Code:
<?php
session_start
();
require_once(
'datenbankverbindung.php');

$id $_POST['transmit'];
echo(
$id);
echo(
"<br>");    
$sql=db_connect();


$result=$sql->query("START TRANSACTION");

$result=$sql->query("SELECT * FROM angebot WHERE id='$id' FOR UPDATE");


$result=$sql->query("UPDATE angebot SET belegt = 1 WHERE id='$id'");  

echo(
"<br>");    
if(
$result)
echo(
"kein fehler");
else
echo(
"fehler");
$result=$sql->query("COMMIT");


?>
sorry aber ich seh nicht wieso das hier nicht gehen soll,.

Geändert von Xadine (06-08-2007 um 01:04 Uhr)
Mit Zitat antworten
  #19 (permalink)  
Alt 06-08-2007, 01:10
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Bitte gib uns eine vernünftige Fehlerbeschreibung (an dieser Stelle sei die Verwendung von mysql_error() angepriesen) und wenn es notwendig ist eine Erklärung der DB-Klasse.

Ach und erkläre bitte, warum du dir unbedingt durchs Knie in die Brust schießen willst. In deinem Script da oben kannst du alles außer dem UPDATE entfernen und es hat genau den gewünschten Effekt.
Mit Zitat antworten
  #20 (permalink)  
Alt 06-08-2007, 01:35
Xadine
 Newbie
Links : Onlinestatus : Xadine ist offline
Registriert seit: Aug 2007
Beiträge: 23
Xadine ist zur Zeit noch ein unbeschriebenes Blatt
Standard

also hatte es weggelassen damit es übersichtlicher wird.
wenn der eintrag belegt=0 ist dann soll er das update machen. und niemand anderes darf in der zeit lesen das belegt =0 ist weil ja jetzt ein update kommt
wie du siehst ist auch die error funktion direkt danach aufgerufen worden allerdings werden folgende zeile ausgegeben
also

1
nicht belegt

fehler


1 <--- hier die id
nicht belegt <--- belegt=0 also nicht belegt
<--- echo (mysql_error());
fehler <--- result ist nicht true


PHP-Code:
<?php
session_start
();
require_once(
'datenbankverbindung.php');

$id $_POST['transmit'];
echo(
$id);
echo(
"<br>");    
$sql=db_connect();


$result=$sql->query("START TRANSACTION");

$result=$sql->query("SELECT * FROM angebot WHERE id='$id' FOR UPDATE");

$angebot=$result->fetch_assoc();
if(
$angebot['belegt']==1)
    echo(
"belegt");
else{
echo(
"nicht belegt");
$result=$sql->query("UPDATE angebot SET belegt = 1 WHERE id='$id'"); 
echo (
mysql_error());
}
echo(
"<br>");    
 

echo(
"<br>");    
if(
$result)
echo(
"kein fehler");
else
echo(
"fehler");
$result=$sql->query("COMMIT");


?>
und so sieht die require_once klasse aus

PHP-Code:
<?php
session_start
();
function 
db_connect()
{
    
$sql = new mysqli("192.168.0.2","root","","dating");
    if (!
$sql)
        throw new 
Exception('Keine Verbindung zum Datenbankserver moeglich');
    else
        return 
$sql;
}
?>
danke für die hilfe um die zeit
xadine

Geändert von Xadine (06-08-2007 um 01:49 Uhr)
Mit Zitat antworten
  #21 (permalink)  
Alt 06-08-2007, 01:56
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Zitat:
Original geschrieben von Xadine
wenn der eintrag belegt=0 ist dann soll er das update machen.
PHP-Code:
$sql->query("UPDATE angebot SET belegt = 1 WHERE id=$id AND belegt=0"); 
if (
$sql->affected_rows == 1)
    echo 
'war frei, ist jetzt belegt';
else
    echo 
'war schon belegt'
Mit Zitat antworten
  #22 (permalink)  
Alt 06-08-2007, 02:14
Xadine
 Newbie
Links : Onlinestatus : Xadine ist offline
Registriert seit: Aug 2007
Beiträge: 23
Xadine ist zur Zeit noch ein unbeschriebenes Blatt
Standard

danke schön, allerdings macht er immernoch kein update.
wenn ich den befehl manuel in xampp eingebe also in php myadmin dann gehts hier aber nicht
ich versuchs morgen nochmal weiter und melde mich dann.

aber sagmal mit dieser abfrage brauche ich die ganzen transaktionen und innoDB nicht?

Geändert von Xadine (06-08-2007 um 02:25 Uhr)
Mit Zitat antworten
  #23 (permalink)  
Alt 06-08-2007, 02:28
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Richtig, brauchst du nicht.

Eine einzelne Query ist immer auch eine Transaktion im Sinne des ACID-Prinzips und das DBMS kümmert sich automatisch um das Locking der Datensätze.
Ich dachte anfangs, dass du im Laufe deiner Transaktion noch irgendwas in PHP machst. Aber dir geht es ja nur darum, dem User mitzuteilen, wie der Zustand vor und nach dem Update ist. Das kann man allein an der Zahl der betroffenen Datensätze feststellen. (Dabei muß id allerdings unique sein.)

Geändert von onemorenerd (06-08-2007 um 02:35 Uhr)
Mit Zitat antworten
  #24 (permalink)  
Alt 06-08-2007, 02:45
Xadine
 Newbie
Links : Onlinestatus : Xadine ist offline
Registriert seit: Aug 2007
Beiträge: 23
Xadine ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ey ich komm nicht ins bett.

also ich mache nichts weiter in php. ich dachte aber es könnte sein das in ner millisekunde zwei selects gemacht werden und zweil querys belegt auf 1 setzen.

trotzdem das update will nicht gehen. hab auch id auf unique, weiss zwar nicht wofür habs aber gemacht. hab auch die table wieder auf myisam gesetzet, oder muss es doch auf innoDB bleiben.

will doch nur ein update jetzt noch hinkriegen )-:
Mit Zitat antworten
  #25 (permalink)  
Alt 06-08-2007, 03:06
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Ist doch nicht so schwer. Hast du phpMyAdmin zu Hand? Dann führe darin mal die folgenden Queries nacheinander aus - mit einer existierenden ID selbstverständlich:

Ist der Datensatz mit der ID 1 "frei"?
SELECT * FROM angebot WHERE id=1 AND belegt=0

Ändere ihn auf "belegt".
UPDATE angebot SET belegt=1 WHERE id=1 AND belegt=0

Jetzt sollte der Datensatz mit der ID 1 "belegt" sein.
SELECT * FROM angebot WHERE id=1 AND belegt=1


So, die erste und die letzte Query waren jetzt nur zur Kontrolle. In deinem Script brauchst du sie nicht. Und damit gibt es dann auch keine "millisekunde" zwischen zwei Queries - du hast ja nur noch eine.
Mit Zitat antworten
  #26 (permalink)  
Alt 06-08-2007, 03:23
Xadine
 Newbie
Links : Onlinestatus : Xadine ist offline
Registriert seit: Aug 2007
Beiträge: 23
Xadine ist zur Zeit noch ein unbeschriebenes Blatt
Standard

also die queries gehen in phpmyadmin wunderbar
alle 3

habs mit id =1 gemacht

so jetzt in php

PHP-Code:
session_start();
require_once(
'datenbankverbindung.php');

$id $_POST['transmit'];

$sql=db_connect();



$result=$sql->query("UPDATE angebot SET belegt=1 WHERE id=2 AND belegt=0"); 
alles andere rausgenommen aber in der datenbank tut sich nichts.

woran kann sowas liegen? select queries funktionieren aber dieses update eben nicht. der code ist ja hier schon ziemlich puristisch.

so gehts auch nicht
PHP-Code:
$result=$sql->query("UPDATE angebot SET belegt='1' WHERE id='2' AND belegt='0'"); 
belegt ist tinyint datentyp groesse 4
und id ist index und unique
Mit Zitat antworten
  #27 (permalink)  
Alt 06-08-2007, 04:13
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Die erste Query ist richtig, die zweite nicht. Zahlen sind keine Strings.
Mach mal echo $sql->mysqli_error() nach der Query.
Mit Zitat antworten
  #28 (permalink)  
Alt 06-08-2007, 12:19
Xadine
 Newbie
Links : Onlinestatus : Xadine ist offline
Registriert seit: Aug 2007
Beiträge: 23
Xadine ist zur Zeit noch ein unbeschriebenes Blatt
Standard

jaaaaaaaaaaaaaaaaaaaaaaaa
jaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
jaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

besser als sex (-:

UPDATE command denied to user ''@'Xadine-PC' for table 'angebot'


jaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

et geehtt.

danke schön aber ich musste es so machen
printf("Errormessage: %s\n", mysqli_error($sql));
deine variante ging nicht so ganz.

muss jetzt meine datenbank innoDB sein?
ich verstehs noch nicht ganz.
wenn zwei pcs die scripte gleichzeitig ausführen wird in der datenbank das aber sequentiell abgearbeitet?
obwohl die können ja durch tcpip nur sequentell ankommen die php anfragen oder nicht?
Mit Zitat antworten
  #29 (permalink)  
Alt 06-08-2007, 13:30
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Meine Güte, hör auf mit Halbwissen um dich zu werfen, davon krieg ich Kopfschmerzen. Ob die Verbindung per tcp, socket, oder Brieftaube an die Datenbank geht, ist doch vollkommen egal - genauso wie php absolut nichts mit mysql zutun hat.

Ein Query ist für sich atomar, sowohl in myisam, wie auch in innodb - was du auch innerhalb von 20 Sekunden bei Google hättest heraus finden können.

Geändert von ghostgambler (06-08-2007 um 14:34 Uhr)
Mit Zitat antworten
  #30 (permalink)  
Alt 06-08-2007, 13:45
Xadine
 Newbie
Links : Onlinestatus : Xadine ist offline
Registriert seit: Aug 2007
Beiträge: 23
Xadine ist zur Zeit noch ein unbeschriebenes Blatt
Standard

es ging mir bei tcp darum dass man nicht gleichzeitig 2 anfragen kriegen kann. was aber nicht bedeutet das die anfragen wenn die anfragen nicht atomar sind gleichzeitig abgearbeitet werden können durch einen "switch" in sql zb., wie wenn ein betriebssystem zwischen zwei prozessen schaltet.
wenns überhaupt so ein anfragewechsel in sql gibt, keine ahnung.

php, ist klar, bietet nur ne schnittstelle zur datenbank
.

was ich gesucht habe war ähnliches wie dieses hier

Die Tabellensperrung gestattet mehreren Threads das Lesen aus der Tabelle zur selben Zeit; will ein Thread hingegen in eine Tabelle schreiben, so muss er zunächst exklusiven Zugriff erhalten. Alle anderen Threads, die auf die betreffende Tabelle zugreifen wollen, müssen warten, bis das Update abgeschlossen ist.

wollte nur ne zeile sperren und das dann auch richtig machen
egal,
danke für deine hilfe

Geändert von Xadine (06-08-2007 um 14:04 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 04:45 Uhr.