gpt4 book ai didi

php - 使用准备好的语句和存储过程获取 InsertId?

转载 作者:行者123 更新时间:2023-11-29 21:03:47 25 4
gpt4 key购买 nike

我有一些使用 mysqli 在 PHP 中工作的准备语句。需求发生了变化,现在我应该将它们作为存储过程移至数据库。这对于大多数 PS 来说效果很好,除了一些读取 insertId 进行进一步处理的 PS。例如:

$idAsdf = $stmtAsdf->insert_id;

其中 PS 执行 INSERT 操作。我尝试在过程中使用 OUT 参数,该参数在 PHPMyAdmin 上运行良好,但无法将其与数据库外部的 PHP 服务器代码连接。我还没有找到任何这种元素组合的例子。如何同时使用 SP 和 PS 来获取此 insertId?

谢谢

最佳答案

对于 PDO 准备语句,您可以使用 PDO::lastInsertId - http://php.net/manual/en/pdo.lastinsertid.php

<?php 
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');

$stmt = $dbh->prepare("INSERT INTO test (name, email) VALUES(?,?)");

try {
$dbh->beginTransaction();
$tmt->execute( array('user', 'user@example.com'));
print $dbh->lastInsertId();
$dbh->commit();
} catch(PDOExecption $e) {
$dbh->rollback();
print "Error!: " . $e->getMessage() . "</br>";
}
} catch( PDOExecption $e ) {
print "Error!: " . $e->getMessage() . "</br>";
}
?>

只要记住使用事务时返回lastInsertId或在提交之前存储lastInsertId即可。

对于存储过程 - 使用 LAST_INSERT_ID();

BEGIN
INSERT INTO test (name, email) VALUES ('value1', 'value2');
SET out_param = LAST_INSERT_ID();
END

编辑 1:

如果您使用 MySQLi - 则使用 mysqli_insert_id - http://php.net/manual/en/mysqli.insert-id.php

$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}

$stmt = mysqli->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);

// set parameters and execute
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();

printf ("New Record has id %d.\n", $stmt->insert_id);

/* close connection */
$mysqli->close();

如果遇到 out_param 问题,请使用 select 返回最后一个插入 id 作为结果。

BEGIN
DECLARE last_id INT DEFAULT 0;
INSERT INTO test (name, email) VALUES ('value1', 'value2');
SET last_id = LAST_INSERT_ID();
SELECT last_id;
END

编辑2:

如果您在检索存储过程结果集时遇到问题,请使用以下代码 -

if ($mysqli->multi_query($query)) {
do {
/* store first result set */
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}
$result->free();
}
/* print divider */
if ($mysqli->more_results()) {
printf("-----------------\n");
}
} while ($mysqli->next_result());
}

要访问输出参数,请使用以下代码 -

// execute the stored Procedure
// @uid - IN param, @userCount - OUT param
$result = $connect->query('call IsUserPresent(@uid, @userCount)');

// getting the value of the OUT parameter
$r = $connect->query('SELECT @userCount as userCount');
$row = $r->fetch_assoc();

$toRet = ($row['userCount'] != 0);

关于php - 使用准备好的语句和存储过程获取 InsertId?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36991851/

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