0

我有一个创建课程的功能。我正在尝试获取最后插入 ID,但它不起作用:

public  function createCourse()
{
    require "/mysqli_connect.php";
    $course_q = "INSERT INTO course (....) VALUES (.....)";

    $course_r = mysqli_query($mysqli, $course_q);
    $course_n = mysqli_affected_rows($mysqli);
    if($course_n == 1)
    {
        mysqli_close($mysqli);
        return true;
    }
    mysqli_close($mysqli);
    return false;
}

这是检索我在与函数 createCourse 相同的类中创建的最后一个插入 ID 的函数:

public function getLastInsertID()
{
    require "/../mysqli_connect.php";

    $course_q= "SELECT LAST_INSERT_ID()";

    $course_r = mysqli_query($mysqli, $course_q);
    $course_n = mysqli_num_rows($course_r);

    //var_dump($course_n);
    if($course_n)
    {
        $c = mysqli_fetch_assoc($course_r);
        mysqli_close($mysqli);

        return $c;
    }
    mysqli_close($mysqli);
    return NULL;
}   

这就是我调用函数的方式:

require "/mysqli_connect.php";
$course = new Course();
$c = $course->createCourse();
$id = $course->getLastInsertID();
var_dump($id);

"$id"总是"int(0)"

我也试过:

require "/mysqli_connect.php";
$course = new Course();
$c = $course->createCourse();
**$id = mysqli_insert_id($mysqli);**

我也试过:

$course_q= "SELECT LAST_INSERT_ID() from course";

但这也行不通。大家能看出是什么问题吗?:( 函数 createCourse 本身很好。它创建了我需要的内容,并且它在数据库中,但我无法获得最后一个插入 ID。

4

3 回答 3

3

尽管使用 MySQLi 检索插入 id 的正确方法是使用mysqli_insert_id(),但由于您正在执行关联提取,因此您需要为LAST_INSERT_ID()

 $course_q= "SELECT LAST_INSERT_ID() AS insert_id";

 // Later...
 $c = mysqli_fetch_assoc($course_r);
 echo $c['insert_id'];

但是,这行不通,因为您已经mysqli_close()createCourse()函数中关闭了与的连接。相反,获取插入 idcreateCourse()并返回它。

public  function createCourse()
{
    // Note: You should not establish the connection in each function call.
    // it only needs to be done once per script, and you can pass the connection
    // into the class constructor or into methods that use it.
    require "/mysqli_connect.php";
    $course_q = "INSERT INTO course (....) VALUES (.....)";

    $course_r = mysqli_query($mysqli, $course_q);
    $course_n = mysqli_affected_rows($mysqli);
    if($course_n == 1)
    {
        // Get the insert id before closing the connection
        $insert_id = mysqli_insert_id($mysqli);


        // Note that there probably isn't a good reason to explicitly close the
        // connection here.  It will be closed when the script terminates.
        mysqli_close($mysqli);

        // And return it.
        return $insert_id;
    }
    mysqli_close($mysqli);
    return false;
}

require "/mysqli_connect.php";
$course = new Course();
$c = $course->createCourse();
echo $c;
// $c contains the id

设计类以使用一种通用连接:

该类在其构造函数中接收一个连接。

// Make classes accept the connection as a param:
class MyClass
{
  // property to hold the connection object
 public $db;

  // constructor receives the connection
  public function __construct($connection) {
    $this->db = $connection;
  }
  
  // Methods call it as $this->db
  public function createCourse() {
    $course_r = mysqli_query($this->db, $course_q);
  }
      
}

在控制脚本中仅包含一次连接

require_once("/mysqli_connect.php");
// $mysqli is now defined...

// Pass it into the constructor
$course = new MyClass($mysqli);
于 2012-03-29T18:55:20.460 回答
2

问题是您有多个到数据库的连接,并且最后插入的 ID 是在每个连接的基础上跟踪的。

注意:您不应该每次运行查询时都连接到同一个数据库。只需在脚本开头连接,并在结尾关闭。不断地连接和断开连接会导致你的脚本运行非常缓慢,尤其是在查询更多的情况下。

此外,最后插入的 ID 可通过 MySQLi 的mysqli_insert_id()函数获得。

于 2012-03-29T18:53:52.493 回答
0

很可能是因为您在createCourse().

要么不createCourse()负责关闭连接(将其移至其他位置),要么在成功(或失败)createCourse()时返回插入 IDfalse

于 2012-03-29T18:58:20.410 回答