【问题标题】:stmt query works fine but simple query gets fatal error: uncaught errorstmt 查询工作正常,但简单查询会出现致命错误:未捕获的错误
【发布时间】:2020-03-04 10:26:53
【问题描述】:

使用 stmt 可以正常工作,但是简单查询中出现错误。使用面向对象的 php 脚本。

致命错误:未捕获的错误:调用字符串上的成员函数 fetch_array() ... 堆栈跟踪:#0 {main} 在以下行引发** 我有以下查询:

$SearchQuery = "SELECT * FROM work WHERE ((";
        if(isset($_COOKIE['option1'])){
            $Opt1 = '1';
            $SearchQuery .= "Phase = '$Opt1' OR ";
        }
        if(isset($_COOKIE['option2'])){
            $Opt2 = '2';
            $SearchQuery .= "Phase = '$Opt2' OR ";
        }
        if(isset($_COOKIE['option3'])){
            $Opt3 = '3';
            $SearchQuery .= "Phase = '$Opt3' OR ";
        }
        if(isset($_COOKIE['option4'])){
            $Opt4 = '4';
            $SearchQuery .= "Phase = '$Opt4' OR ";
        }
        if(isset($_COOKIE['option5'])){
            $Opt5 = '5';
            $SearchQuery .= "Phase = '$Opt5' OR ";
        }
        if(isset($_COOKIE['option6'])){
            $Opt6 = '6';
            $SearchQuery .= "Phase = '$Opt6' OR ";
        }
        $SearchQuery .= "FALSE) ";

        if(isset($_COOKIE['FromDate'])){
            $From = $_COOKIE['FromDate'];
            $SearchQuery .= "AND Create_date > '$From' ";
        }
        if(isset($_COOKIE['ToDate'])){
            $To = $_COOKIE['ToDate'];
            $SearchQuery .= "AND Create_date < '$To' ";
        }
        $SearchQuery .= "AND ID = '$WorkID') ";
        $SearchQuery .= "ORDER BY Create_date desc LIMIT 100";

这是错误行:

$row = ($SearchQuery->fetch_array(MYSQLI_ASSOC))

缺少 $db->query($SearchQuery);

【问题讨论】:

  • 错误信息的哪一部分可能不清楚?你在这里没有任何实际的对象,它会有任何fetch_array方法——你只有一个普通的字符串。您需要先执行 SQL 查询,然后才能从结果中获取任何记录。
  • 按照 CBroe 所说,将 $row = ($SearchQuery-&gt;fetch_array(MYSQLI_ASSOC)) 更改为 $row = $SearchQuery-&gt;fetch_array(MYSQLI_ASSOC);
  • 我的天啊,我真是瞎了眼,谢谢你的评论对我有很大帮助,这是第四天找到愚蠢的麻烦!

标签: php sql select


【解决方案1】:

看起来您没有执行查询并犯了一些小错误,例如关注$row = ($SearchQuery-&gt;fetch_array(MYSQLI_ASSOC))

   $SearchQuery = "SELECT * FROM work WHERE ((";
        if(isset($_COOKIE['option1'])){
            $Opt1 = '1';
            $SearchQuery .= "Phase = '$Opt1' OR ";
        }
        if(isset($_COOKIE['option2'])){
            $Opt2 = '2';
            $SearchQuery .= "Phase = '$Opt2' OR ";
        }
        if(isset($_COOKIE['option3'])){
            $Opt3 = '3';
            $SearchQuery .= "Phase = '$Opt3' OR ";
        }
        if(isset($_COOKIE['option4'])){
            $Opt4 = '4';
            $SearchQuery .= "Phase = '$Opt4' OR ";
        }
        if(isset($_COOKIE['option5'])){
            $Opt5 = '5';
            $SearchQuery .= "Phase = '$Opt5' OR ";
        }
        if(isset($_COOKIE['option6'])){
            $Opt6 = '6';
            $SearchQuery .= "Phase = '$Opt6' OR ";
        }
        $SearchQuery .= "FALSE) ";

        if(isset($_COOKIE['FromDate'])){
            $From = $_COOKIE['FromDate'];
            $SearchQuery .= "AND Create_date > '$From' ";
        }
        if(isset($_COOKIE['ToDate'])){
            $To = $_COOKIE['ToDate'];
            $SearchQuery .= "AND Create_date < '$To' ";
        }
        $SearchQuery .= "AND ID = '$WorkID') ";
        $SearchQuery .= "ORDER BY Create_date desc LIMIT 100";

        $result = $mysqli->query($SearchQuery);
        //Mysqli is $db connection variable change it to yours, I didnt see in question
        if(!$result){ return $mysqli->error;}
        //You can use num_rows to check if searched result exist in db like following
        //if ($result->num_rows > 0) {
        $row = $result->fetch_array(MYSQLI_ASSOC);
        //if you wanna use while loop 
        //while($row = $result->fetch_array(MYSQLI_ASSOC)) {echo "return values here";}

        //uncomment following if you wanna use num_rows and uncommented up there 
        // }else{echo "No result found";}
        $result -> free_result();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 2019-09-19
    • 1970-01-01
    • 2017-05-19
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多