我使用mysqli在PHP中使用了一些Prepared Statements。需求已更改,现在我应该将它们作为存储过程移动到数据库中。这适用于大多数PS,除了一对读取insertId以进行进一步处理的情况。 例如:
public Maze(File f) throws Exception {
PS执行INSERT操作。 我已经尝试在PHPMyAdmin上正常使用的过程中使用OUT参数,但无法将其与DB外部的PHP服务器代码连接。我还没有找到任何这种元素组合的例子。如何使用SP和PS获取此insertId?
由于
答案 0 :(得分:0)
outParam = LAST_INSERT_ID();
LAST_INSERT_ID()
返回基于每个连接在服务器中维护的最近生成的ID。
答案 1 :(得分:0)
对于PDO Prepared Statement,您可以使用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());
}
要访问out param,请使用以下代码 -
// 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);
答案 2 :(得分:0)
insert_id
is a property of mysqli class,当你试图从一个语句对象中获取它时。