无法在MYSQL查询中获取PHP变量

时间:2014-03-11 14:04:00

标签: php mysql

我尝试根据存储的网址进行选择,但它无法正常工作:

$data=$db->fetch_all_array('select  * from recs WHERE urlref = ".$URL."');

如果我对其工作的URL进行硬编码。 E.g:

$data=$db->fetch_all_array('select  * from recs WHERE urlref = "http://www.domain.com/folder1/folder2/"');

我的$ URL变量很好。如果我回应它,​​我会在urlref下获得数据库中的精确字符串。

我已经尝试了单引号和双引号和点的每种可能组合来嵌入变量。有任何想法吗?

7 个答案:

答案 0 :(得分:4)

这样做:

$data=$db->fetch_all_array("select  * from recs WHERE urlref = '".$URL."'");

始终确保在SQL查询中为字符串值添加引号。否则他们无法正确解释。

另外,请确保在使用用户输入时,$URL变量可以防止SQL注入。否则我可以轻松提交这样的网址:

' OR '1'='1

它将返回所有记录。在维基百科上了解有关SQL injections的更多信息。

答案 1 :(得分:1)

您没有正确转义字符串文字。您需要使用与用于分隔它的相同引号标记样式来转义它:

$data = $db->fetch_all_array('select  * from recs WHERE urlref = \''.$URL.'\'');

或者,PHP会自动解析它在双引号字符串中找到的任何变量,所以你也可以这样做:

$data = $db->fetch_all_array("select  * from recs WHERE urlref = '$URL'");

请注意,如果您考虑使用此方法进行直接用户输入,或者您的内容不是100%肯定的变量,那么最好调查Prepared Statements的使用情况。 SQL转义。

答案 2 :(得分:1)

您使用单引号来封装字符串。这意味着变量不会扩展,您将以文字查询结束:

select  * from recs WHERE urlref = ".$URL."

您需要以下内容:

$data=$db->fetch_all_array('select  * from recs WHERE urlref = "'.$URL.'"');
//                         ^                                    ^      ^ ^

或者这个:

$data=$db->fetch_all_array("select  * from recs WHERE urlref = '".$URL."'");
//                         ^                                    ^      ^ ^

甚至:

$data=$db->fetch_all_array("select  * from recs WHERE urlref = '$URL'");
//                         ^                                         ^

请确保在将$URL变量粘贴到数据库查询之前对其进行转义,否则您需要将代码打开到SQL注入攻击

答案 3 :(得分:0)

$data=$db->fetch_all_array("select  * from recs WHERE urlref = '".$URL."'");

如果您输入了" google.com"它将是" .google.com。"

答案 4 :(得分:0)

如果你使用双引号(" "),它们内部的php变量将被解析如下:

$data=$db->fetch_all_array("select  * from recs WHERE urlref = '{$URL}' ");

答案 5 :(得分:0)

您应该使用准备好的陈述:http://php.net/manual/en/mysqli.prepare.php

答案 6 :(得分:0)

您必须在代码中进行以下更改:

$data=$db->fetch_all_array('select  * from recs WHERE urlref = "'.$URL.'"');