如何解决这个错误:mysql_fetch_array()期望参数1是mysqli_result

时间:2014-06-13 17:41:49

标签: php mysqli

我收到此错误:

  

mysql_fetch_array()期望参数1为mysqli_result

我正在尝试搜索一张桌子。我不确定我的fetch数组是如何工作的,但我知道它会返回适合给定条件的行。

我的PHP代码:

class Registration
{
    private $db_connection = null;

    public function __construct()
    {
        if (isset($_POST["search"])) 
        {
           $this->doSearch();
        }
    }

   private function doSearch()
   {
     $field = $_POST["field"];
     $find = $_POST["find"];
     echo "you are searching ". $_POST['find'] . " in " . $_POST["field"] . " category"; 
     $this->db_connection = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
     $sql = "SELECT * FROM users WHERE upper $field LIKE $find";
     $result_search = $this->db_connection->query($sql); // mysql_fetch_array() expects parameter 1 to be mysqli_result
     while($row = mysqli_fetch_array($result_search)) 
          {
            echo $row['user_name']."</br>";
            echo $row['user_email']."</br>";
            echo $row['user_phone']."</br>";
            echo "<br>";
          }
   }
}

如何使用OOP解决此问题。

我可以在程序方法中解决,但不能在OOP中解决。

1 个答案:

答案 0 :(得分:2)

我重新打开了这个问题,因为这里至少要纠正四个问题。

第一期:您的SQL中存在语法错误:

 $sql = "SELECT * FROM users WHERE upper $field LIKE $find";

如果您想使用upper()功能,则需要使用括号:

 $sql = "SELECT * FROM users WHERE upper($field) LIKE $find";

第二个问题:字符串必须引用。

 $sql = "SELECT * FROM users WHERE upper($field) LIKE '$find'";

第三个问题:您正在以不安全的方式将变量复制到查询中,因此您正在创建SQL注入漏洞。你应该use query parameters to avoid this

 $sql = "SELECT * FROM users WHERE upper($field) LIKE ?";

第四个问题:它仍然不安全,因为$field是不受信任的输入,并且仍然可能引入SQL注入。但是查询参数不适用于列名,它们只能用于代替字符值,如带引号的字符串或数字。变量列名称的最佳修复方法是根据表中确实存在的列的白名单验证输入,并拒绝其他任何内容(或选择默认值)。这是一个快速的方法:

 $columns = array("user"=>"user_name", "first"=>"first_name", "last"=>"last_name",
     "DEFAULT"=>"username");
 $realfield = $columns[$field] ?: $columns["DEFAULT"];
 $sql = "SELECT * FROM users WHERE upper($realfield) LIKE ?";

请注意$columns中的数组键甚至不必是SQL列名。因此,这使我们能够使Web使用比SQL使用更友好,并允许我们更改一个而不必更改另一个(解耦)。

第五个问题: LIKE在使用默认排序规则时已经是一个不区分大小写的比较,因此您无论如何都不需要upper()。这不会导致错误,但这只是一种很好的做法。

 $sql = "SELECT * FROM users WHERE $realfield LIKE ?";

第六个问题:这是在您的摘要中实际导致错误消息的问题。如果出现错误,query()方法将返回 false 而不是语句资源。在尝试使用它之前,您必须始终检查该错误,就像它是一个声明一样。

这是一种更好的编码方式,将它们放在一起:

 $columns = array("user"=>"user_name", "first"=>"first_name", "last"=>"last_name",
     "DEFAULT"=>"username");
 $realfield = $columns[$field] ?: $columns["DEFAULT"];

 $sql = "SELECT * FROM users WHERE $realfield LIKE ?";

 if (!($stmt = $this->db_connection->prepare($sql))) {
     die($this->db_connection->error);
 }

 $stmt->bind_param("s", $find);
 if (!$stmt->execute()) {
     die($stmt->error);
 }

 $results = $stmt->get_results();

 while($row = $results->fetch_array()) {
     . . .
 }