Problem mit MYSQL-Insert
am 26.11.2004 08:22:49 von neuber5
Ich habe in einem Programm, an dem ich arbeite, ein Problem mit einer
Insert-Abfrage.
Erzeugt wird sie durch folgenden Code:
$que="insert into rtrans set station=$row[station], ziel=$row[ziel],
";
$que=$que."patient='$row[patient]', zimmer='$row[zimmer]', ";
$que=$que."art=$row[art], rueck=$row[rueck], ";
$que=$que."akte=$row[akte]; ";
$res=mysql_query($que);
$echo("$que");
Es wird aber kein Datensatz eingefügt.
Die Ausgabe, die ich erhalte, sieht so aus:
insert into rtrans set station=6, ziel=39, patient='cde', zimmer='2',
art=1, rueck=1, akte=1;
Wenn ich dieses kopiere und direkt in MYSQL eingebe, fuktioniert es.
Die Abfrage ist also richtig.
Weiss jemand, warum es im Programm nicht funktioniert?
Re: Problem mit MYSQL-Insert
am 26.11.2004 08:34:46 von Christoph Hermann
Berthold Neufer schrieb:
Moin,
> Ich habe in einem Programm, an dem ich arbeite, ein Problem mit einer
> Insert-Abfrage.
> $que="insert into rtrans set station=$row[station], ziel=$row[ziel],
> ";
> $que=$que."patient='$row[patient]', zimmer='$row[zimmer]', ";
Hier kannst du auch folgendes schreiben:
$que .= "patient='$row[patient]', zimmer='$row[zimmer]', ";
^
Beachte den "."
> $que=$que."art=$row[art], rueck=$row[rueck], ";
> $que=$que."akte=$row[akte]; ";
> $res=mysql_query($que);
> $echo("$que");
>
> Es wird aber kein Datensatz eingefügt.
> Die Ausgabe, die ich erhalte, sieht so aus:
>
> insert into rtrans set station=6, ziel=39, patient='cde', zimmer='2',
> art=1, rueck=1, akte=1;
>
> Wenn ich dieses kopiere und direkt in MYSQL eingebe, fuktioniert es.
> Die Abfrage ist also richtig.
*urgs*
Mag sein, dass Mysql sowas akzeptiert, ja.
> Weiss jemand, warum es im Programm nicht funktioniert?
Je, du hast ein ";" zuviel denke ich.
Ansonsten sollte die Query übrigends so lauten:
$sql = "INSERT INTO rtrans (station, ziel, patient, zimmer, art, rueck,
akte) VALUES(6,39,'cde',2,1,1,1)";
?>
HTH
Christoph
Re: Problem mit MYSQL-Insert
am 26.11.2004 08:37:42 von Ulrich Nehls
Berthold Neufer wrote:
> $que="insert into rtrans set station=$row[station], ziel=$row[ziel],
> ";
Versuch mal:
$que="insert into rtrans set station=".$row['station'].", ziel= ...
etc.
Gruss,
UN
Re: Problem mit MYSQL-Insert
am 26.11.2004 08:54:24 von werbung
Ulrich Nehls wrote:
> Berthold Neufer wrote:
>=20
>> $que=3D"insert into rtrans set station=3D$row[station], ziel=3D$row[zi=
el], ";
>=20
> Versuch mal:
>=20
> $que=3D"insert into rtrans set station=3D".$row['station'].", ziel=3D .=
.
>=20
Und was soll das bringen auser mehr schreibarbeit?
nur mal so gefragt
Ren=E9
--=20
Informatiker haben Humor, allerdings lässt sich der nur schwer
im Quelltext ausdrücken. Ausnahme Microsoft: Dort arbeiten die
Kabarettisten der Informatik, die sogar lustigen Quelltext schreiben
können. [Oliver Schad in dclpm=
]
Re: Problem mit MYSQL-Insert
am 26.11.2004 09:49:36 von Daniel Jaenecke
Berthold Neufer wrote:
> $que="insert into rtrans set station=$row[station], ziel=$row[ziel],
> ";
> $que=$que."patient='$row[patient]', zimmer='$row[zimmer]', ";
> $que=$que."art=$row[art], rueck=$row[rueck], ";
> $que=$que."akte=$row[akte]; ";
> $res=mysql_query($que);
> $echo("$que");
>
> Es wird aber kein Datensatz eingefügt.
-snip-
> Weiss jemand, warum es im Programm nicht funktioniert?
Nein, wie auch wenn in Deinem Code jegliche Fehlerbehandlung fehlt? Sieh Dir
mal http://www.php.net/mysql_error an.
Gruß
-dj-
--
1. Man gewoehnt sich an allem, sogar am Dativ.
2. Der Dativ ist dem Genitiv sein Tod.
Re: Problem mit MYSQL-Insert
am 26.11.2004 10:04:49 von Axel Schwenke
neuber5@web.de (Berthold Neufer) wrote:
>
> Es wird aber kein Datensatz eingefügt.
> Die Ausgabe, die ich erhalte, sieht so aus:
>
> insert into rtrans set station=6, ziel=39, patient='cde', zimmer='2',
> art=1, rueck=1, akte=1;
>
> Wenn ich dieses kopiere und direkt in MYSQL eingebe, fuktioniert es.
> Die Abfrage ist also richtig.
Jein.
1. Die von dir verwendete INSERT Syntax ist wohl eine MySQL-Spezialität.
Du solltest INSERT INTO ... (spaltenamen) VALUES (werte) verwenden.
2. Das Semikolon gehört *nicht* zur Query, sondern dient *nur* im mysql
Kommandozeilenclient als "hier ist das Ende der Query" Zeichen.
3. Du machst keine Fehlerbehandlung. Sonst hättest du den Syntaxfehler
am ';' gesehen.
4. Du quotest deine Strings nicht richtig. mysql_escape_string() ist
dein Freund.
XL
Re: Problem mit MYSQL-Insert
am 26.11.2004 17:29:50 von Georg Richter
Berthold Neufer wrote:
> Erzeugt wird sie durch folgenden Code:
>
> $que="insert into rtrans set station=$row[station], ziel=$row[ziel],
> ";
> $que=$que."patient='$row[patient]', zimmer='$row[zimmer]', ";
> $que=$que."art=$row[art], rueck=$row[rueck], ";
> $que=$que."akte=$row[akte]; ";
> $res=mysql_query($que);
> $echo("$que");
Benutzt Du einen Codeobfuscator, oder findest Du diese Art von
Programmierstil lesbar? sprintf ist Dein Freund.
Wieso verwendest Du kein mysql_real_escape um Stringvalues zu escapen?
Imho gibt es Nachnamen, die zwar kein Backslash, aber ein einfaches
Hochkomma enthalten können.
Wieso weist Du $res den Returnwert der Query zu, ohne diesen Wert auf FALSE
zu prüfen um ggf. eine Fehlerhandling durchzuführen? Zudem impliziert der
Name $res, dass es sich um ein Resultset handelt. Resultsets werden nicht
bei DML statements zurückgeliefert.
Wieso verwendest Du ein Semikolon am Ende der Query, wo doch ausdrücklich in
der Dokumentation steht, dass man kein Semikolon oder \g am Ende eines
Statements verwenden soll?
Fragen über Fragen....
/Georg
Re: Problem mit MYSQL-Insert
am 26.11.2004 18:07:19 von werbung
Georg Richter wrote:
> Berthold Neufer wrote:
>=20
>=20
>>Erzeugt wird sie durch folgenden Code:
>>
>>$que=3D"insert into rtrans set station=3D$row[station], ziel=3D$row[zie=
l],
>>";
>>$que=3D$que."patient=3D'$row[patient]', zimmer=3D'$row[zimmer]', ";
>>$que=3D$que."art=3D$row[art], rueck=3D$row[rueck], ";
>>$que=3D$que."akte=3D$row[akte]; ";
>>$res=3Dmysql_query($que);
>>$echo("$que");
>=20
>=20
> Benutzt Du einen Codeobfuscator, oder findest Du diese Art von
> Programmierstil lesbar? sprintf ist Dein Freund.
>=20
Wenn man das etwas umschreibt:
$que=3D"insert into rtrans
set station=3D$row[station], ziel=3D$row[ziel],
patient=3D'$row[patient]', zimmer=3D'$row[zimmer]',
art=3D$row[art], rueck=3D$row[rueck],akte=3D$row[akte]
";
Was ist daran schlecht lesbar?
Aber wenn du magst bleib bei sprintf. ;-)
Nur mal so
Ren=E9
--=20
Informatiker haben Humor, allerdings lässt sich der nur schwer
im Quelltext ausdrücken. Ausnahme Microsoft: Dort arbeiten die
Kabarettisten der Informatik, die sogar lustigen Quelltext schreiben
können. [Oliver Schad in dclpm=
]
Re: Problem mit MYSQL-Insert
am 26.11.2004 18:48:34 von Georg Richter
René Raule wrote:
>
> Was ist daran schlecht lesbar?
> Aber wenn du magst bleib bei sprintf. ;-)
$q = sprintf("INSERT INTO mytable (patient, zimmer, art, rueck, akte) " .
"VALUES ('%s', '%s', %d, %d, %d)",
mysql_real_escape($row["patient"]),
mysql_real_escape($row["zimmer"]),
$row["art"],
$row["rueck"],
$row["akte"]);
a) Hier sehe ich wesentlich einfacher welche Typen verwendet werden, ohne zu
schauen was ist nun einfaches Hochkomma, was ist doppeltes Hochkomma.
b) Der Code ist einfacher portierbar, wenn ich mal nicht mehr PHP benutzen
möchte.
c) Wenn ich auf PHP5 umsteigen will, ist es wesentlich einfacher, den
sprintf konstrukt in prepare und bind_param aufzusplitten.
d) es ist wesentlich einfacher lesbar, da SQL und PHP getrennt sind - auch
für nicht PHP'ler :)
Btw. die vielen Blanks in Deinem obigen Beispiel machen die Ausgabe der
Query e.g. mit echo auch nicht lesbarer :)
/Georg
Re: Problem mit MYSQL-Insert
am 27.11.2004 09:15:26 von werbung
Hallo Georg,
Georg Richter wrote:
>=20
> $q =3D sprintf("INSERT INTO mytable (patient, zimmer, art, rueck, akte)=
" .=20
> "VALUES ('%s', '%s', %d, %d, %d)",=20
> mysql_real_escape($row["patient"]),
> mysql_real_escape($row["zimmer"]),
> $row["art"],
> $row["rueck"],
> $row["akte"]);
>=20
> a) Hier sehe ich wesentlich einfacher welche Typen verwendet werden, oh=
ne zu
> schauen was ist nun einfaches Hochkomma, was ist doppeltes Hochkomma.
OK. Die Frage ist nur ab man das braucht?
> b) Der Code ist einfacher portierbar, wenn ich mal nicht mehr PHP benut=
zen
> möchte.
????? Hups die Taste hängt.
Wieso ist der Code portierbarer und wohin? PHP Code ist PHP Code du must =
allso alles umschreiben wenn du eine andere Sprache benutzen willst.
Da erscheint mir mein Code leichter lesbar und wandelbar aber das ist=20
wohl Ansichtsache. ;-)
> c) Wenn ich auf PHP5 umsteigen will, ist es wesentlich einfacher, den
> sprintf konstrukt in prepare und bind_param aufzusplitten.
Möglich(Zweifel). Was das aber mit PHP5 zu tun hat weis ich nicht?
> d) es ist wesentlich einfacher lesbar, da SQL und PHP getrennt sind - a=
uch
> für nicht PHP'ler :)
>=20
> Btw. die vielen Blanks in Deinem obigen Beispiel machen die Ausgabe der=
> Query e.g. mit echo auch nicht lesbarer :)
Man kann meinen String auch so schreiben:
$que=3D
"INSERT INTO rtrans
(station,ziel,patient,zimmer,art,rueck,akte)
VALUES
($row[station],$row[ziel],'$row[patient]','$row[zimmer]',$ro w[art],
$row[rueck],$row[akte])
";
Wer nicht weiß das Variablen bei PHP mit $ beginnen braucht sich den=20
Code auch nicht ansehen der verstehts es nicht. Wer aber in SQL fit ist=20
erkennt hier im EDITOR! auf einen Blick was Sache ist.
Du hast recht das die Ausgabe mit echo nicht optimal ist :-( (nimm=20
einfach echo nl2br($que)) darum geht es mir in meinem Code nicht :-).=20
Ich möchte im Editor auf einen Blick sehen welches SQL-Statment in der =
Funktion benutzt wird möglichst so wie ich es auch direkt testen würd=
e=20
(z.B. phpMyAdmin). Bei Problemen lasse ich mir von PEAR::DB die Anfrage=20
ausgeben die sieht wieder gut aus :-)
Einen Grund für sprintf gibt es schon :(. Man kann einfacher Funktionen=
=20
auf die Parameter anwenden. Ich müsste die Variablen ändern oder=20
Dummyvariablen einführen.
Schönes Wochenende 8-)
Ren=E9
--=20
Informatiker haben Humor, allerdings lässt sich der nur schwer
im Quelltext ausdrücken. Ausnahme Microsoft: Dort arbeiten die
Kabarettisten der Informatik, die sogar lustigen Quelltext schreiben
können. [Oliver Schad in dclpm=
]