gpt4 book ai didi

php - MySQL 从 PHP PDO 中的存储过程中检索变量

转载 作者:可可西里 更新时间:2023-11-01 06:37:50 25 4
gpt4 key购买 nike

我已经看到这个问题被问过很多次了,但它们都很长,而且我无法理解他们在做什么......所以,有人可以告诉我如何获得使用 PDO 将此过程中的 LAST_INSERT_ID() 转换为 php:

表格:

CREATE TABLE names (
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name varchar(50) NOT NULL
)

程序:

CREATE DEFINER=`root`@`localhost` PROCEDURE `simpleProcedure`(newname varchar(50), OUT returnid INT(11))
BEGIN
INSERT INTO names (name) VALUES (newname);
SET returnid = LAST_INSERT_ID();
END

我试过的 PHP 代码:

$stmt=$db->prepare("CALL simpleProcedure(:name,:returnid)");
$stmt->bindValue(':name',$name,PDO::PARAM_STR);
$stmt->bindParam(':returnid',$returnid,PDO::PARAM_INT,11);
$stmt->execute();
echo $returnid;

但是,对于脑细胞比我多的人来说可能很明显,这是行不通的。任何帮助表示赞赏。

关于我认为这应该有效的原因的引用:

http://www.php.net/pdo.prepared-statements (示例 #4)

最佳答案

事实证明,这是一个已经存在很长时间的错误......从 2005 年开始!

这是原始错误报告:2005 through to 2013 .这是新的错误报告:From 2013 to the present .

有多种方法可以返回答案,我找到了其中一种并进行了演示...

“技巧”是从“mysql”过程中获取输出。这是一个“两阶段”过程。

  • 第一部分是使用您的输入运行该过程,并告诉它要将结果存储在哪些 MYSQL 变量中。

  • 然后,您运行一个单独的查询来“选择”那些“mysql”变量。

这里描述的很清楚:php-calling-mysql-stored-procedures

更新(2017 年 1 月):

这是一个示例,显示了“IN”、“INOUT”和“OUT”Mysql 过程参数变量的使用。

在我们开始之前有一些提示:

  • 开发时:在“模拟模式”下运行 PDO,因为它在确定过程调用中的错误时更加可靠。
  • 仅将 PHP 变量绑定(bind)到过程“IN”参数。

当您尝试将变量绑定(bind)到 INOUT 和 OUT 参数时,您会遇到一些非常奇怪的运行时错误。

像往常一样,我倾向于提供比要求更多的评论;-/

运行时环境 (XAMPP):

  • PHP:5.4.4
  • MySQL: 5.5.16

源代码:

SQL 代码:

CREATE PROCEDURE `demoSpInOutSqlVars`(IN     pInput_Param  INT, /* PHP Variable will bind to this*/   
/* --- */
INOUT pInOut_Param INT, /* contains name of the SQL User variable that will be read and set by mysql */
OUT pOut_Param INT) /* contains name of the SQL User variable that will be set by mysql */
BEGIN
/*
* Pass the full names of SQL User Variable for these parameters. e.g. '@varInOutParam'
* These 'SQL user variables names' are the variables that Mysql will use for:
* 1) finding values
* 2) storing results
*
* It is similar to 'variable variables' in PHP.
*/
SET pInOut_Param := ABS(pInput_Param) + ABS(pInOut_Param); /* always positive sum */
SET pOut_Param := ABS(pInput_Param) * -3; /* always negative * 3 */
END$$

PHP代码:

数据库连接:

$db = appDIC('getDbConnection', 'default'); // get the default db connection
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

注意:输出与 EMULATE_PREPARES = false 相同。

设置将要使用的所有 PHP 变量:

$phpInParam     = 5;                  
$phpInOutParam = 404; /* PHP InOut variable ==> read and should be changed */
$phpOutParam = null; /* PHP Out variable ==> should be changed */

定义和准备 SQL 过程调用:

$sql = "call demoSpInOut(:phpInParam, 
@varInOutParam, /* mysql variable name will be read and updated */
@varOutParam)"; /* mysql variable name that will be written to */

$stmt = $db->prepare($sql);

绑定(bind) PHP 变量和设置 SQL 变量:

  • 1) 绑定(bind) PHP 变量

    $stmt->bindParam(':phpInParam', $phpInParam, PDO::PARAM_INT);

  • 2) 设置 SQL 用户 INOUT 变量

    $db->e​​xec("SET @varInOutParam = $phpInOutParam");//这是安全的,因为它只是将值设置到 MySql 变量中。

执行程序:

$allOk = $stmt->execute();

获取 SQL 变量到 PHP 变量中:

$sql = "SELECT @varInOutParam AS phpInOutParam,
@varOutParam AS phpOutParam
FROM dual";
$results = current($db->query($sql)->fetchAll());

$phpInOutParam = $results['phpInOutParam'];
$phpOutParam = $results['phpOutParam'];

注意:可能不是最好的方法;-/

显示 PHP 变量

"$phpInParam:"     => "5"
"$phpInOutParam:" => "409"
"$phpOutParam:" => "-15"

关于php - MySQL 从 PHP PDO 中的存储过程中检索变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23747835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com