
88871
09.09.2010, aktualisiert am 12.10.2010
UPDATE in mySQL geht nicht
möchte eine form in meiner mySQL updaten. geht nicht. habe das gleiche script auf einer anderen seite, gleicher webserver. da funktioniert es. irgendwo hat es noch einen "hund" drin.
Guten Morgen liebe Gemeinde.
Ich hoffe nun das hier bei Administrator jemand einen Fehler findet. Komatas etc habe ich alle 100x geprüft..... Laut Fehlermeldung kann es das aber auch nicht sein. Ich denke ich habe etwas logisches vergessen, nur was !
Ich habe PHP 4.3 installiert. Nein, kein Upgrade möglich
Ich habe eine Seite wo ich Rechte anhand der Checkboxen vergebe. Beim "UPDATE"n der db bekomme ich folgende Fehlermeldung:
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 '' at line 5
Und mit Line5 meint er den Eintrag in die db wo er die daten mit der ID zustellt...
Und hier das Script:
Laut Fehlermeldung (Andere mySQL Version....?? - Auf einer anderen Seite, derselbe Server funktionierts einwandfrei..)
was stimmt hier nicht :--) help, help !
Guten Morgen liebe Gemeinde.
Ich hoffe nun das hier bei Administrator jemand einen Fehler findet. Komatas etc habe ich alle 100x geprüft..... Laut Fehlermeldung kann es das aber auch nicht sein. Ich denke ich habe etwas logisches vergessen, nur was !
Ich habe PHP 4.3 installiert. Nein, kein Upgrade möglich
Ich habe eine Seite wo ich Rechte anhand der Checkboxen vergebe. Beim "UPDATE"n der db bekomme ich folgende Fehlermeldung:
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 '' at line 5
Und mit Line5 meint er den Eintrag in die db wo er die daten mit der ID zustellt...
<?php
attr_liefer='$_POST[attr_liefer]' WHERE id = $_POST[id]";
?>
Und hier das Script:
<?php
include "../dbcon.php";
include "auth.php";
include "navigation.php";
include "../functions.php";
session_start();
$submit = $_POST['submit'];
echo "Folgende Daten sind vorhanden<br><br>";
// formulardaten mit strip_tags = html & php ignorieren
$vorname = strip_tags($_POST['vorname']);
$nachname = strip_tags($_POST['nachname']);
$attr_prim = strip_tags($_POST['attr_prim']);
$attr_add = strip_tags($_POST['attr_add']);
$attr_liefer = strip_tags($_POST['attr_liefer']);
$attr_admin = strip_tags($_POST['attr_admin']);
if(isset($_POST['submit']))
{
$update = "UPDATE db SET
attr_admin='$_POST[attr_admin]',
attr_prim='$_POST[attr_prim]',
attr_add='$_POST[attr_add]',
attr_liefer='$_POST[attr_liefer]' WHERE id = $_POST[id]";
mysql_query($update) or die(mysql_error());
echo "Erfolgreich gespeichert<br><br>Bitte warten...<meta http-equiv='refresh' content='2;url=xxxxxx.php'>";
die();
}
if(!isset($_POST['submit']))
// holt sich mit * alle daten aus der table temporär
$result = mysql_query("SELECT * FROM db WHERE infocode='$infocode' ORDER BY id ASC") or die(mysql_error());
// speichert die geholten daten in die variable $row
while($row = mysql_fetch_array($result))
{
?>
<form method="post" action="<?php echo $SERVER['PHP_SELF']; ?>">
<table width="800" border="0" bgcolor="#BBBBBB" cellspacing="1" cellpadding="2">
<tr>
<td width="200" bgcolor="#F4F4F4"><b><?php echo $row['vorname']; ?> <?php echo $row['nachname']; ?></b></td>
<td bgcolor="#F4F4F4"><input type="radio" name="attr_prim" value="ON" <? echo(is_checked($row[attr_prim]=='ON')); ?>>Schön ist die Welt</td>
<td bgcolor="#F4F4F4"><input type="checkbox" name="attr_add" value="ON" <? echo(is_checked($row[attr_addt]=='ON')); ?>>Da hast Du recht</td>
<td bgcolor="#DDDDDD"><input type="radio" name="attr_liefer" value="ON" <? echo(is_checked($row[attr_liefer]=='ON')); ?>>Halleluja</td>
<td bgcolor="#D6A04B"><input type="checkbox" name="attr_admin" value="ON" <? echo(is_checked($row[attr_admin]=='ON')); ?>>Joe</td>
</tr>
</table>
<br>
<?php
} #schluss der abfragen schleife
?>
<br><br>
<input type='hidden' name='id' value='<?php echo $_GET['id']; ?>' /><input type='button' value='Zurück' onClick='history.back()'> <input type="reset"> <input type="submit" name="submit" value="Speichern">
</form>
Laut Fehlermeldung (Andere mySQL Version....?? - Auf einer anderen Seite, derselbe Server funktionierts einwandfrei..)
was stimmt hier nicht :--) help, help !
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 150706
Url: https://administrator.de/forum/update-in-mysql-geht-nicht-150706.html
Ausgedruckt am: 10.04.2025 um 15:04 Uhr
32 Kommentare
Neuester Kommentar
Moin.
darf ich noch ne Anmerkung zum Code machen? Die Seite ist anfällig für SQL Injection Angriffe: http://de.wikipedia.org/wiki/SQL-Injection
1. Du schmeisst zwar php & html aus den $_POST's benutzt dann aber trotzdem die $_POST Variable im Update:
2. strip_tags schützt dich zwar davor das htmlcode den der Benutzer eingeben hat in der DB und dann wieder auf der Webseite landet, aber vor SQL Injection schützt das nicht. Du möchtest $_POST zusätzlich mit mysql_real_escape_string bearbeiten, siehe http://php.net/manual/de/function.mysql-real-escape-string.php
lg,
Slainte
/EDIT: Tippfehler beseitigt
darf ich noch ne Anmerkung zum Code machen? Die Seite ist anfällig für SQL Injection Angriffe: http://de.wikipedia.org/wiki/SQL-Injection
1. Du schmeisst zwar php & html aus den $_POST's benutzt dann aber trotzdem die $_POST Variable im Update:
$update = "UPDATE db SET
attr_admin='$_POST[attr_admin]',
[...}
2. strip_tags schützt dich zwar davor das htmlcode den der Benutzer eingeben hat in der DB und dann wieder auf der Webseite landet, aber vor SQL Injection schützt das nicht. Du möchtest $_POST zusätzlich mit mysql_real_escape_string bearbeiten, siehe http://php.net/manual/de/function.mysql-real-escape-string.php
lg,
Slainte
/EDIT: Tippfehler beseitigt
PS: wäre mir lieber du findest den FEHLER
Wird denn id korrekt per GET übergeben? Was steht im der HTML Quelle. wenn die Seite angezeigt wird (Zeile 61) ?
btw. die korrekte Schreibweise ist
$_POST['id')
ohne die ' erzeugt das zumindest eine NOTICE, oder einen falschen Wert, falls id als Konstante benutzt wird
Tipp: immer mit E_STRICT oder E_ALL entwickeln
[...] nicht während des codens schon eingebaut, lauter faulheit
Ich hab schon sooo viele PHP Seiten in Produktiv-Systemen gesehen, die "eingentlich nur zum debugen" waren
ok, langsam wird ein schuh draus ^^
Die Checkboxen müssen "attr_prim[<id>]" benannt werden.
dann wird das als Array übergeben.
Einlesen kannst Du das dann in etwa so
Die Checkboxen müssen "attr_prim[<id>]" benannt werden.
.... name="attr_prim[' <? echo $row["id"] ?> ']" ....
Einlesen kannst Du das dann in etwa so
$attr_prim=$_POST["attr_prim"];
foreach($attr_prim as $id => $value) {
$update.. usw
}
Hallo,
also wenn du dein Script ohne den nötigen GetParameter aufrust ( index.php?id=12 ) dann wird in deinem Hiddenfield auch nichts stehen...
In deiner Form method ist die action falsch dort sollte $_SERVER stehen, weiters hast du eine Klammer vergessen für das If bei
!isset($_POST[submit])
Das wäre mal so was mir aufgefallen ist ich würd mal schwer an den Basics arbeiten und nicht nur irgendwelches zeug zusammenkopieren ...
also wenn du dein Script ohne den nötigen GetParameter aufrust ( index.php?id=12 ) dann wird in deinem Hiddenfield auch nichts stehen...
In deiner Form method ist die action falsch dort sollte $_SERVER stehen, weiters hast du eine Klammer vergessen für das If bei
!isset($_POST[submit])
Das wäre mal so was mir aufgefallen ist ich würd mal schwer an den Basics arbeiten und nicht nur irgendwelches zeug zusammenkopieren ...
Ist ein wenig komisch konstruiert der foreach.
Damit dürfte es verständlicher sein.
Aber ncoh ein ansatz für deinen Query:
$attr['one'] = "first";
$attr['two'] = "second";
foreach($attr as $id => $value) {
echo "Key/ID: ".id" Value: ".$value;
}
Ausgabe:
Key/ID: one Value: first
Key/ID: two Value: second
Damit dürfte es verständlicher sein.
Aber ncoh ein ansatz für deinen Query:
string attribs = "";
foreach($attr_prim as $id => $value) {
$attribs .= $id."='".$value."'",";
}
$atrribs = substr(0,strlen($attribs) - 1;
$query = "UPDATE blub SET ".$attribs." WHERE ID=".$id;
mysql_query($query);
Moin,
@godlie:
Nein so klappt das nicht.
Er bekommt aus dem Form ein mehrere Arrays über $_POST die in etwa so aussehen:
Der Key der Arrays ist jeweils die ID des Datensatzes der upgedatet werden soll.
(Pseudo Code)
Dabei wird davon ausgegangen, das für jeden key in jedem array ein element vorhanden ist.
lg,
Slainte
@godlie:
Aber ncoh ein ansatz für deinen Query:
[...]Nein so klappt das nicht.
Er bekommt aus dem Form ein mehrere Arrays über $_POST die in etwa so aussehen:
attr_prim {
=> "wert1"
[1] => "wert2"
[2] => "wert3"
}
attr_test {
=> "wert1"
[1] => "wert2"
[2] => "wert3"
}
Der Key der Arrays ist jeweils die ID des Datensatzes der upgedatet werden soll.
(Pseudo Code)
foreach(i = keys(attr_prim)) {
UPDATE blubb SET attr_prim=<attr_prim[i]>, attr_test=<attr_test[i]> WHERE id=<i>
}
Dabei wird davon ausgegangen, das für jeden key in jedem array ein element vorhanden ist.
lg,
Slainte
Hi dark3zz,
bist du dir hier . . .
. . . sicher, dass es nichts nutzt bzw. nicht funktioniert ??
Ich denke mal, das funkt. sehr wohl!!
Die Schreibweise . . . value='<?php echo $_GET['id']; ?>' . . . läßt darauf schließen, das du die Datensätze via Link
aufrufst.
Ein Grund, warum es nicht funktionieren könnte wäre, dass man aus Gründen der Lesbarkeit gerne Leerzeichen zwischen
Operanden und Operatoren läßt, z.B.: erg = a + b. Wenn du das bei Links machst: . . . datei.php?id = 1, wird das Leerzeichen
mit übertragen und PHP interpretiert die Variable als Zeichenkette, wobei letzteres zwar nur eine Vermutung von mir ist, aber
so geht es tatsächlich nicht, die ID wird nicht korrekt übertragen.
Anbei mal ein altes Script, das ich ein bißchen "umgefrickelt" habe:
Gruß
Günni
bist du dir hier . . .
das hidden field hab ich nun auch weggelassen. stimmt, jetzt wo dus sagst: ich brauch das gar nicht weils nichts nutzt
. . . sicher, dass es nichts nutzt bzw. nicht funktioniert ??
Ich denke mal, das funkt. sehr wohl!!
Die Schreibweise . . . value='<?php echo $_GET['id']; ?>' . . . läßt darauf schließen, das du die Datensätze via Link
aufrufst.
Ein Grund, warum es nicht funktionieren könnte wäre, dass man aus Gründen der Lesbarkeit gerne Leerzeichen zwischen
Operanden und Operatoren läßt, z.B.: erg = a + b. Wenn du das bei Links machst: . . . datei.php?id = 1, wird das Leerzeichen
mit übertragen und PHP interpretiert die Variable als Zeichenkette, wobei letzteres zwar nur eine Vermutung von mir ist, aber
so geht es tatsächlich nicht, die ID wird nicht korrekt übertragen.
Anbei mal ein altes Script, das ich ein bißchen "umgefrickelt" habe:
<?php
/*
* Formular wurde gesendet ? *************************************************************************
*/
if(isset($_POST['cmd'])){
/*
* Update ausführen. Wenn eine Checkbox gesendet wurde(heißt, im Formular wurde das "Häkchen" gesetzt),
* bekommen die Variablen die Zeichenkette "checked" zugewiesen, ansonsten nichts.
*/
$attr_a = isset($_POST['attr_a']) ? "checked" : "";
$attr_b = isset($_POST['attr_b']) ? "checked" : "";
$attr_c = isset($_POST['attr_c']) ? "checked" : "";
$attr_d = isset($_POST['attr_d']) ? "checked" : "";
/*
* user_id ist das Hidden-Textfeld im Formular
*/
$user_id = $_POST['user_id'];
$query="update tabelle6 set attr_a='$attr_a',attr_b='$attr_b',attr_c='$attr_c',attr_d='$attr_d' where id=$user_id";
mysql_query($query);
/*
* Die Seite ohne Parameter aufrufen, um GET- und POST-Daten zu löschen
*/
header("location:edit-user2.php");
}
/*
* ***************************************************************************************************
*/
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Update mit Checkboxen</title>
</head>
<body>
<?php
/*
* ***************** Tabelle abfragen und die Einträge als Link anzeigen ***************************
* Die ID des Datensatzes wird als Parameter an die URL angehangen und im Formular in einem
* Hidden-Textfeld gespeichert.
*/
$query="select * from tabelle6";
$result=mysql_query($query);
while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
echo "<a href=\"edit-user2.php?id=$row[id]\">$row[nachname], $row[vorname]</a><br>";
}
/*
* *************************************************************************************************
* Link angeklickt ? *******************************************************************************
* Datensatz mit der entspr. ID abfragen($_GET['id']) und im Formular ausgeben.
*/
if(isset($_GET['id'])){
$id=$_GET['id'];
$user="select * from tabelle6 where id=$id";
$result_user=mysql_query($user);
$row=mysql_fetch_array($result_user,MYSQL_ASSOC);
?>
<form action="" method="post">
<input type="text" name="vorname" value="<?php echo $row['vorname'];?>"/><br>
<input type="text" name="nachname" value="<?php echo $row['nachname'];?>"/><br>
<input type="checkbox" name="attr_a" value="checked" <?php echo $row['attr_a'];?>/> attr_a<br>
<input type="checkbox" name="attr_b" value="checked" <?php echo $row['attr_b'];?>/> attr_b<br>
<input type="checkbox" name="attr_c" value="checked" <?php echo $row['attr_c'];?>/> attr_c<br>
<input type="checkbox" name="attr_d" value="checked" <?php echo $row['attr_d'];?>/> attr_d<br>
<input type="hidden" value="<?php echo $id;?>" name="user_id"/>
<input type="submit" name="cmd" value="Edit"/>
</form>
<?php
}
?>
</body>
</html>
Gruß
Günni