php数据库singleton不返回第二个结果

q3qa4bjr  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(303)

我对这一切都不熟悉,所以如果我做了什么傻事,请原谅。我意识到我可能有。但我已经试着让它工作了两天了,我真的卡住了。
我有一个简单的数据库singleton,如下所示:

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\u 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

我尝试过各种各样的事情,但都没有成功。我很感激你的意见。

ve7v8dk2

ve7v8dk21#

结果发现,第一个查询在第二个查询触发时还没有被“使用”,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的两个调用都按预期返回正确的结果。

相关问题