查询两人在一个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()用于字符串。你的案例值是整数。看起来你在这里有一个类型不匹配?
- 你为什么不使用PDO?如果可以的话,您应该确实遵守PDO标准。
- SQL select中的表名不应引用。
- 您应该考虑使用以避免SQL注入准备好的语句,然后你不必担心有引用您的PARAMATERS
第一个答案是关于类型不匹配可能是正确的,你应该能够通过使用下面的代码来解决该问题:
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得到...
在MySQL中,你可以(有时需要)在反引号(看起来像引号)括表名。 – 2009-08-01 07:46:27