Прежде, чем это будет закрыто как дубликат из-под контроля, позвольте мне сказать, что есть несколько вопросов, которые задают это по переполнению стека, но ни один из них не помечал ответы, и неотмеченные не работали для меня.
В моей базе данных MySql у меня есть простая процедура:
DELIMITER //
CREATE PROCEDURE foo (
IN a INT,
OUT b INT
) BEGIN
SELECT a INTO b;
END //
DELIMITER ;
Если я вызываю это в phpMyAdmin, я получаю то, что ожидаю:
SELECT 2 INTO @b;
CALL foo(1, @b);
SELECT @b;
| @b |
+----+
| 1 |
Когда я пытаюсь вызвать это из моего php-кода, однако, stmt->execute()
возвращает false
.
$a = 1;
$pdoLink = get_pdo_connection($db);
$stmt = $pdoLink->prepare('CALL `mydb`.`foo`(:a, :b)');
$stmt->bindParam(':a', $a);
$stmt->bindParam(':b', $b, PDO::PARAM_INT, 4);
// I've also tried length values of 1, 2, and 16
$stmt->execute(); // returns false
Я подумал, что это может быть связано с вызовом процедуры, поэтому я заменил свойпроцедура с:
DELIMITER //
CREATE PROCEDURE foo (
IN a INT,
IN b INT
) BEGIN
SELECT a, b;
END //
DELIMITER ;
Это, однако, работает с php, поэтому оно должно быть связано с выходными параметрами.Я использую код, который немного отличается от Документация PDO , поэтому я действительно понятия не имею, что с ним не так.
Я не глядядля ответа, который использует mysqli multi_query
, чтобы сделать что-то вроде
$sql = "CALL `mydb`.`foo`(1, @b);
SELECT @b;";
$link->multi_query($sql);
// ...
Я ищу, как сделать это, используя PDO и один запрос.
Кто-то пытался пометить это как дубликат Вызов хранимой процедуры с параметром Out с использованием PDO .Отмеченный ответ на этот вопрос использует несколько запросов .