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'];