php - 调用存储过程两次返回相同的结果,为什么?

标签 php mysql stored-procedures pdo

我在 mysql 中有存储过程:sp_get_country_by_id

BEGIN
SELECT id, name FROM countries WHERE id = country_id;
END

我使用 PDO 来调用它,如下所示:

$stmt1 = $dbh->prepare("CALL sp_get_country_by_id(?)");
$stmt1->bindParam(1, $id);

$id = 102;
$stmt1->execute();
print_r($stmt1->fetch(PDO::FETCH_ASSOC));

$id = 103;
$stmt1->execute();
print_r($stmt1->fetch(PDO::FETCH_ASSOC));

返回结果如下:

Array
(
    [id] => 102
    [name] => Indonesia
)

预计返回两个数组,如下所示:

Array ( [id] => 102 [name]=>Indonesia)
Array ( [id] => 103 [name]=>Iran)

根据评论,我在这里添加存储过程:

CREATE PROCEDURE `sp_get_country_by_id`(IN `country_id` INT)
BEGIN
SELECT id, name FROM countries WHERE id = country_id;
END

我正在遵循这个例子。使用 INSERT 进行示例解释,我正在尝试 SELECT

http://php.net/manual/en/pdo.prepared-statements.php#example-1028

最佳答案

我很惊讶它会返回您所显示的内容。您的 $id 变量在 ->prepare 指令之前可能包含 102

我假设您的 SP 在输入中采用名为 country_id 的变量(您尚未显示)中的国家/地区 ID

为了让它发挥作用,您应该准备、绑定(bind)和执行两次:

$stmt1 = $dbh->prepare("CALL sp_get_country_by_id(?)");
$id = 102;
$stmt1->bindParam(1, $id);
$stmt1->execute();
print_r($stmt1->fetch(PDO::FETCH_ASSOC));


$stmt1 = $dbh->prepare("CALL sp_get_country_by_id(?)");
$id = 103;
$stmt1->bindParam(1, $id);
$stmt1->execute();
print_r($stmt1->fetch(PDO::FETCH_ASSOC));
<小时/>

但是如果您必须多次执行此操作,最好为其创建一个函数:

print_country_data_array(102);
print_country_data_array(103);


function print_country_data_array($countryID){

    global $dbh;

    $stmt1 = $dbh->prepare("CALL sp_get_country_by_id(?)");
    $stmt1->bindParam(1, $countryID);
    $stmt1->execute();
    print_r($stmt1->fetch(PDO::FETCH_ASSOC));

}

关于php - 调用存储过程两次返回相同的结果,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53984807/

相关文章:

php - 是否可以将这些文件上传到 MySQL 数据库?

c# - 将数组从 C# 传递到 Oracle 过程

javascript - Dropzone.js "Undefined index: file"如何与 Laravel 一起使用?

多个值的 PHP jQuery 倒计时

javascript - Node.JS 异步调用mySql

php - ElasticSearch,如何按其他字段排序聚合?

tsql - 存储过程似乎没有解释就挂了

sql - 如何在内部查询中使用 order by 子句

php - Symfony2 从表单类型模板附加 javascript 文件

php - 如何使用 PHP PDO 将未知数量的字段作为行插入