PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   MySQLi/PDO/(MySQL) (http://www.selfphp.de/forum/forumdisplay.php?f=22)
-   -   Typische Fehlerquellen im SQL - bitte VOR dem Posten lesen! (http://www.selfphp.de/forum/showthread.php?t=8195)

feuervogel 18.07.2004 18:43:32

Typische Fehlerquellen im SQL - bitte VOR dem Posten lesen!
 
Da ich in diesem Forum immer wieder ein paar typische Fehler beobachtet habe, hier mal einige Fehlerquellen, die bitte in Zukunft vor einem neuen Posting zu beachten und außzuschließen sind:

1. Bitte Werte/Variablen mit Hochkommata umschließen, so lange der spalten-typ kein int ist, also

"SELECT feld FROM tabelle WHERE id = $id AND name = 'Kurt'" //$id ist dem fall z.b. 52342365

Ist ein Wert ein Array-Element, kommen innerhalb der Hochkommata (hochkommata nur wenn spalten-typ nicht int) um das Elemtent geschwungene Klammern:

"SELECT feld FROM tabelle WHERE id = {$userdata[ 'id' ]}"

Wird eine Variable/Methode aus einer KLasse benutzt, so hat das wie folgt auszusehen:

"SELECT " . $db->feldname . " FROM tabelle WHERE id = " . $user->getId();

2. Es gibt reservierte Wörter, wie z.b. DATE. Das sind Funktionen in sql. Diese Namen dürfen zwar als Spaltennamen verwendet werden, sollten jedoch - um die Verwechslung auszuschließen - von Backticks umgeben sein. Dieses Zeichen findet ihr in der Regel neben der Backspace-Taste bei gedrückter Shift-Taste; danach muss noch Space gedrückt werden:

`

z.b.:

"SELECT `timestamp` FROM tabelle"

Sollten Tabellen verknüpft werden, hat das so auszusehen:

"SELECT `time`.`timestamp` , `datetime`.`time` FROM `time` , `datetime`"

Eine Übersicht über alle reservierten Wörter:

http://dev.mysql.com/doc/refman/4.1/...ved-words.html

3. Ich habe auch gesehen, dass einige "Neulinge", wenn der Wert genau einer Zelle ausgelesen wird, erwarten, dass der Inhalt der Zelle direkt der Rückgabewert der sql-Abfrage ist. Dem ist nicht so.

PHP-Code:

$sql "SELECT feldname FROM tabelle WHERE id = 3";
$qry mysql_query$sql ); 

nun gibt

echo $qry;

nicht den Inhalt der Zelle feldname in der Zeile wo id = 3 ist aus.

es muss auch hier so aussehen:
PHP-Code:

$sql "SELECT feldname FROM tabelle WHERE id = 3";
$qry mysql_query$sql );

$result mysql_fetch_array$qry );
echo 
$result'feldname' ]; 

4. arrays lassen sich nicht so ohne weiteres in zellen speichern.
man muss sie vorher mit serialize() in einen string umwandeln. nach dem auslesen wieder mit unserialize() in ein array verwandeln. dies gilt übrigens auch für das speichern von arrays in cookies.

5. ich zitiere mal c4:

Zitat:

Mit Version 4.1 wurde in PHP ein neues Sicherheitskonzept eingeführt, welches seit Version 4.2 standardmäßig aktiviert ist. Seit dem muss man alle übergebenen Variablen mit
$_GET['variable'] - für Urlparameter
$_POST['variable'] - für mit method=post versendete Parameter
$_COOKIE['variable'] - für Cookies
$_REQUEST['variable'] - $_POST, $_GET und $_COOKIE zusammen
$_FILES['variable'] - für hochgeladene Dateien
$_SERVER['variable'] - für Servervariablen (z.B. $_SERVER['PHP_SELF'])
$_ENV['variable'] - für Umgebungsvariablen
ansprechen. Also ehemals $str mit $_GET['str']
Oder Du setzt in der php.ini register_globals auf on. Davon rate ich aber ab.
6. Bitte überprüft eure SQL-Statements auch _immer_ auf Tippfehler!

7. Wenn ihr etwas postet, was fehlerhaft ist, dann auch bitte den dazugehörigen MySQL-Error; den bekommt ihr wie folgt heraus:

PHP-Code:

$sql "SELECT bla FROM blubb WHERE blipp";
$qry mysql_query$sql ) or die( mysql_error() ); 

Falls nun die SQL-Abfrage fehlerhaft sein sollte, wird euch die zugehörige errormessage ganz von alleine ausgegeben.

8. Falls ihr obenstehendes beachtet habt, gebt euch euer SQL-Statement via echo aus und schaut, ob alles so aussieht, wie ihr es euch vorgestellt habt.

========================================
Ich kleb das mal als sticky fest, wenn jemandem noch was einfällt, bitte hier hin posten.

c4 20.07.2004 15:04:29

Zitat:

1. Bitte alle Werte/Variablen mit Hochkommata umschließen, also

"SELECT feld FROM tabelle WHERE id = '$id' AND name = 'Kurt'"
Seit wann quoted man Zahlen...

meikel (†) 29.09.2004 23:43:07

Zitat:

Original geschrieben von _c_4_
Seit wann quoted man Zahlen...
Seitdem MySQL ein automatisches typecasting beherrscht.

c4 30.09.2004 08:54:34

Wie widerlich.

Gamerfun 27.01.2006 17:26:12

AW: Typische Fehlerquellen im SQL - bitte VOR dem Posten lesen!
 
PHP-Code:

$sql "SELECT feldname FROM tabelle WHERE id = 3";
$qry mysql_query$sql );

$result mysql_fetch_array$qry );
echo 
$result'feldname' ]; 

Müsste es nicht so sein:

PHP-Code:

$sql "SELECT feldname FROM tabelle WHERE id = 3";
$qry mysql_db_query$datenbank,$sql );

$result mysql_fetch_array$qry );
echo 
$result'feldname' ]; 

Bitte korigiert mich falls es falsch ist, ich weiss es so :D

feuervogel 27.01.2006 17:49:59

AW: Typische Fehlerquellen im SQL - bitte VOR dem Posten lesen!
 
wieso sollte deins falsch sein wenn es so funktioniert? warum sollte meins falsch sein, nur weil es auch nen anderen weg gibt das gleiche zu erledigen?

beides ist richtig, denke ich.

meikel (†) 27.01.2006 18:12:18

AW: Typische Fehlerquellen im SQL - bitte VOR dem Posten lesen!
 
Zitat:

Zitat von Gamerfun
Müsste es nicht so sein:

Nein.
Zitat:

Zitat von Gamerfun
$qry = mysql_db_query( $datenbank,$sql );

Zitat:

Zitat von Handbuch
Anmerkung: Diese Funktion ist seit PHP 4.0.6 veraltet. Verwenden Sie diese Funktion nicht. Stattdessen sollten Sie die Funktionen mysql_select_db() und mysql_query() verwenden.


Gamerfun 27.01.2006 18:18:19

AW: Typische Fehlerquellen im SQL - bitte VOR dem Posten lesen!
 
Achso, also benutze ich ne alte Version, schnell umsteigen :D


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:48:53 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.