使用变量从mysql获取数据

时间:2012-01-18 14:16:37

标签: php mysql sql variables post

我正在使用此代码

<?php
  $word = $_POST['word'];
  $wid= $_POST['id'];
  print "<table>";
  print "<tr>";
  $sql= 'SELECT url_imgsrch FROM p_url_imgsrch where 'word_id'='[$wid]' ORDER BY RAND() LIMIT 5';
  $result   =   mysql_query($sql);
  while($row = mysql_fetch_array($result)){

           print ' <td>
               <img name="myimage" src="'.$row[0].'" width="100" height="100" alt="word" border="1"/>
            </td>';
  }
  print "</tr>";
  print "</table>";
  ?>

我正在做的是使用where子句从mysql获取一个字段,但它显示错误

  

解析错误:语法错误,意外的T_STRING   第21行的D:\ wamp \ www \ demo \ login \ card.php

和第21行持有

$sql= 'SELECT url_imgsrch FROM p_url_imgsrch where 'word_id'='[$wid]' ORDER BY RAND() LIMIT 5';

请指导我,我在做什么大错?准则请。

  

我认为我应该说明的一件事是“ord_id field”是Numeric(int)

4 个答案:

答案 0 :(得分:5)

在这一行:

$sql= 'SELECT url_imgsrch FROM p_url_imgsrch where 'word_id'='[$wid]' ORDER BY RAND() LIMIT 5';

特别注意Stack Overflow的语法高亮显示器如何处理它,特别是在术语word_id周围。你用这些单引号做的是终止PHP字符串,然后引入一个未知的术语word_id。 PHP不知道如何处理这个问题,因此它会给出您所看到的错误。

是否有理由在术语word_id周围使用单引号?它应该是SQL语句中的字符串吗?我猜它不应该。您应该能够直接在查询中引用表中的列。像这样:

$sql= 'SELECT url_imgsrch FROM p_url_imgsrch where word_id='[$wid]' ORDER BY RAND() LIMIT 5';

请注意,PHP语法分析与SQL语法分析完全分开。您在此代码中所做的只是构建一个字符串以发送到数据库。之后,数据库将该字符串解析为SQL代码。因此,应谨慎地混合使用PHP和SQL,以免产生无效的SQL,或者即使PHP代码正常,您也会收到更多错误。 (您还应该在问题和其他答案的评论中指出,查看SQL注入攻击等内容并了解如何进一步保护您的代码。代码可能有效,但同时可能会出现明显的安全漏洞。有关详细信息,请参阅此答案的其余部分和其他答案。 重要。

快速提问,也许这只是我不会立即熟悉的语法...为什么该语句中的$wid变量周围有方括号?我对MSSQL比对MySQL更熟悉,并且在前方括号中表示数据库对象(不是变量,例如与数据库对象匹配的字符串),这似乎不是您想要的。你可能真的是这个意思:

$sql= "SELECT url_imgsrch FROM p_url_imgsrch where word_id='$wid' ORDER BY RAND() LIMIT 5";

注意两个不同之处:

  1. 摆脱方括号。
  2. 将该行的第一个和最后一个引号从单引号更改为双引号。单引号和双引号都可用于表示PHP中的字符串。在这种特殊情况下,双引号很有用,因为它们允许您在字符串本身中包含单引号(无需转义,这将使其更难以阅读)。
  3. 最后,正如其他人也指出的那样,此代码需要以防止SQL注入攻击。最直接,最明显的方法是mysql_real_escape_string(),更多信息here。这个函数基本上做的是通过转义控制字符等将字符串转换为更安全的SQL字符串。在将它们添加到SQL字符串之前,您可以使用此包装任何和所有输入字符串:

    $wid = mysql_real_escape_string($wid);
    $sql= "SELECT url_imgsrch FROM p_url_imgsrch where word_id='$wid' ORDER BY RAND() LIMIT 5";
    

    您还可以考虑采取进一步措施来减少SQL漏洞,并可能导致更清晰的代码。考虑查看PHP Data Objects来表示数据库交互,而不是直接在代码中构建SQL字符串。

答案 1 :(得分:2)

对于sql语句$sql= "SELECT ..."

使用双引号时,这应该可以正常工作
WHERE word_id='$wid'

同时将mysql_real_escape_string()添加到用户输入变量以避免SQL Injections

$wid = mysql_real_escape_string($_POST['id']);

答案 2 :(得分:1)

试试这个:

$wid = mysql_real_escape_string($wid);
$sql = "SELECT url_imgsrch FROM p_url_imgsrch where word_id = '$wid' ORDER BY RAND() LIMIT 5";

您使用引号不正确。如果要在列名上使用引号,请使用反引号,而不是单引号。

答案 3 :(得分:-1)

正如其他人提到的,如果使用“单引号”,则不能正确使用引号,您必须将字符串连接起来:

'string ' . $var

单引号意味着内部的所有内容都被视为文字字符串,几乎没有任何东西必须被转义(当然除了单引号)。在“双引号”里面你必须转义特殊字符,你也可以使用变量名而不需要自己将变量附加到字符串:

"string $var" 

例如可以正常工作...... See the PHP documentation for more info

您的代码易受SQL注入攻击。您可以看到有关如何解决问题的一些答案here。您可以使用mysql_real_escape_string()来转义所提到的某些控制字符,但它不是故障安全的。从链接上的多项式取得的示例:

SELECT * FROM users WHERE score = $var
//is still vulnerable to
$var = "1 OR 1 = 1"

如果您考虑在线使用,我建议您使用prepared statements

编辑:

更改了示例。

添加了链接