Fatal error: Call to a member function setFetchMode() on a non-object[Normal]

Fatal error: Call to a member function setFetchMode() on a non-object[Normal]

我的 AJAX 调用的 php 脚本出现以下错误。致命错误:调用非对象上的成员函数 setFetchMode()。实际上,我已经编写了一个存储过程来创建动态临时 table。请在下面找到用于调用存储过程的存储过程和 php 脚本。

`CREATE DEFINER=`root`@`localhost` PROCEDURE `StoreValue`(IN `Clname` VARCHAR(55), IN `ip_a` VARCHAR(55), IN `port_n` INT, IN `table_1` VARCHAR(55), IN `variable1` VARCHAR(55), IN `moddate1` TIMESTAMP, IN `moddate2` TIMESTAMP)
BEGIN
DECLARE table_name VARCHAR(55);
SET @table_name := table_1;

set @sql_text:=concat('create temporary table ',@table_name,'(status varchar(100),moddate datetime,INDEX mod_index (moddate)) '," SELECT `status`,`moddate` FROM `globstats_graph` WHERE Cname=? and ip=? and port=? and Variable=? and status REGEXP '^[0-9]+$|^ON$' and moddate between ? and ?");  

PREPARE stmt FROM @sql_text;
set @a=Clname;
set @b=ip_a;
set @c=port_n;
set @d=variable1;
set @e=moddate1;
set @f=moddate2;
 EXECUTE stmt USING @a,@b,@c,@d,@e,@f;
END`

php代码: 用于连接

try {
            $conn = new PDO("mysql:host=$hostname;dbname=$database",$username, $password);
} 
catch (PDOException $pe) {
die("Error occurred:" . $pe->getMessage());
}

用于调用存储过程

try {
            // execute the stored procedure
            $sql = "CALL StoreValue('$client','$ip','$port','$table_name','$var','$new_start','$new_end')";
            $q = $conn->query($sql);
            $q->setFetchMode(PDO::FETCH_ASSOC);
            $total_search=$q->rowCount();
        } catch (PDOException $pe) {

            echo die("Error occurred:" . $pe->getMessage());
        }

请帮我解决这个问题...

您的 $q 变量不是对象,这会导致致命错误。很可能是 $conn->query() 方法调用返回了有问题的值,您需要深入挖掘才能找出 query() 方法失败的原因。

开始搜索的最佳起点之一是 PDO 文档,以了解它对错误报告有何支持。特别是,考虑到您将查询代码包装到 try/catch 块中这一事实,我认为您会发现此用户评论非常有趣:http://php.net/manual/en/pdo.query.php#74943.

The handling of errors by this function is controlled by the attribute PDO::ATTR_ERRMODE.

Use the following to make it throw an exception:
<?php $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); ?>