PHP存储过程参数
我创建了一个测试数据库,如下所示:PHP存储过程参数,php,mysql,stored-procedures,mysqli,Php,Mysql,Stored Procedures,Mysqli,我创建了一个测试数据库,如下所示: USE test; DROP TABLE IF EXISTS test; DROP PROCEDURE IF EXISTS testparams; CREATE TABLE test ( inparm INT, inoutparam INT, outparm INT ); INSERT INTO test VALUES (0, 0, 0); DELIMITER $$ CREATE PROCEDURE testparams(IN i INT, I
USE test;
DROP TABLE IF EXISTS test;
DROP PROCEDURE IF EXISTS testparams;
CREATE TABLE test
(
inparm INT,
inoutparam INT,
outparm INT
);
INSERT INTO test VALUES (0, 0, 0);
DELIMITER $$
CREATE PROCEDURE testparams(IN i INT, INOUT io INT, OUT o INT)
BEGIN
UPDATE test SET inoutparm = io + 1, outparm = FLOOR(RAND() * 1000)
WHERE inparm = i;
SELECT outparm INTO o FROM test WHERE inparm = i;
SELECT inoutparam INTO io FROM test WHERE inparm = i;
END $$
我还有一个PHP脚本:
<?php
$c = new mysqli('localhost', 'test', 'test', 'test') or die('Cannot connect');
echo "Connected\n";
$in = 0;
$out = -1;
$inout = 3;
echo "In: $in Out: $out: Inout: $inout\n";
$s = $c->prepare('CALL testparams(?, ?, ?)') or die('Unable to prepare: ' . $c->error);
$s->bind_param('iii', $in, $inout, $out);
#$s->bind_result($out, $inout);
$s->execute();
echo "After execute SP\nIn: $in Out: $out: Inout: $inout\n";
echo "End of SP\n";
$s = $c->prepare('SELECT inparm, inoutparam, outparm FROM test');
# $s->bind_result($in, $inout, $out); - Get a error here
$s->execute();
while ($s->fetch())
{
echo "In: $in Out: $out: Inout: $inout\n";
}
?>
<?php
$c = new mysqli('localhost', 'test', 'test', 'test') or die('Cannot connect');
echo "<pre>Connected<br>";
$in = 0;
$out = -1;
$inout = 3;
echo "Before executing SP<br>In: $in Inout: $inout Out: $out<br>";
$s = $c->prepare('SET @i = ?, @io = ?') or die('Unable to prepare: ' . $c->error);
$s->bind_param('ii', $in, $inout);
$s->execute();
$s = $c->prepare("CALL testparams(@i, @io, @o)") or die('Unable to prepare: ' . $c->error);
$s->execute();
$s = $c->prepare('SELECT @io, @o');
$s->execute();
$s->bind_result($inout, $out);
$s->fetch();
echo "After execute SP<br>In: $in Inout: $inout Out: $out<br>";
echo "End of SP<br></pre>";
?>
“sss”应该是“iii”,因为您处理的是整数,而不是字符串 对于使用提供MySQL接口的语言编写的程序, 没有本机方法可直接检索OUT的结果 或从CALL语句中输入参数。要获取参数值, 将用户定义的变量传递给CALL语句中的过程,然后 然后执行SELECT语句以生成包含 变量值。要处理INOUT参数,请执行语句 在将相应的用户变量设置为 要传递给过程的值 这在MySQL 5.6中似乎有所改变 在MySQL 5.6中,C程序可以使用prepared语句接口 执行CALL语句并访问OUT和INOUT参数。。。 提供MySQL接口的语言可以使用prepared调用 语句直接检索OUT和INOUT过程参数。 那就行了 顺便说一句,SP中有一个输入错误。这一行
UPDATE test SET inoutparam = io + 1, outparm = FLOOR(RAND() * 1000)
^
应该是
我认为
$s->bind_param('sss',$in,$inout,$out
);应该是
$s->bind_参数('iii',$in,$inout,$out)
您的意思可能是从测试中选择inoutparam进入io,其中inparm=i;这里是io而不是o。谢谢-做了改变-我错了。但仍然不起作用。这些是表的列名-该位起作用并检索表的内容。不起作用的部分是调用SP。实际上不起作用-服务器不是5.6。但这是一次勇敢的努力。不过我有一个可能的解决办法,今天晚些时候我会再看一看。也许我在代码中做错了什么(这比示例要复杂一点)。不管怎样,我还是要在雪地里工作。祝你好运。让我知道。你的例子和我的另一个例子在我的机器上运行得很好,所有东西都能正确地传入和传出。哦,阿米尔,谢谢。更新了更改-我是从一个更复杂的示例构建的。但是在那次更改之后,out/inout参数不会更改。我已经进行了更新-但是存储过程的out/inout参数不起作用。
UPDATE test SET inoutparm = io + 1, outparm = FLOOR(RAND() * 1000)
UPDATE test SET inoutparam = io + 1, outparm = FLOOR(RAND() * 1000)
^