我是这方面的新手,如果我做过一些蠢事,请原谅。我知道我可能有。但是我已经尝试使它工作2天了,我真的很困。
我有一个简单的数据库单例,如下所示:
define('SERVER',$config["serverName"]);
define('USERNAME',$config["userName"]);
define('PASSWORD',$config["password"]);
define('DATABASE',$config["databaseName"]);
class DbClass{
private static $instance;
private $conn;
private function __construct(){
$this->conn = new mysqli(SERVER, USERNAME, PASSWORD, DATABASE);
}
public static function init(){
if(is_null(self::$instance)){
self::$instance = new DbClass();
}
return self::$instance;
}
public function callQuery($query){
$result = null;
try{
$result = $this->conn->query($query);
}
catch(Exception $e){
return $e->getMessage();
}
return $result;
}
}
我有一个简单的测试文件,试图在其中两次调用存储过程并访问结果。第一次都可以,但是第二次调用时,结果为空。这是简单的测试文件:
require_once '../utility/DbClass.php';
$conn = DBClass::init();
$query4a = "CALL selectMaxBaseline(218)";
$result = $conn->callQuery($query4a);
var_dump($conn);
var_dump($result);
$queryA = "CALL selectMaxBaseline(218)";
try{
$result2 = $conn->callQuery($queryA);
}
catch(Exception $e) {
echo $e->getMessage();
}
var_dump($conn);
var_dump($result2);
$ conn对象看起来不错,两次调用var_dump时,我都得到了相同的对象。这是我所期望的。我可以在第一轮中遍历$ result,并查看它返回了正确的数据。因此,我知道数据库连接良好,存储过程正常工作,并且返回有效结果(为简便起见,我删除了此代码)。但是$ result对象在第二次调用中为false。没有错误返回。这是运行文件的输出:
object(DbClass)[1]
private 'conn' =>
object(mysqli)[2]
public 'affected_rows' => null
public 'client_info' => null
public 'client_version' => null
public 'connect_errno' => null
public 'connect_error' => null
public 'errno' => null
public 'error' => null
public 'error_list' => null
public 'field_count' => null
public 'host_info' => null
public 'info' => null
public 'insert_id' => null
public 'server_info' => null
public 'server_version' => null
public 'stat' => null
public 'sqlstate' => null
public 'protocol_version' => null
public 'thread_id' => null
public 'warning_count' => null
object(mysqli_result)[3]
public 'current_field' => null
public 'field_count' => null
public 'lengths' => null
public 'num_rows' => null
public 'type' => null
object(DbClass)[1]
private 'conn' =>
object(mysqli)[2]
public 'affected_rows' => null
public 'client_info' => null
public 'client_version' => null
public 'connect_errno' => null
public 'connect_error' => null
public 'errno' => null
public 'error' => null
public 'error_list' => null
public 'field_count' => null
public 'host_info' => null
public 'info' => null
public 'insert_id' => null
public 'server_info' => null
public 'server_version' => null
public 'stat' => null
public 'sqlstate' => null
public 'protocol_version' => null
public 'thread_id' => null
public 'warning_count' => null
boolean false
我尝试了各种尝试,但都没有成功。感激任何想法。
答案 0 :(得分:0)
事实证明,在第二个查询触发时,第一个查询尚未“使用”,并且mysqli不允许并发查询。因此,诀窍是“清除”第一个查询,然后触发第二个查询。
我将功能更改为:
public function callQuery($query){
try{
while($this->conn->more_results()) {
$this->conn->next_result();
$this->conn->use_result();
}
$result = $this->conn->query($query);
return $result;
}
catch(Exception $e){
return $e->getMessage();
}
}
,现在一切正常。两次对callQuery的调用均返回预期的正确结果。