在将其作为重复副本关闭之前,我要说在Stack Overflow上有几个问题要问这个问题,但是这些问题都没有标记的答案,而未标记的问题对我没有用。 / p>
在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的副本。该问题的标记答案使用多个查询。
答案 0 :(得分:0)
您说您使用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);
...
我的两分钱