繁体   English   中英

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

[英]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()用于字符串。 您的案例值是整数。 看来您这里的类型不匹配?

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

对于类型不匹配,第一个答案可能是正确的,您应该可以使用以下代码解决问题:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM