在此之前已关闭的重复伸出手,让我说,有一些问这个堆栈溢出的一些问题,但他们都没有标明答案,无人盯防的人并没有为我工作。
在我的MySQL数据库,我有一个简单的方法:
DELIMITER //
CREATE PROCEDURE foo (
IN a INT,
OUT b INT
) BEGIN
SELECT a INTO b;
END //
DELIMITER ;
如果我把这个在phpMyAdmin,我得到了我期望:
SELECT 2 INTO @b;
CALL foo(1, @b);
SELECT @b;
| @b |
+----+
| 1 |
当我试图从我的PHP代码中调用这一点,但是,stmt->execute()
返回false
。
$a = 1;
$pdoLink = get_pdo_connection($db);
$stmt = $pdoLink->prepare('CALL `mydb`.`foo`(:a, :b)');
$stmt->bindParam(':a', $a);
$stmt->bindParam(':b', $b, PDO::PARAM_INT, 4);
// I've also tried length values of 1, 2, and 16
$stmt->execute(); // returns false
我想,也许它与调用摆在首位的程序做的,所以我代替我的程序有:
DELIMITER //
CREATE PROCEDURE foo (
IN a INT,
IN b INT
) BEGIN
SELECT a, b;
END //
DELIMITER ;
然而,这也从PHP工作,所以它必须具有输出参数做一些事情。我使用的唯一稍微从PDO Documentation改变代码,所以我真的不知道有什么不妥的地方。
我不是在寻找使用的mysqli的multi_query
做类似的答案
$sql = "CALL `mydb`.`foo`(1, @b);
SELECT @b;";
$link->multi_query($sql);
// ...
我在寻找如何做到这一点使用PDO和单个查询。
有人想纪念这个作为Calling stored procedure with Out parameter using PDO的副本。标记这个问题的答案使用多个查询。
你说你使用phpMyAdmin来测试您的查询工作,但phpMyAdmin是建立在PHP和使用MySQL改进,所以这个问题是不是PHP。或者更好的,能够使用MySQL谈谈你必须要经过解释PHP和系统库之间的数据的驱动器;通常的libmysql,该接口与MySQL服务器。这一切都太复杂!在网络上的许多信息,比如设置PDO :: ATTR_EMULATE_PREPARES为false,防止PHP模拟传递给查询参数的准备。其他信息,总是从网上取,他们说,只有做到这一点,如果PHP是通过PHP5-mysqlnd模块编译。在实践中我发现对我来说最好的办法是投携带非字符串值的变量。所以,你的代码可能成为
...
$stmt->bindParam(':a', (int)$a);
$stmt->bindParam(':b', (int)$b, PDO::PARAM_INT, 4);
...
我的两分钱