簡體   English   中英

在一個mysql查詢中查詢兩個表

[英]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()用於字符串。 您的案例值是整數。 看來您這里的類型不匹配?

  1. 為什么不使用PDO? 如果可以的話,您應該真正在PDO上進行標准化。
  2. SQL select中的表名不應加引號。
  3. 您應該考慮使用准備好的語句以避免SQL注入,然后您不必擔心必須引用參數

對於類型不匹配,第一個答案可能是正確的,您應該可以使用以下代碼解決問題:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM