使用PDO从mysql

时间:2019-02-04 02:57:42

标签: php mysql pdo

在将其作为重复副本关闭之前,我要说在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的副本。该问题的标记答案使用多个查询

1 个答案:

答案 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); ...

我的两分钱

相关问题