存储过程的php PDO结果为空

存储过程的php PDO结果为空,php,mysql,stored-procedures,pdo,Php,Mysql,Stored Procedures,Pdo,以下是一个例子: SQL: PHP: 奇怪的是,如果我从phpmyadmin接口执行程序my_sp(),该程序就会正常工作。我得到: RESULTS = ZERO_REZULTS 编辑: CREATE PROCEDURE my_sp( IN in_var VARCHAR(32) ) BEGIN SET @user_invar = in_var; SET @query = "SELECT * FROM my_table WHERE my_column = ? LIMIT 1;"; P

以下是一个例子:

SQL:

PHP:

奇怪的是,如果我从phpmyadmin接口执行程序my_sp(),该程序就会正常工作。我得到:

RESULTS = ZERO_REZULTS
编辑:

CREATE PROCEDURE my_sp(
  IN in_var VARCHAR(32)
)
BEGIN

SET @user_invar = in_var;

SET @query = "SELECT * FROM my_table  WHERE my_column = ? LIMIT 1;";

PREPARE stmt FROM @query;
EXECUTE stmt USING @user_invar;
SET @founded_rows = FOUND_ROWS();
IF(@founded_rows = 0)THEN
    SELECT 'ZERO_REZULTS' AS RESULTS;
END IF;  
DEALLOCATE PREPARE stmt;
除了@Bill Karwin答案之外,要按照规定工作,程序必须在stmt内有最后一个
选择
,如下所示:

CREATE PROCEDURE my_sp(
  IN in_var VARCHAR(32)
)
BEGIN

SET @user_invar = in_var;

SET @query = "SELECT * FROM my_table  WHERE my_column = ? LIMIT 1;";

PREPARE stmt FROM @query;
EXECUTE stmt USING @user_invar;
SET @founded_rows = FOUND_ROWS();
IF(@founded_rows = 0)THEN
    SELECT 'ZERO_REZULTS' AS RESULTS;
END IF;  
DEALLOCATE PREPARE stmt;

结束

建议查询需要相同数量的列不是问题所在。存储的进程生成多个不同的结果集,而不是联合

第一次选择产生一个零行的结果集。即使此行集为“空”,您仍必须使用
fetchAll()
,然后必须使用
nextRowset()
前进到程序返回的下一行集

$dbh = new PDO( $connection_params );

$sql = "CALL my_sp( :in_var )";
$stmt = $dbh->prepare( $sql );
$stmt->execute( array( ':in_var' => $_POST['in_var'] ) );

do {
    $rowset = $stmt->fetchAll(PDO::FETCH_ASSOC);
    if ($rowset) {
        ...do something with rowset...
    }
} while ($stmt->nextRowset());

另请参见:

错误报告和pdo错误处理的任何内容?@FunkFortyNiner php中的无错误结果可以,但数组为空。我怀疑问题在于,根据第一个
SELECT
是否返回内容,该过程返回的列数不同。请尝试更改
IF
,使其返回相同的列数作为第一个查询的列数。@Barmar,因此您建议使用
NULL作为实\u字段….'没有结果作为结果
?这是有道理的。是的,这是答案,但只有一点观察:要工作,mi示例中的最后一个
选择
必须在stmt内,而不是之后。If在后面(如mi最初的问题中),结果仍然为空,但如果我将它们放在stmt中(就在
DEALLOCATE PREPARE stmt;
之前),则效果良好
$dbh = new PDO( $connection_params );

$sql = "CALL my_sp( :in_var )";
$stmt = $dbh->prepare( $sql );
$stmt->execute( array( ':in_var' => $_POST['in_var'] ) );

do {
    $rowset = $stmt->fetchAll(PDO::FETCH_ASSOC);
    if ($rowset) {
        ...do something with rowset...
    }
} while ($stmt->nextRowset());