Используя PDO, чтобы получить выходной параметр из хранимой процедуры в MySQL - PullRequest
0 голосов
/ 04 февраля 2019

Прежде, чем это будет закрыто как дубликат из-под контроля, позвольте мне сказать, что есть несколько вопросов, которые задают это по переполнению стека, но ни один из них не помечал ответы, и неотмеченные не работали для меня.

В моей базе данных 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 .Отмеченный ответ на этот вопрос использует несколько запросов .

1 Ответ

0 голосов
/ 04 февраля 2019

Вы говорите, что использовали phpMyAdmin для проверки работоспособности вашего запроса, но phpMyAdmin построен на PHP и использует mySQL Improved, поэтому проблема не в PHP.Или лучше, чтобы поговорить с MySQL, вы должны пройти через драйвер, который интерпретирует данные между PHP и системной библиотекой;обычно libmysql, это интерфейс с сервером MySQL.Это все слишком сложно!Многие сведения в Интернете, например, устанавливают для PDO :: ATTR_EMULATE_PREPARES значение false, чтобы PHP не эмулировал подготовку параметров, передаваемых в запрос.Другая информация, всегда извлекаемая из Интернета, говорят, что делать это можно только в том случае, если PHP скомпилирован с помощью модуля php5-mysqlnd.На практике я заметил, что лучший способ для меня - приводить переменные, которые содержат не строковые значения.Таким образом, ваш код может стать

... $stmt->bindParam(':a', (int)$a); $stmt->bindParam(':b', (int)$b, PDO::PARAM_INT, 4); ...

Мои два цента

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