【问题标题】:PHP variables don't evaluate in the query [duplicate]mysqli_fetch_assoc() 期望参数 1 为 mysqli_result,布尔值给定 [重复]
【发布时间】:2012-07-06 01:44:20
【问题描述】:

我对 PHP 和 MySQL 还很陌生,但我无法弄清楚这一点。我在论坛上搜索了所有内容,但没有找到我能理解的答案。我最初使用的是 mysql_fetch_assoc() 但我只能搜索数字,并且在搜索字母时也收到错误。我希望我在这里走在正确的轨道上。提前感谢您的所有帮助!

$con = mysqli_connect($hostname,$username,$password) or die ("<script language='javascript'>alert('Unable to connect to database')</script>");
mysqli_select_db($con, $dbname);

if (isset($_GET['part'])){
    $partid = $_GET['part'];
    $sql = 'SELECT * 
        FROM $usertable 
        WHERE PartNumber = $partid';

    $result = mysqli_query($con, $sql);
    $row = mysqli_fetch_assoc($result);

    $partnumber = $partid;
    $nsn = $row["NSN"];
    $description = $row["Description"];
    $quantity = $row["Quantity"];
    $condition = $row["Conditio"];
}

【问题讨论】:

  • 别忘了过滤$_GET['part']以防止SQL注入。

标签: php search mysqli


【解决方案1】:

您正在单引号引用您的 SQL 语句,该语句使变量变为文本而不是变量。

$sql = "SELECT * 
    FROM $usertable 
    WHERE PartNumber = $partid";

【讨论】:

    【解决方案2】:

    当您的结果不是结果(而是“假”)时,就会发生这种情况。 你应该改变这一行

    $sql = 'SELECT * FROM $usertable WHERE PartNumber = $partid';
    

    到这里:

    $sql = "SELECT * FROM $usertable WHERE PartNumber = $partid";
    

    因为 " 可以解释 $variables 而 ' 不能。

    适用于整数(数字),对于需要将 $ 变量放在单引号中的字符串,例如

    $sql = "SELECT * FROM $usertable WHERE PartNumber = '$partid' ";
    

    如果你想/必须使用单引号,那么 php 不能解释变量,你必须这样做:

     $sql = 'SELECT * FROM '.$usertable.' WHERE string_column = "'.$string.'" AND integer_column = '.$number.';
    

    【讨论】:

    • 这是因为字符串需要像上面一样进行转义。我刚刚改进了我的答案。
    • "当您的结果不是结果(而是“假”)时,就会发生这种情况。"这真的帮助我在几秒钟内完成调试。
    【解决方案3】:
    mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given
    

    这意味着您传递的第一个参数是布尔值(true 或 false)。

    第一个参数是$result,是false,因为查询中有语法错误。

    " ... WHERE PartNumber = $partid';"
    

    您永远不应该在 SQL 查询中直接包含请求变量,否则用户可以在您的查询中注入 SQL。 (见SQL injection。)

    你应该转义变量:

    " ... WHERE PartNumber = '" . mysqli_escape_string($conn,$partid) . "';"
    

    或者更好,使用Prepared Statements

    【讨论】:

    【解决方案4】:

    如果$usertable 不是有效表或不包含列 PartNumber 或 part 不是数字,您的代码中会发生什么。

    您必须转义 $partid 并阅读 mysql_fetch_assoc() 的文档,因为它可以返回布尔值

    【讨论】:

      【解决方案5】:

      Mysqli 使用面向对象的编程。尝试改用这种方法:

      function dbCon() {
              if($mysqli = new mysqli('$hostname','$username','$password','$databasename')) return $mysqli; else return false;
      }
      
      if(!dbCon())
      exit("<script language='javascript'>alert('Unable to connect to database')</script>");
      else $con=dbCon();
      
      if (isset($_GET['part'])){
          $partid = $_GET['part'];
          $sql = "SELECT * 
              FROM $usertable 
              WHERE PartNumber = $partid";
      
          $result=$con->query($sql_query);
          $row = $result->fetch_assoc();
      
          $partnumber = $partid;
          $nsn = $row["NSN"];
          $description = $row["Description"];
          $quantity = $row["Quantity"];
          $condition = $row["Conditio"];
      }
      

      如果您有任何问题,请告诉我,我无法测试此代码,因此您可能需要三次检查!

      【讨论】:

      • 您的 SQL 查询无效。你可以NOT在单引号字符串中使用变量
      猜你喜欢
      • 2014-02-27
      • 2011-02-02
      • 2023-02-12
      • 1970-01-01
      • 2013-03-04
      • 2017-05-15
      • 2015-04-01
      • 2018-11-06
      • 2022-12-31
      相关资源
      最近更新 更多