PHP PDO fetchAll()在选择临时表时返回空数组

时间:2017-10-06 02:43:43

标签: php mysql sql pdo

我有以下查询,它包含Temporary Table。如果我使用Temporary Table,则会返回 EMPTY ARRAY 。如果我删除了Temporary Table,则会返回相应的记录。

以下SQL Query包含一个简单的查询,我刚刚创建了一个Temporary Table并插入了一些记录,我正在SELECT进行Temporary Table查询。我在 phpMyAdmin 中执行了相同的代码,它会返回相应的记录,但在 PDO 中会返回 EMPTY ARRAY

示例和简单SQL查询:

案例#1 Temporary Table - 返回 EMPTY ARRAY

<?php

$query = <<<SQL

CREATE TEMPORARY TABLE TempContact (
    ContactId int, 
    FirstName varchar(30), 
    LastName varchar(30), 
    IsActiveContact Boolean
);

INSERT INTO TempContact (ContactId, FirstName, LastName, IsActiveContact)
SELECT CT.ContactId, CT.FirstName, CT.LastName, 
    CASE WHEN SL.SalesId IS NOT NULL THEN TRUE ELSE FALSE END AS IsActiveContact
FROM Contact CT
LEFT JOIN Sales SL ON CT.ContactId = SL.ContactId;

SELECT TC.* FROM TempContact TC;

SQL;

$stmt = $db->prepare($query);
$result = $stmt->execute() ? $stmt->fetchAll() : null;

?>

案例#2 没有Temporary Table - 返回合适的记录

<?php

$query = <<<SQL

SELECT CT.ContactId, CT.FirstName, CT.LastName, 
    CASE WHEN SL.SalesId IS NOT NULL THEN TRUE ELSE FALSE END AS IsActiveContact
FROM Contact CT
LEFT JOIN Sales SL ON CT.ContactId = SL.ContactId;

SQL;

$stmt = $db->prepare($query);
$result = $stmt->execute() ? $stmt->fetchAll() : null;

?>

我的实际代码非常复杂,由于易于理解,我添加了这个简单的查询。

我还使用print_r($stmt->errorInfo());检查了我的查询(案例#1查询)中的任何错误,但它返回EMPTY ARRAY即我的查询中没有错误) ;。此外,它没有抛出任何PDOException

请帮助我,如何从Temporary Table SELECT

获取记录

2 个答案:

答案 0 :(得分:0)

使用PDO,您应该一次执行一个查询。它不像SQL控制台那样可以同时推送一堆语句。

您希望检查每个查询是否已成功完成,然后再转到下一个查询。如果将其拆分为多个prepare / execute对,它将按原样运行。第二个成功的原因是因为它包含一个语句。

答案 1 :(得分:0)

  

PHP PDO fetchAll()在选择临时表

时返回空数组

显然,这不是真的。任何人都可以使用临时表运行以下代码并查看结果

$pdo->query("CREATE temporary TABLE tmptest (id int auto_increment primary key, name varchar(255))");
$stmt = $pdo->prepare("INSERT INTO tmptest VALUES (NULL, ?)");
foreach (['Sam','Bob','Joe'] as $name)
{
    $stmt->execute([$name]);
}

$stmt = $pdo->prepare("SELECT * FROM tmptest");
$stmt->execute();

var_export($stmt->fetchAll(PDO::FETCH_KEY_PAIR));

输出预期的

array (
  1 => 'Sam',
  2 => 'Bob',
  3 => 'Joe',
)

虽然您的问题来自于您在单个调用中运行多个查询这一事实,因此第一个fetchAll()自然会返回空结果,因为第一个查询不返回任何内容。要获取数据,您应该在单独的语句中运行查询,或move the internal pointer to the next result然后调用fetchAll():

$pdo->query("CREATE temporary TABLE tmptest (id int auto_increment primary key, name varchar(255))");
$pdo->query("CREATE temporary TABLE tmptest2 (id int auto_increment primary key, name varchar(255))");
$stmt = $pdo->prepare("INSERT INTO tmptest VALUES (NULL, ?)");
foreach (['Sam','Bob','Joe'] as $name)
{
    $stmt->execute([$name]);
}
$stmt = $pdo->prepare("INSERT INTO tmptest2 SELECT * from tmptest;SELECT * FROM tmptest2");
$stmt->execute();
$stmt->nextRowset();
var_export($stmt->fetchAll(PDO::FETCH_KEY_PAIR));