我无法从两个单独的表中获取数据
到目前为止,我有这个<?
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.";
};
};
?>
配置表配置有一个名为modules的行,它由2个条目填充,其中一个是1,另外3个。所以我应该看到案例1然后是案例3.但是所有我得到的是默认的回声
答案 0 :(得分:2)
(这不是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得到的新的功能/改进......
答案 1 :(得分:0)
stripslashes()用于字符串。您的案例值是整数。看起来你的类型不匹配了吗?
答案 2 :(得分:0)
答案 3 :(得分:0)
关于类型不匹配的第一个答案可能是正确的,您应该能够使用以下代码解决问题:
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
我还建议在页面上回显$ row ['module']的值,以确定它确实是一个整数。