phpbar.de logo

Mailinglisten-Archive

[php] Re: Noch eine dumme Frage von mir...

[php] Re: Noch eine dumme Frage von mir...

Martin Ramsch m.ramsch_(at)_computer.org
Wed, 1 Sep 1999 21:26:14 +0200


Nadja Senoucci schrieb am Mittwoch, den  1. September 1999:
> $anwid=mysql_query("select * from grunz where
> (name="+chr(34)+$suchname+chr(34)+")");
> 
> Hier versuche ich mit ASCII-Code Konvertierung die
> Anführungszeichen zu setzen, die MySQL haben will.

Sieht eigentlich richtig aus ...

> Ich kann keine richtigen Anführungszeichen (sprich: " ") setzten, da
> php sonst die MySQL-Anweisung unterbricht. MySQL erkennt die
> Anführungszeichen aber auf diese weise nicht (,da er den gesuchten
> Namen, der 100%ig in der Tabelle steht nicht finden kann).

Seltsam.  Sind im Suchnamen selbst evtl. Sonderzeichen drin?

Sonderzeichen im Rahmen von MySQL sind das einfache (') und doppelte
(") Anführungszeichen (wegen der Quotingregeln), der Backslash (\) und
die Binärnull (Zeichen mit ASCII-Code 0).

Als Textbegrenzer kannst Du in MySQL übrigens beide Anführungszeichen
verwenden, einfache und doppelte (in Standard-SQL nur einfache).

Beschrieben ist das alles im MySQL-Handbuch im Kapitel
"7.1 Literals: how to write strings and numbers".

Unter anderem heißt es: »You should use an escape function on any
string that might contain any of the special characters listed above!«
(also ' " \ und Binärnull).

In PHP gibt's dazu die Funktion AddSlashes()!

Sollte man am besten immer verwenden, wenn man nicht 100%ig sicher
ist, daß der Text 'sicher' (also ohne MySQL-Sonderzeichen ist).

Die Pluszeichen in Deinem Beispiel deuten darauf hin, daß Du noch mit
dem alten PHP/FI2 arbeitest, aber macht nix, dort gab's das auch
schon.  (Ein Unterschied ist aber z.B., daß man in PHP/FI2 Strings
_nur_ mit doppelten Anführungszeichen begrenzen kann, in PHP3 gehen
auch die einfachen.)

Eine hübschere Version sieht dann also so aus:

  $quotedsuchname = AddSlashes($suchname);
  $anwid=mysql_query("SELECT * FROM grunz WHERE name='$quotedsuchname'");

In meinen Augen noch besser wird's mit sprintf:

  $sql = sprintf("SELECT * FROM grunz WHERE name='%s'", AddSlashes($suchname));
  $anwid = mysql_query($sql);

Fans von Einzeilern können ja nochmal zusammenfassen. :)

Was ich nicht beantworten kann, ist, warum Deine Version oben nicht
funktioniert ...  Dazu müßte man evtl. einen Blick auf Dein Suchwort
und auf den konkreten Tabelleninhalt werfen.


> P.S.: Ich bin nicht so dämlich, wie es erscheinen mag!

Ich sag' mir immer, daß zwischen damlich und unwissend/unerfahren ein
ziemlich Unterschied ist und überhaupt:
  And all I know for sure
  All I know for real
  Is knowing doesn't mean so much
  -- Sisters Of Mercy in "Some Kind of Stranger"

:-)

Ciao,
  Martin
-- 
Martin Ramsch <m.ramsch_(at)_computer.org> <URL: http://ramsch.home.pages.de/ >
PGP: 0xE8EF4F75, 52 44 5E F3 B0 B1 38 26  E4 EC 80 58 7B 31 3A D7

  When privacy is outlawed... only the outlaws have privacy.


php::bar PHP Wiki   -   Listenarchive