[英]query two tables in one mysql query
我在從兩個單獨的表中獲取數據時遇到麻煩
到目前為止,我有這個
<?
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.";
};
};
?>
config表config有一個名為modules的行,它由2個條目填充,其中一個是1,另一個是3。因此,我應該看到情況1,然后是情況3。但是,所有即時消息都是默認回顯。
(這不是OP的答案,而是您真正應該關心的事情,因此我認為值得編寫)
似乎您的代碼中有大量的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_*
:它是舊的,並且不會獲得mysqli和PDO所獲得的新功能/改進...
stripslashes()用於字符串。 您的案例值是整數。 看來您這里的類型不匹配?
對於類型不匹配,第一個答案可能是正確的,您應該可以使用以下代碼解決問題:
switch ((integer) $row['module'])
參見以下內容: http : //us.php.net/manual/zh/language.types.type-juggling.php#language.types.typecasting
或者,您可以嘗試以下操作:
settype($row['module'], "integer");
switch ($row['module'])
請參閱: http : //us.php.net/manual/en/function.settype.php
我還建議將$ row ['module']的值回顯到頁面上只是為了檢查它是否確實是整數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.