Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP存储过程参数_Php_Mysql_Stored Procedures_Mysqli - Fatal编程技术网

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)
                        ^