вызов хранимой процедуры дважды, возвращающий один и тот же результат, почему? - PullRequest
0 голосов
/ 31 декабря 2018

Я сохранил процедуру в 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

1 Ответ

0 голосов
/ 31 декабря 2018

Я удивлен, что это возвращает что-то с тем, что вы показали.Ваша переменная $id, вероятно, содержала 102 перед инструкцией ->prepare

Я предполагаю, что ваш SP принимает идентификатор страны на входе в переменную с именем country_id, которую вы не показали

Чтобы заставить это работать, вы должны подготовить, связать и выполнить 2 раза:

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...