使用变量从mysql获取数据

Zaf*_*fee 1 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>";
  ?>
Run Code Online (Sandbox Code Playgroud)

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

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

和第21行成立

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

请指导我,我在做什么大错?请给我指导.

我认为我应该说清楚的一件事是"ord_id field"是Numeric(int)

Dav*_*vid 5

在这一行:

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

请特别注意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';
Run Code Online (Sandbox Code Playgroud)

请注意,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";
Run Code Online (Sandbox Code Playgroud)

注意两个区别:

  1. 摆脱了方括号.
  2. 将该行的第一个和最后一个引号从单引号更改为双引号.单引号和双引号都可用于表示PHP中的字符串.在这种特殊情况下,双引号很有用,因为它们允许您在字符串本身中包含单引号(无需转义,这将使其更难阅读).

最后,正如其他人也指出的那样,需要保护此代码免受SQL注入攻击.最直接和最明显的方法是在这里提供mysql_real_escape_string()更多信息.这个函数基本上做的是通过转义控制字符等将字符串转换为更安全的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";
Run Code Online (Sandbox Code Playgroud)

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