Php 使用变量从mysql获取数据

Php 使用变量从mysql获取数据,php,mysql,sql,variables,post,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); w

我正在使用这个代码

<?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>";
  ?>
请告诉我我犯了什么错误?请给我指引

我想我应该澄清的一点是,“ord_id字段”是数字(int)


在sql语句中使用双引号时,这应该可以正常工作
$sql=“SELECT…”

还添加到用户输入变量以避免:


在sql语句中使用双引号时,这应该可以正常工作
$sql=“SELECT…”

还添加到用户输入变量以避免:

试试这个:

$wid = mysql_real_escape_string($wid);
$sql = "SELECT url_imgsrch FROM p_url_imgsrch where word_id = '$wid' ORDER BY RAND() LIMIT 5";
你没有正确使用引号。如果要在列名上使用引号,请使用反勾号,而不是单引号。

尝试以下操作:

$wid = mysql_real_escape_string($wid);
$sql = "SELECT url_imgsrch FROM p_url_imgsrch where word_id = '$wid' ORDER BY RAND() LIMIT 5";
你没有正确使用引号。如果要在列名上使用引号,请使用倒勾,而不是单引号。

在这一行:

$sql= 'SELECT url_imgsrch FROM p_url_imgsrch where 'word_id'='[$wid]' ORDER BY RAND() LIMIT 5';
请特别注意Stack Overflow的语法highlighter是如何处理它的,尤其是在术语
word\u id
周围。使用这些单引号所做的是终止PHP字符串,然后抛出一个未知的术语,
word\u id
。PHP不知道如何处理这个问题,因此它给出了您看到的错误

在术语
word\u 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
变量周围有方括号?与MySQL相比,我更熟悉MSSQL,在前面的方括号中表示一个数据库对象(不是一个变量,比如与数据库对象匹配的字符串),这似乎不是您想要的。很可能你的意思是:

$sql= "SELECT url_imgsrch FROM p_url_imgsrch where word_id='$wid' ORDER BY RAND() LIMIT 5";
请注意两个区别:

  • 去掉方括号
  • 将行的第一个和最后一个引号从单引号更改为双引号。在PHP中,单引号和双引号都可以用来表示字符串。在这种特殊情况下,双引号非常有用,因为它们允许您在字符串本身中包含单引号(无需转义,这将使读取更加困难)
  • 最后,正如其他人所指出的,这段代码需要针对SQL注入攻击进行保护。最直接、最明显的方法是使用
    mysql\u real\u escape\u 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";
    

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

    $sql= 'SELECT url_imgsrch FROM p_url_imgsrch where 'word_id'='[$wid]' ORDER BY RAND() LIMIT 5';
    
    请特别注意Stack Overflow的语法highlighter是如何处理它的,尤其是在术语
    word\u id
    周围。使用这些单引号所做的是终止PHP字符串,然后抛出一个未知的术语,
    word\u id
    。PHP不知道如何处理这个问题,因此它给出了您看到的错误

    在术语
    word\u 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
    变量周围有方括号?与MySQL相比,我更熟悉MSSQL,在前面的方括号中表示一个数据库对象(不是一个变量,比如与数据库对象匹配的字符串),这似乎不是您想要的。很可能你的意思是:

    $sql= "SELECT url_imgsrch FROM p_url_imgsrch where word_id='$wid' ORDER BY RAND() LIMIT 5";
    
    请注意两个区别:

  • 去掉方括号
  • 将行的第一个和最后一个引号从单引号更改为双引号。在PHP中,单引号和双引号都可以用来表示字符串。在这种特殊情况下,双引号非常有用,因为它们允许您在字符串本身中包含单引号(无需转义,这将使其更加困难)
    "string $var" 
    
    SELECT * FROM users WHERE score = $var
    //is still vulnerable to
    $var = "1 OR 1 = 1"