来自存储过程的php PDO结果为空

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了来自存储过程的php PDO结果为空相关的知识,希望对你有一定的参考价值。

这是一个例子:

SQL:

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

     -- This is to avoiding the next problem:
     -- If I USE bellow: EXECUTE USING in_var NOT WORK
     -- But IF I USE: EXECUTE USING @user_invar WORKING GOOD
     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();
    DEALLOCATE PREPARE stmt;

    IF(@founded_rows = 0)THEN
        SELECT 'ZERO_REZULTS' AS RESULTS;
    END IF;  
END;

php

$dbh = new PDO( $connection_params );

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

//No errors but $rows is an empty array if @founded_rows is 0
//espected RESULTS = ZERO_REZULTS

奇怪的是,如果我从phpmyadmin接口执行程序my_sp(),那么程序就像预期的那样工作。我有:

RESULTS = ZERO_REZULTS

编辑:

除了@Bill Karwin的回答,为了按预期工作,程序必须在stmt里面有最后一个qazxsw poi:

SELECT

结束;

答案

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

第一个SELECT生成零行的结果集。你仍然需要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()前进到proc返回的下一个rowset。

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());

以上是关于来自存储过程的php PDO结果为空的主要内容,如果未能解决你的问题,请参考以下文章

PHP PDO:存储过程返回空结果

无法使用 PHP PDO 获取 SQL Server 打印消息

php pdo调用SQLServer存储过程无法获取返回结果

PHP Mysql PDO查询来自foreach存储的多个值以供输出

从 MS SQL 中的 PHP PDO 存储过程中返回 Select *

来自带有 PDO 的存储过程的特定错误代码(在 Zend Framework 2 中)