PHP: вызов хранимой процедуры MySQL с входными и выходными параметрами (не " INOUT")

из PHP я хотел бы вызвать хранимую процедуру в MySQL. Процедура принимает на вход и выходные параметры -- не "INOUT" параметры.

для простого примера, скажем, у меня есть следующая хранимая процедура в MySQL:

DELIMITER $$

DROP PROCEDURE IF EXISTS `test_proc`$$
CREATE PROCEDURE `test_proc`(
    in input_param_1 int,
    in input_param_2 int,
    in input_param_3 int,
    out output_sum int,
    out output_product int,
    out output_average int
)
BEGIN
    set output_sum = input_param_1 + input_param_2 + input_param_3;
    set output_product = input_param_1 * input_param_2 * input_param_3;
    set output_average = (input_param_1 + input_param_2 + input_param_3) / 3;
END$$

DELIMITER ;

теперь, со стороны PHP-скрипта/страницы, скажем, у меня есть следующие переменные (мы назовем их "входными переменными proc"), которые я хочу передать хранимой процедуре как вход параметры, когда я называю его:

$procInput1 = "123";
$procInput2 = "456";
$procInput3 = "789";

предположим, что на стороне PHP-скрипта / страницы у меня также есть следующие переменные (мы назовем их "выходные переменные proc"), которые я хочу передать хранимой процедуре как выход параметры установлен хранимая процедура, когда я называю это:

$procOutput_sum;
$procOutput_product;
$procOutput_average;

Итак, по сути, на стороне PHP-скрипта / страницы, что я хочу сделать, по сути (Я понимаю, что следующий код не действительно), это...

call test_proc($procInput1, $procInput2, $procInput3, $procOutput_sum, $procOutput_product, $procOutput_average);

...и, после вызова, следующий PHP-код...

echo "Sum: ".$procOutput_sum;
echo "Product: ".$procOutput_product;
echo "Average: ".$procOutput_average;

...должен производить следующий вывод:

Sum: 1368
Product: 44253432
Average: 456

одно предостережение заключается в том, что, если это вообще возможно, я хотел бы иметь возможность сделать это с помощью MySQLi процедурные функции/интерфейс. Если это невозможно, то я могу заставить его работать, это то, что я буду использовать.

я программирую уже довольно давно, но язык PHP является относительно новое начинание для меня. Я нашел тонны учебников по вызову хранимых процедур MySQL из PHP. Некоторые из них являются учебниками по вызову хранимых процедур с помощью вход параметры, некоторые из них являются учебниками по вызову хранимых процедур с выход параметры, а некоторые-учебники по вызову хранимых процедур с помощью inout параметры. Я не нашел никаких руководств или примеров по вызову хранимых процедур, которые принимают и вход и выходные параметры в то же время, в частности не использование параметров "inout". У меня возникли проблемы с выяснением того, как кодировать привязки параметров (например: mysqli_stmt_bind_param и mysqli_stmt_bind_result) и заставить все это работать правильно.

любая помощь будет очень признательна, и я заранее благодарю!

2 ответов


К Сожалению, MySQLi не имейте любую родную поддержку выходных параметров sproc; вместо этого необходимо вывести в MySQL переменные пользователя а затем получить значения, используя отдельный SELECT заявление.

использование процедурного интерфейса:

$procInput1 = 123;
$procInput2 = 456;
$procInput3 = 789;

$mysqli = mysqli_connect();

$call = mysqli_prepare($mysqli, 'CALL test_proc(?, ?, ?, @sum, @product, @average)');
mysqli_stmt_bind_param($call, 'iii', $procInput1, $procInput2, $procInput3);
mysqli_stmt_execute($call);

$select = mysqli_query($mysqli, 'SELECT @sum, @product, @average');
$result = mysqli_fetch_assoc($select);
$procOutput_sum     = $result['@sum'];
$procOutput_product = $result['@product'];
$procOutput_average = $result['@average'];

или, используя объектно-ориентированный интерфейс:

$procInput1 = 123;
$procInput2 = 456;
$procInput3 = 789;

$mysqli = new mysqli();

$call = $mysqli->prepare('CALL test_proc(?, ?, ?, @sum, @product, @average)');
$call->bind_param('iii', $procInput1, $procInput2, $procInput3);
$call->execute();

$select = $mysqli->query('SELECT @sum, @product, @average');
$result = $select->fetch_assoc();
$procOutput_sum     = $result['@sum'];
$procOutput_product = $result['@product'];
$procOutput_average = $result['@average'];

вот вариант вышеуказанного ответа, PHP-код для вызова вашей хранимой процедуры MySQL:

require("/home/course/username/database/login.php"); //path to your login information file

$link = mysqli_connect($host, $user, $pass);
if (!$link) die("Couldn't connect to MySQL");

mysqli_select_db($link, $db)
or die("Couldn't open $db: ".mysqli_error($link));

$procInput1 = "123";
$procInput2 = "456";
$procInput3 = "789";

//Call stored procedure and insert query execution
$sql = "CALL test_proc($procInput1, $procInput2, $procInput3, @output_sum, @output_product, @output_average)";
if(mysqli_query($link, $sql)){
echo "Procedure test_proc records added/updated successfully.";
} else{
echo "ERROR: Couldn't execute $sql. " . mysqli_error($link);
}

$select = $mysqli->query('SELECT @output_sum, @output_product, @output_average');
$result = $select->fetch_assoc();
$procOutput_sum     = $result['@output_sum'];
$procOutput_product = $result['@output_product'];
$procOutput_average = $result['@output_average'];