在一个mysql查询中查询两个表

时间:2009-08-01 07:24:38

标签: php 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.";

};
};
?>

配置表配置有一个名为modules的行,它由2个条目填充,其中一个是1,另外3个。所以我应该看到案例1然后是案例3.但是所有我得到的是默认的回声

4 个答案:

答案 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)

  1. 你为什么不使用PDO?如果可以,你应该在PDO上真正标准化。
  2. 不应引用SQL select中的表名。
  3. 您应该考虑使用预准备语句以避免SQL注入,然后您不必担心必须引用您的参数

答案 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']的值,以确定它确实是一个整数。