[英]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.