Problem mit einfügen HILFE!!!
Sap
- datenbank
Hi,
ich hab ein neues Problem und zwar fügt er in die datenbank immer nach dem aktualisieren neue Datensätze obwohl er das net soll.
Im Quellcode hab ich alles nähere beschrieben und auch den fehler erklärt hoffentlich kann mir einer Helfen.
// User Tabelle anlegen
mysql_query("CREATE TABLE IF NOT EXISTS tbluser (
UserID INT(1) NOT NULL auto_increment,
Nname varchar(30) character set latin1 collate latin1_general_ci NOT NULL,
Vname varchar(20) character set latin1 collate latin1_general_ci NOT NULL,
Passwort char(32),
Username char(7),
PRIMARY KEY (UserID))");
// Erfolg Tabelle anlegen in der gespeichert werden soll, wenn die User
Tabelle GEUPDATED wurde
mysql_query("CREATE TABLE IF NOT EXISTS tblerfolg (
ErfolgID INT(1) NOT NULL,
Erfolg INT(1),
PRIMARY KEY (ErfolgID))");
// Hier wird in die Tabelle Erfolg bei der Spalte Erfolg 0 eingetragen,
weil amanfang noch nichts GEUPDATED wurde und somit kein ERFOLG stattfand
mysql_query("INSERT INTO tblerfolg VALUES(1,0)");
// Hier wird geguckt, ob in der Tabelle erfolg eine 0 für nicht GEUPDATED
steht oder eine 1 für GEUPDATED und anschließend der Wert in die
Variable test gespeichert.
$test = 0;
$erfolggucken = mysql_query ("SELECT * FROM tblerfolg");
//$test = mysql_fetch_object($erfolggucken);
while($test = mysql_fetch_object($erfolggucken))
{
echo $test->Erfolg."<br />";
}
// Hier wird geguckt, ob die variable test auf 0 steht für noch nicht
GEUPDATED. Wenn sie auf 1 ist soll sie es nicht machen und wenn es auf 0
steht sol es das nachführende code ausführen.
// --->Hier ist auch der Fehler ich weis net wie ich das beheben kann.
Obohl in der test variable 1 steht nach dem ersten ausführen wir
trotzdem das nachfolgende ausgeführt.WIESO????
if($test->Erfolg == 0 )
{
//Hier wird ein user in die Tabelle user aufgenommen
mysql_query("INSERT INTO tbluser (Nname, Vname) VALUES('Hans', 'Mustermann')");
// Hier wird nachdem in die Tabelle user etwas eingefügt wurde, die tabelle
erfolg GEUPDATED damit sie beim nächsten mal nicht hier wieder rein
kommt, weil der INSERT befehl schon ausgeführt wurde.
mysql_query("UPDATE tblerfolg SET Erfolg = 1");
}
// Hier wird der Username für den User festgelegt, der aus den ersten 3
Buchstaben des Vor und -Nachnamens besteht
// Funktioniert ohne Probleme jetzt.
$sql = "SELECT UserID, concat(left(Nname,3),left(Vname,3)) AS Username
FROM tbluser WHERE Username is NULL;";
$result = mysql_query($sql) OR die ("Fehler bei der SQL Abfrage:<br/ >" . mysql_error());
while($row = mysql_fetch_object($result))
{
$updateSQL = "UPDATE tbluser SET Username='$row->Username', Passwort = 1234 WHERE UserID = $row->UserID";
if(mysql_query($updateSQL))
echo " Success: UserID: $row->UserID | Username: $row->Username <br />";
else
echo "Fehler bei UserID: $row->UserID | Username: $row->Username <br />";
}
MfG
Sapzero
Nach langem Probieren hab ich den Fehler gefunden aber schaff es einfach net zu beheben.
Der Fehler liegt am $test. In der while schleife enthält die variable $test ein Wert, jedoch wenn ich diesen ausserhalb der schleife ausgebe ist sie aufeinmal leer.
<code>
$erfolggucken = mysql_query ("SELECT * FROM tblerfolg");
while($test = mysql_fetch_object($erfolggucken))
{
echo $test->Erfolg."<br />"; // <--------- enthält ein Wert (1)
$test = $test->Erfolg; // <--------- enthält ein Wert (1)
}
echo $test->Erfolg; // <--------- enthält kein Wertmehr ist leer
echo $test; // <--------- enthält kein Wertmehr ist leer
</code>
Kann mir einer sagen wie ich den Wert, den ich noch in der schleife habe weiter ausserhalb der Schleife nenutzen kann??
@@Sap:
while($test = mysql_fetch_object($erfolggucken))
Die while-Schleife wird also wann (bei welchem Wert von $test) abgebrochen?
echo $test->Erfolg; // <--------- enthält kein Wertmehr ist leer
Überrascht dich das?
Kann mir einer sagen wie ich den Wert, den ich noch in der schleife habe weiter ausserhalb der Schleife nenutzen kann??
$test nicht innerhalb der Schleife überschreiben?
Live long and prosper,
Gunnar
<code>
$erfolggucken = mysql_query ("SELECT * FROM tblerfolg");
while($test = mysql_fetch_object($erfolggucken))
{
echo $test->Erfolg."<br />"; // <--------- enthält ein Wert (1)
$test = $test->Erfolg; // <--------- enthält ein Wert (1)
}echo $test->Erfolg; // <--------- enthält kein Wertmehr ist leer
echo $test; // <--------- enthält kein Wertmehr ist leer
</code>
Hi,
was passiert denn wenn Du die Variable $test in der letzten Reihe mal umbenennst, und dann die umbenannte Variable ausgeben lässt? Weiß nicht genau ob es was bringt, aber so wie ich es sehe überschreibst du das Array $test was welches Du in der while initialisierst, innerhalb der Schleife wieder, und ich könnte mir vorstellen das er beim nächsten Schleifendurchlauf versucht $test auszulesen, welches aber nur noch eine variable ist, und dementsprechend kein Index Erfolg enthält.
Hoffe Du verstehst ansatzweise was ich meine.
Gruß
Wizard
echo $begrüßung;
echo $test->Erfolg; // <--------- enthält kein Wertmehr ist leer
echo $test; // <--------- enthält kein Wertmehr ist leer
Leer im PHP-Sinne kann in Wirklichkeit verschiedene Werte sein. Verwende für Kontrollausgaben besser var_dump() statt echo, das informiert genauer. Außerdem empfiehlt es sich immer noch, beim Entwickeln das error_reporting auf E_ALL zu stellen, damit Zugriffe auf nicht Vorhandenes, wie der Eigenschaft Erfolg, wenn $test kein Objekt ist, als Notice-Meldung angezeigt werden.
echo "$verabschiedung $name";
echo $begrüßung;
mysql_query("INSERT INTO tblerfolg VALUES(1,0)");
Es ist besser, die Spaltennamen explizit anzugeben, damit die Werte nicht nur per Zufall sondern gezielt ihre richtigen Felder eingetragen werden. Der Zufallsfall kann dann versagen, wenn du das Tabellenlayout änderst und eins der INSERTS anzupassen vergisst.
while($test = mysql_fetch_object($erfolggucken))
Wenn du nur einen Datensatz abfragen willst, brauchst du dafür keine Schleife. Dann ist auch $test nicht hinterher false, denn das ist das übliche Verhalten von mysql_fetch_object(), wenn man es zum Fetchen schickt aber nichts mehr vorhanden ist.
$sql = "SELECT UserID, concat(left(Nname,3),left(Vname,3)) AS Username
FROM tbluser WHERE Username is NULL;";
$updateSQL = "UPDATE tbluser SET Username='$row->Username', Passwort = 1234 WHERE UserID = $row->UserID";
Da hab ich dir doch neulich schon empfohlen ein Statement draus zu machen. UPDATE kann auch berechnete Werte in die Spalten schreiben. Das DBMS kann die Änderungen in einem Rutsch erledigen und muss nicht viele UPDATE-Statemets einzeln abarbeiten inkusive dem Overhead, sie jeweils zum DBMS zu transportieren.
UPDATE tbluser SET Username = CONCAT(LEFT(Nname, 3), LEFT(Vname, 3)), Passwort = 1234 WHERE Username IS NULL
if(mysql_query($updateSQL))
Jedes SQL-Statement kann schiefgehen, auch wenn es im Labor tausendmal fehlerfrei funktioniert hat. Frag immer den Erfolgsstatus ab und führe die nachfolgenden Schritte nur in Abhängigkeit vom Erfolg des vorhergehenden aus. Ansonsten kommen nur noch mehr (Folge-)Fehler zusammen.
echo "$verabschiedung $name";