2009-08-01 132 views
0

IM表遇到了麻煩來自兩個不同的表查詢兩人在一個MySQL查詢

數據到目前爲止,我有這個

<? 
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."; 

}; 
}; 
?> 

的配置表的配置有行命名的模塊,它由2填充條目,其中一個是1,另外3個。所以我應該看到案例1,然後是案例3.但是,所有即時消息都是默認回顯。

回答

0

stripslashes()用於字符串。你的案例值是整數。看起來你在這裏有一個類型不匹配?

0
  1. 你爲什麼不使用PDO?如果可以的話,您應該確實遵守PDO標準。
  2. SQL select中的表名不應引用。
  3. 您應該考慮使用以避免SQL注入準備好的語句,然後你不必擔心有引用您的PARAMATERS
+2

在MySQL中,你可以(有時需要)在反引號(看起來像引號)括表名。 – 2009-08-01 07:46:27

0

第一個答案是關於類型不匹配可能是正確的,你應該能夠通過使用下面的代碼來解決該問題:

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

請參閱以下內容: http://us.php.net/manual/en/language.types.type-juggling.php#language.types.typecasting

或者,你可以試試這個:

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

switch ($row['module']) 

參見: http://us.php.net/manual/en/function.settype.php

我也建議echo'ing $行[「模塊」]的值到頁面上,只是爲了檢查,這確實是一個整數。

2

(這不是一個問題的任擇議定書的事,但你真正應該關心的,所以我認爲這是值得書面方式吧)

似乎有一個巨大的SQL注入你的代碼。

調用頁面的正常方法是在URL中使用類似「xid=5」的名稱來獲取用戶#5的信息。

現在,假設有人給「xid=5 or 1=1」。由此產生的查詢將是:

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

該條件始終爲真;在遍歷結果集時,您將獲得所有用戶的信息作爲輸出。

另一種可能性:「xid=5; delete from utinfo;」;這將使該查詢:

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

這將清空表:-(


必須始終逃脫/檢查/消毒/無論將它們放在一個SQL查詢之前,你的數據,尤其是(但不是唯一的),如果他們來自於應用程序的用戶。

對於字符串,請參閱mysql_real_escape_string功能。
對於前人的精力是整數的數據,你可以使用intval(最壞的情況下,如果數據是無效的,你會得到0,這可能會從數據庫中得到任何結果,但是,至少,不會打破它^^)

另一種解決方案是使用準備陳述;但這些都不是可用mysql_*功能:你必須選擇要麼

無論如何,對於一個新的應用程序,你不應該使用mysql_*:它是老,並沒有得到新的functionnalities /改進,庫MySQLi和PDO得到...