Синглтон базы данных php не возвращает второй результат - PullRequest
0 голосов
/ 09 октября 2018

Я новичок во всем этом, поэтому, пожалуйста, извините, если я сделал что-то глупое.Я понимаю, что, вероятно, есть.Но я пытался заставить это работать в течение 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 является ложным для второго вызова.Ошибки не возвращаются.Вот результат запуска файла:

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

Я пробовал разные вещи без какого-либо успеха.Любые идеи с благодарностью принимаются.

1 Ответ

0 голосов
/ 10 октября 2018

Оказывается, что первый запрос не был «использован» к моменту запуска второго запроса, и 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 возвращают правильный результат, как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...