2013-05-09 85 views
1

我有这个在php中进行的SQL查询。但查询在ERROR中解除。如果删除此AND first_name LIKE '{$first_name}%',它工作正常,并产生正确的输出。我无法关注下面的语法有什么问题。 任何帮助将不胜感激。由于为什么SQL/PHP中的这个查询不起作用?

$db = new PDO("mysql:dbname=newbie"); 
      $first_name=$_GET["firstname"]; 
      $first_name =$db->quote($first_name); 
      $last_name=$_GET["lastname"]; 
      $last_name=$db->quote($last_name); 
      $rows=$db->query("SELECT id,first_name FROM actors WHERE last_name=$last_name AND first_name LIKE '{$first_name}%' ORDER BY film_count DESC LIMIT 1"); 
+0

请编辑您的第一段。现在不清楚。 – 2013-05-09 20:13:24

+1

在Google上搜索SQL注入。这将有助于推动你的事业向前发展。 – RichardTheKiwi 2013-05-09 20:14:54

+0

你不需要一个用户来连接你的计划? $ db = new PDO('mysql:host = xxx; port = xxx; dbname = newbie','user','password'); – Terence 2013-05-09 20:26:55

回答

1

我认为这可能是因为你错过了$lastname引号,因为它是一个文本字段。

$db = new PDO("mysql:dbname=newbie"); 
      $first_name=$_GET["firstname"]; 
      $first_name =$db->quote($first_name); 
      $last_name=$_GET["lastname"]; 
      $last_name=$db->quote($last_name); 
      $rows=$db->query("SELECT id,first_name FROM actors WHERE last_name='{$last_name}' AND first_name LIKE '{$first_name}%' ORDER BY film_count DESC LIMIT 1"); 
+0

你完全错过了这个有巨大SQL注入漏洞的部分。这不是引用问题。 – tadman 2013-05-09 20:18:23

+0

如果last_name什么都没有,那该怎么办 – Notepad 2013-05-09 20:19:47

+0

好点,但我认为它应该是一个精确的搜索,因为他在第二个标准中使用了'LIKE'。 – luttkens 2013-05-09 20:28:07

0

你没有正确使用PDO,并暴露自己的大量SQL injection bugs风险。使用占位符和逃避你的数据:

$sth = $db->prepare("SELECT id,first_name FROM actors WHERE last_name=:lastname AND first_name LIKE :first_name ORDER BY film_count DESC LIMIT 1"); 
$result = $db->execute(array("firstname" => "%" . $_GET["firstname"] . "%", "lastname" => $_GET["lastname"])); 

有许多方法可以做到这一点,所有的various tutorials描述。

+1

我知道有这个注入漏洞,但我试图在解决这些漏洞之前让查询工作。正如我所提到的,查询在我删除AND first_name LIKE'{$ first_name}%'时起作用。所以它必须用语法来做些事情。 – 2013-05-09 20:33:08

+0

如果您修复了这些错误,您就不会有太多问题。在查询字符串中缺少引号是提示你做错了。让它与注入漏洞“共同工作”是创建巨大安全漏洞的好方法,因为你可能会忘记这一点,并在以后不能修复它。对逃跑有一种随意的态度,就像医生对手术前洗手一样随便。第一次写得正确,你不必回头修复它。这实际上是一行代码。你为什么抗议? – tadman 2013-05-09 20:42:02

+0

@tadman - 漏洞不是一个错误,虽然它可能比bug更危险。凭借所有善意,你在这里脱离主题。 – 2013-05-09 20:44:01

0

您可以移除'$ first_name'周围的'{'和'}'。当变量位于双引号内时,它们不应该是必需的。