这个问题我已经被问过很多次了,但是它们都很长,我就是不明白它们在做什么……所以,有人能告诉我如何从这个过程中获得LAST_INSERT_ID()
使用PDO进入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)
原来这是一个已经存在了很长时间的bug…自2005年以来!
这是最初的bug报告:2005年到2013年。以下是新的bug报告:从2013年到现在。
有多种方法可以获得返回的答案,我找到了其中一种并演示了它…
这个"技巧"是为了从"mysql"过程中获得输出。这是一个"两阶段"的过程。
第一部分是用你的输入运行这个过程,并告诉它要将结果存储在哪些MYSQL变量中。
然后,你运行一个单独的查询'select'那些'mysql'变量
这里描述得很清楚:php-calling-mysql-stored-procedures
更新(2017年1月):
下面是一个示例,显示了Mysql过程参数'IN', 'INOUT'和'OUT'变量的使用。
在我们开始之前,这里有一些提示:
- 开发时:在"仿真模式"下运行PDO,因为它在确定过程调用中的错误时更可靠。
- 只将PHP变量绑定到过程'IN'参数。
当你尝试将变量绑定到INOUT和OUT参数时,你会得到一些非常奇怪的运行时错误。
像往常一样,我倾向于提供比需要更多的注释;-/
运行环境(XAMPP):
- PHP: 5.4.4 Mysql: 5.5.16
源代码:
- <
- SQL过程/gh>PHP输出
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 Connection:
$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);
绑定PHP变量和设置SQL变量:
1)绑定PHP变量
->美元支撑bindParam (: phpInParam, phpInParam美元,PDO:: PARAM_INT);
2)设置SQL User INOUT变量
$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"
让我先说一下这是一个猜测,因为我从不使用准备好的语句…
通常你不绑定返回值,你这样做
$status = $statement->execute( );
$resultArray = $statement->fetchAll( );
$statement->closeCursor( );
if (!is_array($resultArray)) {
return array();
}
return $resultArray[0]['returnid'];