Как заставить запрос с временной таблицей работать в PHP? - PullRequest
1 голос
/ 04 июля 2019

Я просто пробую этот запрос в PHP для временной таблицы, но он не работает в PHP.

IF OBJECT_ID('tempdb..##t1') IS NOT NULL
    DROP TABLE ##t1
select 'rec1' as col1 into ##t1;
select * from ##t1

PHP-код:

$database = new SQL_DB;
$database->query(
  "
  IF OBJECT_ID('tempdb..##t1') IS NOT NULL
    DROP TABLE ##t1

  SELECT 'rec1' as col1 into ##t1;
  SELECT * FROM ##t1;
  "
);
$rows = $database->resultset();

Класс SQL_DB (упрощенный):

public function __construct(){
    //Set DSN
    $dsn = 'sqlsrv:Server=' . $this->host . ';Database=' . $this->dbname;
    //Set options
    /*$options = array(
        PDO::ATTR_EMULATE_PREPARES => true,
        PDO::SQLSRV_ATTR_ENCODING => PDO::SQLSRV_ENCODING_UTF8
    );*/
    $options = array(
      PDO::SQLSRV_ATTR_QUERY_TIMEOUT => $this->TIMEOUT,
      PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION,
      PDO::ATTR_EMULATE_PREPARES => false
    );
    //Create a new PDO instance
    try {
        $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
        // $this->dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    } catch (PDOException $e) {
        $this->error = $e->getMessage();
    }
}

//Prepare statement
public function query($query) {
    $this->stmt = $this->dbh->prepare($query);
}

//Return result Set
public function resultset($in = "") {
  try{
    if ($in == ""){
      $this->stmt->execute();
    }
    else{
      $this->stmt->execute($in);
    }
    return $this->stmt->fetchAll(PDO::FETCH_ASSOC);
  }
  catch (PDOException $e) {
      $this->error = $e->getMessage();
  }
}

Отлично работает в Microsost SQL Server Management Studio и во всех других запросахЯ работал с PHP просто отлично, так что это не проблема соединения.
Это определенно связано с таблицей temp и '#'.

Чего мне не хватает?

Обновление:

Это прекрасно работает, если я разделю запрос на 2 части:

$database = new SQL_DB;
$database->query(
  "
  IF OBJECT_ID('tempdb..##t1') IS NOT NULL
      DROP TABLE ##t1
  SELECT 'rec1' as col1 into ##t1;
"
);
$database->resultset();
$database->query(
  "
  SELECT * from ##t1;
"
);
$rows = $database->resultset();

1 Ответ

0 голосов
/ 05 июля 2019

Оказывается, проблема не в временной таблице, а в том, как PDO работает для нескольких наборов результатов.
Исправление просто изменяет способ получения результата (в этом случае выборка последнего набора результатов):

public function lastresultset($in = "") {
  try{
    if ($in == ""){
      $this->stmt->execute();
    }
    else{
      $this->stmt->execute($in);
    }
    $result = $this->stmt->fetchAll(PDO::FETCH_ASSOC);
    while($this->stmt->nextRowset()){
      $result = $this->stmt->fetchAll(PDO::FETCH_ASSOC);
    };
    return $result;
  }
  catch (PDOException $e) {
      $this->error = $e->getMessage();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...