获取带有准备语句和存储过程的InsertId?

时间:2016-05-02 21:17:57

标签: php mysql mysqli

我使用mysqli在PHP中使用了一些Prepared Statements。需求已更改,现在我应该将它们作为存储过程移动到数据库中。这适用于大多数PS,除了一对读取insertId以进行进一步处理的情况。 例如:

public Maze(File f) throws Exception {

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

由于

3 个答案:

答案 0 :(得分:0)

在SP内部,您可以设置为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,当你试图从一个语句对象中获取它时。