PHP: вызов хранимой процедуры MySQL с параметрами INPUT AND OUTPUT (НЕ «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) и заставить все работать правильно.

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

К сожалению, 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']; по $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'];