查询两人在一个MySQL查询

查询两人在一个MySQL查询

问题描述:

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.但是,所有即时消息都是默认回显。

stripslashes()用于字符串。你的案例值是整数。看起来你在这里有一个类型不匹配?

  1. 你为什么不使用PDO?如果可以的话,您应该确实遵守PDO标准。
  2. SQL select中的表名不应引用。
  3. 您应该考虑使用以避免SQL注入准备好的语句,然后你不必担心有引用您的PARAMATERS
+2

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

第一个答案是关于类型不匹配可能是正确的,你应该能够通过使用下面的代码来解决该问题:

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 $行[“模块”]的值到页面上,只是为了检查,这确实是一个整数。

(这不是一个问题的任择议定书的事,但你真正应该关心的,所以我认为这是值得书面方式吧)

似乎有一个巨大的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得到...