繁体   English   中英

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

[英]php PDO result from stored procedure are empty

这是一个例子:

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里面有最后一个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;

结束;

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

第一个SELECT生成零行的结果集。 你仍然需要fetchAll()来使用这个行集,即使它是“空的”。 然后你必须使用nextRowset()前进到proc返回的下一个rowset。

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

另见: http//php.net/manual/en/pdostatement.nextrowset.php

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM