Почему я не могу получить последний идентификатор вставки в PHP и MySQL? - PullRequest
0 голосов
/ 29 марта 2012

У меня есть функция, которая создает курс. Я пытаюсь получить идентификатор последней вставки, но он не работает:

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:

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 в порядке. Она создает то, что мне нужно, и она есть в базе данных, но я не могу получить последний идентификатор вставки.

Ответы [ 3 ]

3 голосов
/ 29 марта 2012

Хотя правильный способ получения идентификатора вставки в MySQLi заключается в использовании 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().Вместо этого получите идентификатор вставки внутри createCourse() и верните его.

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);
2 голосов
/ 29 марта 2012

Проблема в том, что у вас есть несколько подключений к базе данных, и последний вставленный идентификатор отслеживается для каждого подключения.

Примечание: Вы должны не подключаться к одной и той же базе данных каждый раз, когда вы запускаете запрос.Просто подключитесь в начале сценария и закройте в конце.Постоянное подключение и отключение приведут к тому, что ваш скрипт будет работать очень медленно, особенно с большим количеством запросов.

Кроме того, последний вставленный идентификатор доступен через функцию MySQLi mysqli_insert_id().*

0 голосов
/ 29 марта 2012

Скорее всего, потому что вы закрываете соединение mysqli в конце createCourse().

Либо не делайте createCourse() ответственным за закрытие соединения (переместите его в другое место), либо попросите createCourse() вернуть идентификатор вставки в случае успеха (или false при ошибке)

...