2009-08-01 32 views
0

im Ärger mit Daten aus zwei separaten Tabellen bekommenAbfrage zwei Tabellen in einer MySQL-Abfrage

Bisher habe ich diese

<? 
include('config.php'); 
$xid = $_GET['xid']; 

$result = mysql_query("SELECT * FROM `config`") or trigger_error(mysql_error()); 
while($row = mysql_fetch_array($result)){ 
foreach($row AS $key => $value) { $row[$key] = stripslashes($value); } 

$result = mysql_query("SELECT * FROM `utinfo` WHERE `xid` = $xid") or trigger_error(mysql_error()); 
while($row2 = mysql_fetch_array($result)){ 
foreach($row2 AS $key => $value) { $row2[$key] = stripslashes($value); } 
$un = urldecode($row2['un']); 
}; 

switch ($row['module']) 
{ 
case 1: 
    echo "Function 1 for user $uid on account $un"; 
    break; 
case 2: 
    echo "Function 2 for user $uid on account $un"; 
    break; 
case 3: 
    echo "Function 3 for user $uid on account $un"; 
    break; 
default: 
    echo "No module defined."; 

}; 
}; 
?> 

Die Konfigurationstabelle Konfigurations die Reihe namens Module hat, und seine bevölkert von 2 Einträge, von denen einer 1 ist, der andere 3. So sollte ich Fall 1 und dann Fall 3 sehen. Aber alles, was ich bekomme, ist das Standard-Echo.

Antwort

0

stripslashes() wird für Strings verwendet. Ihre Fallwerte sind ganze Zahlen. Es sieht so aus, als ob hier ein Typenkonflikt besteht.

0
  1. Warum verwenden Sie nicht PDO? Sie sollten wirklich auf PDO standardisieren, wenn Sie können.
  2. Tabellennamen in SQL-Auswahl sollten nicht zitiert werden.
  3. Sie sollten mit Prepared Statements halten, um zu vermeiden, SQL Injection und dann über Sie müssen keine Angst haben Ihre Paramater
+2

In MySQL können (und manchmal müssen) Tabellennamen in Backticks (die wie Anführungszeichen aussehen) eingeschlossen werden. –

+0

Ah ... cool! Wusste das nicht. – Kitson

0

Die erste Antwort richtig in Bezug auf vermutlich Typ Mismatches zu zitieren, sollten Sie in der Lage sein, um das Problem zu beheben, indem Sie den folgenden Code verwenden:

switch ((integer) $row['module']) 

Siehe folgendes: http://us.php.net/manual/en/language.types.type-juggling.php#language.types.typecasting

Alternativ können Sie dies versuchen:

settype($row['module'], "integer"); 

switch ($row['module']) 

See: http://us.php.net/manual/en/function.settype.php

Ich würde auch vorschlagen, den Wert von $ row echo'ing [ 'Modul'] auf der Seite nur zu prüfen, ob es in der Tat eine ganze Zahl.

2

(Dies ist keine Antwort auf die OP, aber etwas, das Sie sollten über, so glaube wirklich, ich es es wert ist writting)

Es scheint, dass es eine enorme SQL-Injektion ist in Ihrem Code.

Der normale Weg, Ihre Seite aufzurufen, wäre etwas wie "xid=5" in der URL, um Informationen über Benutzer 5 zu erhalten.

Nun nehmen Sie an, jemand gibt "xid=5 or 1=1". Die resultierende Abfrage wäre:

SELECT * FROM `utinfo` WHERE `xid` = 5 or 1=1 

Die Bedingung ist immer wahr; Sie erhalten Informationen über ALLE Benutzer als Ausgabe, während Sie das Resultset durchlaufen.

Eine andere Möglichkeit: "xid=5; delete from utinfo;"; was würde diese Abfrage geben:

SELECT * FROM `utinfo` WHERE `xid` = 5; delete from utinfo; 

Das Tisch :-(


Sie immer was auch immer Sie Daten müssen entkommen/Check/sanitize/bevor setzen sie in einer SQL-Abfrage leeren würde, vor allem (aber nicht nur), wenn sie von einem Benutzer der Anwendung kommen.

Bei Strings finden Sie in die mysql_real_escape_string Funktion.
Für Daten, die ganzen Zahlen sould, könnten Sieverwenden 210 (schlimmsten Fall, wenn die Daten nicht gültig waren, erhalten Sie 0, was möglicherweise kein Ergebnis von der DB, aber zumindest nicht brechen wird ^^)

Eine andere Lösung wäre die Verwendung vorbereitet Aussagen; aber die sind nicht verfügbar mit mysql_* Funktion: Sie entweder

Auf jeden Fall wechseln müssen, für eine neue Anwendung, sollten Sie mysql_* nicht verwenden: es ist alt und erhält keine neuen Funktionen/Verbesserungen, die mysqli und PDO bekommen ...

Verwandte Themen