Thema: Fehler im Update-Skript
-
31. 01. 2012, 17:09 #1Mitglied
- Registriert seit
- Jan 2008
- Beiträge
- 187
Fehler im Update-Skript
Hallo!
Ich habe ein Script zusammengebastelt welches nicht so ganz möchte, wie ich will.
Zwar habe ich es zwar schon geschafft das es funktioniert, allerdings habe ich es nicht zusammenbekommen eval, eine True oder False Meldung herauszulocken. Je nachdem ob die Übertragung funktioniert oder nicht funktioniert hat.
Deshalb habe ich das Script soweit nochmals umgeschrieben damit diese Meldung schon im Script vorhanden ist.
Leider funktioniert dies aber jetzt nicht mehr.
Da ich nicht mehr weiter weiss, hoffe ich das mir hier jemand weiter helfen kann, weshalb ich gerne beide Varianten reinstellen würde und hoffe das mir jemand bei einer von beiden helfen kann.
Variante 1:
( Funktioniert aber die Abfrage True od. False bekomme ich nicht hin. Kommt entweder nur True oder False, egal ob's funktioniert oder nicht. )
Variante 2: ( Funktioniert überhaupt nicht. Bekomme diesbezüglich immer folgende Fehlermeldung: Error:PHP-Code:<?php
$tbl = "member"; // Auswählen welche Tabelle Aktualisiert werden soll z.B.: user.
$field = "nickname|password|hash|email"; // Welche Felder sollen aktualisiert werden. Beachte diese mit | zu trennen. z.B.: Id | Name | Strasse | PLZ usw.
$entry = "name|pass|md5|blubb@blubb.at"; // Die neuen zu aktualisierenden Daten, werden hier eingetragen. Wie oben mit | zu trennen. z.B.: 2 | Max | Musterstrasse | 8520 usw.
$where = "memberID"; // WHERE-Klausel! Welches Feld soll überprüft werden. z.B.: --> Userid <-- Wenn leer gelassen wird die Where-Klausel weck gelassen.
$udata = "2"; // Eintrag zur where Klausel. auf oben bezogen z.B.: userid --> 2 <-- Wenn where-Klausel leer gelassen findet dieses keine Beachtung.
$text = ""; // Nummer des Textes welcher bei True oder False ausgegeben werden soll. (Nur in Verbindung mit weiterer Funktion sinnvoll. )
function start ($tbl, $field, $entry, $where, $udata, $text)
{
$verbindung = mysql_connect ("localhost", "root", "") or die ("keine Verbindung möglich. Benutzername oder Passwort sind falsch");
mysql_select_db("blubb") or die ("Die Datenbank existiert nicht.");
$tbl = mysql_real_escape_string ($tbl);
$where = mysql_real_escape_string ($where);
$udata = mysql_real_escape_string ($udata);
$text = mysql_real_escape_string ($text);
$field = explode("|", $field);
$entry = explode("|", $entry);
$step1 = "mysql_query(\"UPDATE $tbl SET ";
$step2 = "";
for($i=0; $i < count($field) AND $i < count($entry) ; $i++)
{
if (next($field) != false)
{
$step2 .= "$field[$i] = '$entry[$i]',";
}
else
{
$step2 .= "$field[$i] = '$entry[$i]'";
}
}
IF ($where != "") { $step3 = " WHERE $where = '$udata'\");"; }
else { $step3 = "\");"; }
$update = $step1.$step2.$step3;
eval($update);
IF (eval($update) == TRUE){ print"Erfolg"; } else { print"Kein Erfolg"; }
}
start ($tbl, $field, $entry, $where, $udata, $text);
?>
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"UPDATE member SET nickname = 'name', password = 'pass', hash = 'md5', email' at line 1 )
Ich hoffe jemand weiss Rat.PHP-Code:<?php
$tbl = "member"; // Auswählen welche Tabelle Aktualisiert werden soll z.B.: user.
$field = "nickname|password|hash|email"; // Welche Felder sollen aktualisiert werden. Beachte diese mit | zu trennen. z.B.: Id | Name | Strasse | PLZ usw.
$entry = "name|pass|md5|blubb@blubb.at"; // Die neuen zu aktualisierenden Daten, werden hier eingetragen. Wie oben mit | zu trennen. z.B.: 2 | Max | Musterstrasse | 8520 usw.
$where = "memberID"; // WHERE-Klausel! Welches Feld soll überprüft werden. z.B.: --> Userid <-- Wenn leer gelassen wird die Where-Klausel weck gelassen.
$udata = "2"; // Eintrag zur where Klausel. auf oben bezogen z.B.: userid --> 2 <-- Wenn where-Klausel leer gelassen findet dieses keine Beachtung.
$text = ""; // Nummer des Textes welcher bei True oder False ausgegeben werden soll. (Nur in Verbindung mit weiterer Funktion sinnvoll. )
function start ($tbl, $field, $entry, $where, $udata, $text)
{
$verbindung = mysql_connect ("localhost", "root", "") or die ("keine Verbindung möglich. Benutzername oder Passwort sind falsch");
mysql_select_db("blubb") or die ("Die Datenbank existiert nicht.");
$tbl = mysql_real_escape_string ($tbl);
$where = mysql_real_escape_string ($where);
$udata = mysql_real_escape_string ($udata);
$text = mysql_real_escape_string ($text);
$field = explode("|", $field);
$entry = explode("|", $entry);
$step1 = "\"UPDATE $tbl SET ";
$step2 = "";
for($i=0; $i < count($field) AND $i < count($entry) ; $i++)
{
if (next($field) != false)
{
$step2 .= " $field[$i] = '$entry[$i]', ";
}
else
{
$step2 .= " $field[$i] = '$entry[$i]' ";
}
}
IF ($where != "") { $step3 = " WHERE $where = '$udata' \"; "; }
else { $step3 = " \"; "; }
$resume = $step1.$step2.$step3;
$step4 = mysql_query($resume) OR die("Error: $step4 <br />".mysql_error());;
IF ($step4 == TRUE){ print"Erfolg"; } else { print"Kein Erfolg"; }
eval($step4);
}
start ($tbl, $field, $entry, $where, $udata, $text);
?>
Vielen dank im vorraus
Patrick
-
31. 01. 2012, 17:39 #2Mitglied
- Registriert seit
- Jun 2009
- Ort
- Im Forum
- Beiträge
- 530
Re: Fehler im Update-Skript
Bei deiner Zweiten Variante gibst du einen fehlerhaften Query ab. 'email' ist nicht vollständig in Hochkommata.
Zudem, wenn du dein Query nicht innerhalb von eval() ausführen möchtest, benötigst du keine Anführungszeichen...
Zudem machst du das Script nur performanceschwacher, indem du alle Teile der Query erst in verschiedene Variablen schreibst, die du dann am Ende zusammensetzt.
Du kannst alle sofort an $resume anhängen.
Das ergibt für mich keinen Sinn...PHP-Code:/* ... */
$step4 = mysql_query($resume) OR die("Error: $step4 <br />".mysql_error());;
IF ($step4 == TRUE){ print"Erfolg"; } else { print"Kein Erfolg"; }
eval($step4);
}
Sinnvoller wäre (für mich)
PHP-Code:$step4 = mysql_query($resume) OR die("Error: ".mysql_error()); /* $step4 macht im die() keinen Sinn, außerdem steht am Ende ein doppeltes Simikolon... */
IF ($step4 == TRUE){ print"Erfolg"; } else { print "Kein Erfolg <br />".$step4; }
/* was wolltest du hier mit eval()? Da gibts nichts auszuführen... */
}
-
31. 01. 2012, 18:06 #3Mitglied
(Threadstarter)
- Registriert seit
- Jan 2008
- Beiträge
- 187
Re: Fehler im Update-Skript
Hallo!
Erstmal Danke.
Doch ich sehe nicht wo der query email nicht in Hochkomata stehen soll.
Die werden ja alle in der Schleife zusammgebastelt, welche bei beiden Varianten ja vollständig identisch sind.
Siehst du da eventuell den Fehler oder ging das für dich nur aus der Fehlermeldung hervor?
Ich kann diesen nämlich per tu nicht finden.
Eventuell weisst du ja wie ich bei Version 1 eval herauslocken kann ob der Code, der ausgeführt wird, true or False ist. Sprich hat die Änderung funktioniert oder nicht.
LG und Danke
Patrick
-
31. 01. 2012, 19:29 #4Mitglied
- Registriert seit
- Jun 2009
- Ort
- Im Forum
- Beiträge
- 530
Re: Fehler im Update-Skript
Den Zusammensetzteil habe ich mir nicht angesehen. Nur die Fehlermeldung.
Allerdings würde die Verwendung von einer einzigen Variable das (zumindest in meinen Augen) wesentlich übersichtlicher machen.
Dazu ein kleines Beispiel:
Habs jetzt nicht getestet, aber so in etwa geht das...PHP-Code:$code = '\$result = mysql_query("UPDATE Mitarbeiter SET ID=1 WHERE Name=\'Einstein\'");';
eval($code);
if($result) {
echo "Super";
} else {
echo "Mist";
}
-
31. 01. 2012, 20:24 #5
Re: Fehler im Update-Skript
eval würde man nutzen, um als String vorliegenden PHP-Code ausführen zu lassen. Das sollte man wirklich nur dann tun, wenn man genau weiß was man tut, denn darüber kann sonst ggf. ein Nutzer beliebigen Code ausführen lassen, wenn er den String beeinflussen kann. In deinem Fall versuchst du eine MySQL-Abfrage als PHP-Code interpretieren zu lassen. Das kann nicht funktionieren.
Dein zweiter Ansatz ist grundsätzlich korrekt, allerdings ist die Generierung deiner Abfrage etwas seltsam, da steige ich nicht so leicht durch. Falsch ist jedenfalls, mysql_real_escape_string auf (im SQL-Kontext) Nicht-Strings anzuwenden, etwa den Namen der Tabelle oder den WHERE-Bezeichner. Für eine universelle Nutzbarkeit sind Bezeichner in Backticks einzuschließen, also etwaAnsonsten gibt es spätestens bei reservierten Schlüsselwörtern Probleme. Bei den Bezeichnern müsstest du eh ggf. enthaltene Backticks manuell maskieren und dann prüfen, ob die Namen überhaupt existieren.Code:UPDATE `tabellenname` SET ...
Hingegen hast du offenbar für die Substrings aus $entry die Maskierung durch mysql_real_escape_string vergessen.
Falsch ist ebenfalls, den gesamten Abfrage-String mit Anführungszeichen einzuleiten und zu beenden, was du durch die Nutzung von \" innerhalb der String-Begrenzer tust.
Noch ein Tipp: http://de.wiktionary.org/wiki/partout
-


Zitieren

mehr lesen...







Resident Evil 6 erscheint in...
Heute, 15:21 in gulli:news