phpbar.de logo

Mailinglisten-Archive

[php] Re: Hilfe...?

[php] Re: Hilfe...?

Martin Ramsch m.ramsch_(at)_computer.org
Tue, 7 Sep 1999 18:03:44 +0200


Nadja Senoucci schrieb am Dienstag, den  7. September 1999:
> Der Code sieht für mich absolut in Ordnung aus - hier kommt er, so
> gut wie möglich von mir dokumentiert:
> 
> <?php
> 	if(!isset($pos)):
> 		$pos=0;
> 	endif;
> 	mysql_connect(localhost,root);
> 	mysql_select_db(hvz);

Das funktioniert?  Da die Parameter Strings sind, müssen die
eigentlich alle in Anführungszeichen!  Auch wenn's ohne funktioniert,
ist's mit besserer Stil (meines Erachtens).

	mysql_connect('localhost', 'root');
	mysql_select_db('hvz');

>       /* Hier frage ich die Position $pos ab, falls der Anwender bereits
> 	   vorher 10 Einträge gesehen und auf "weiter" gedrückt
> 	   hat. Wenn nicht, wird $pos auf 0 gesetzt. Anschließend wird
> 	   die Datenbank geöffnet. */
> 
> /* Ausgabe der Einträge nach Städten */
> 	
> 		if( $suchart == 1 ):
> 			$anwid=mysql_query("select * from haendler where
> (ort=\"$suchwert\") limit $pos,10");

Kein Fehler, nur ein Tip:
  Wenn Du zum Begrenzen der Strings in MySQL Apostrophe (') verwendest
  - was übrigens eh der allgemeine Standard in SQL ist - kannst Du Dir
  das häßliche Escapen der Anführungszeichen sparen:

  $anwid=mysql_query("select * from haendler where (ort='$suchwert') limit $pos,10");

Aber eine mögliche Fehlerquelle:
  Falls $suchwert selbst Anführungszeichen oder Apostrophe enthalten
  kann, wird's in MySQL einen Parse-Error geben (klar, die sich dann
  ergebende SQL-Anfrage ist dann ja auch defekt).
  Deshalb sollten diese Zeichen in $suchstring escapet werden.
  PHP hat dazu zwei Möglichkeiten:
  - manuell per AddSlashes()
  - automatisch, wenn die PHP-Option magic_quotes-gpc gesetzt ist.
    Dann sind alle über GET, POST oder COOKIES empfangenen Werte schon
    passend escaped.  (Test der Option per get-magic-quotes-gpc.)
  Ich empfehle, magic-quotes-gpc in PHP grundsätzlich auszuschalten
  und Escaping dort, wo man;s braucht, explizit zu machen.  Das spart
  Überraschungen.

Somit meine empfohlene Variante:

  $sql = sprintf("select * from haendler where ort='%s' limit %d,10",
                 AddSlashes($suchwert), $pos);
  $anwid = mysql_query($sql);

Was hier noch fehlt, ist eine Fehlerabfrage, denn mysql_query könnte
ja evtl. auch schiefgehen, wenn z.B. MySQL nicht läuft ...

Als Minimum sollte zumindest sowas wie
  $anwid = mysql_query($sql) or die ("Fehler bei der SQL-Anfrage");
verwendet werden.


> 			if( ( $zeile=mysql_fetch_row($anwid) ) == "" ):
> 				echo('Kein solcher Eintrag vorhanden');
> 			else:
> 				while($zeile=mysql_fetch_row($anwid)):
> 					echo $zeile[1];?> <br> <?
> 					echo $zeile[2];?> <br> <?
> 					echo $zeile[3];?> <br> <?
> 					echo $zeile[4];?>&nbsp;<?
> 					echo $zeile[5];?> <br> <?
> 					echo $zeile[6];?> <br> <?
> 					echo $zeile[7];?> <p> <?
> 				endwhile;
> 			endif;

Probier' mal eine Anfrage, die mehr als nur ein Ergebnis hätte!
Dann müßtest Du sehen, daß der erste Datensatz übersprungen wird,
es ansonsten aber funktioniert ...

Das Problem ist, daß Du mit dem Test
  ( $zeile=mysql_fetch_row($anwid) ) == ""
schon den ersten Datensatz abrufst, ihn aber nirgends ausgibst.
In der while-Schleife wird dann bereits der zweite Datensatz
samt seinen Nachfolgern geholt.

Der bessere Test, ob die Anfrage Ergebnisse ergab, ist:
  if ( mysql_num_rows($anwid) == 0 ):


>  Bitte helft mir - ich bin Euch unendlich dankbar!
> (Frustschieb...)

Kopf hoch, gerade konzeptuelle Fehler wie diesen übersieht man selbst
als Autor am längsten ...

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


php::bar PHP Wiki   -   Listenarchive