我已经看到了这个问题问的时候负荷,但他们都真的很长了,我自己在做什么......所以,就不能回避我的头,可能有人告诉我怎么走LAST_INSERT_ID(),从这个使用PDO将过程转换为php:
LAST_INSERT_ID()
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
$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年到2013年。这是新的错误报告:从2013年至今。
有多种方法可以返回答案,我找到了其中一种并进行了演示…
“技巧”是从“ mysql”过程获取输出。这是一个“两阶段”过程。
第一部分是使用您的输入来运行该过程,并告诉它要在其中存储结果的MYSQL变量。
然后,您运行一个单独的查询来“选择”那些“ mysql”变量。
在这里很清楚地描述了它:php-calling-mysql-stored- procedures
更新(2017年1月):
这是一个示例,显示Mysql过程参数的“ IN”,“ INOUT”和“ OUT”变量的用法。
在我们开始之前,有一些技巧:
当您尝试将变量绑定到INOUT和OUT参数时,会遇到一些非常奇怪的运行时错误。
像往常一样,我倾向于提供比要求更多的评论;-/
运行时环境(XAMPP):
源代码:
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$$
数据库连接:
$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 相同。
EMULATE_PREPARES
设置将要使用的所有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);
绑定PHP变量并设置SQL变量:
$ stmt-> bindParam(’:phpInParam’,$ phpInParam,PDO :: PARAM_INT);
$ db-> exec(“ 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"