将PHP变量传递给SQL select查询

时间:2013-02-14 16:10:19

标签: php mysql

好的,所以我有一些PHP将变量传递到页面的URL中。 PHP页面选取名为“item1”的变量,然后在变量的前面添加一个字符串,如下所示(例如,让变量为10):

$v1 = $_GET['item1'];
echo "$v1"; 
$v2 = 'table-';
$v3 = $v2.$v1;
echo "$v3";

这会在网页上打印“table-10”。辉煌。

现在我想将它传递给MySQL select语句,以便它可以查询名为“table-10”的表:

$sql = "select * from $v3"; 
       $result = mysql_query ($sql);

然而,这不起作用。我在这里做的事真的很蠢吗?任何帮助表示赞赏。

编辑:

感谢所有帮助人员,关于SQLi注入你的评论是值得赞赏的,但是这是一个本地唯一的系统,没有外部曝光,所以任何漏洞都是相当不重要的。这个系统只是一个概念证明,所以当我真正构建完整系统时,我会确保它不包含任何漏洞。通过使用反引号解决了这个问题,非常感谢!

3 个答案:

答案 0 :(得分:0)

使用以下查询

$sql = "select * from '$v3'"; 
       $result = mysql_query ($sql);

并且不要使用mysql_ * https://wiki.php.net/rfc/mysql_deprecation。使用mysqli_ *代替

将其用作

 $sql = "select * from '$v3'"; 
           $result = mysqli_query ($sql);

但它仍然容易被sql注入。

使用

mysqli_real_escape_string



$v3= $mysqli->real_escape_string($v3);


   //Now this is the string with special chars escaped

现在在查询中使用它

$sql = "select * from '$v3'"; 
           $result = mysqli_query ($sql);

simonwhatley博客上的一篇文章解释了它以及处理它的措施。

答案 1 :(得分:0)

试试这个:

$result = mysql_query ($sql) or die(mysql_error());

顺便说一句,您的代码容易受到SQL Injection的攻击。使用PDO扩展而不是mysql_ *函数。

答案 2 :(得分:0)

  1. 因为表名中有连字符,所以需要将其包装在SQL字符串中的反引号字符中,以便mySQL识别它。例如:

    SELECT * FROM `table-10`
    
  2. 因为您接受表名的一部分作为$_GET变量,所以它容易受到SQL注入攻击。这意味着黑客可以将值发布到包含其他SQL命令的$_GET['item1'],并在您不知情的情况下执行这些命令。通过这样做,可以从数据库中找到他想要的任何数据,也可以修改数据。

    为避免这种情况,您需要“清理”输入。在你的情况下,因为你知道值应该总是一个数字,所以强制它成为一个整数就足够了,因此它会丢弃黑客可能传递的任何偷偷摸摸的额外查询数据。例如:

    $v1 = (int)$_GET['item1'];
    

    (另请注意,如果根本没有传递item1,那么当你尝试引用它时,PHP会抛出一条警告信息。我现在会忽略它,但是你也应该修复它)

  3. 您没有提供有关数据库结构的更多信息,但您提供的代码中给出的提示指向非常差的数据库设计。我不会在这里详细介绍因为它是一个很大的主题,但足以说动态表名通常是一个坏主意,就像没有WHERE子句的选择一样。 SELECT *在某些圈子中也不赞成,因为最好明确指定字段(如果你有很多字段,*可以是一个有用的快捷方式)。

  4. 最后,请避免使用旧的mysql功能。他们已经过时了。 mysqli库非常相似且易于切换。 (如果您正在阅读基于旧mysql函数的教程,那么您应该找到一些更好的教程!)