【发布时间】:2018-06-05 11:13:24
【问题描述】:
这里有一个例子:
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;
结束;
【问题讨论】:
-
错误报告和 pdo 错误处理的任何内容?
-
@FunkFortyNiner 没有错误 php 中的结果是好的,但是数组是空的。
-
我怀疑问题在于该过程返回的列数取决于第一个
SELECT是否返回某些内容。 -
尝试更改
IF,使其返回与第一个查询相同的列数。 -
@Barmar 所以你建议使用
NULL AS real_fields .... 'NO_RESULT' AS RESULT?
标签: php mysql stored-procedures pdo