MySQL - почему LAST_INSERT_ID () не работает для меня? - PullRequest
1 голос
/ 09 января 2010

У меня есть следующий код:

  public function createNewGuide($userID,$guideName)
  {
    $sql =" INSERT INTO myTable(name, updated) 
            VALUES ('$guideName', 'NOW()')";

    //Process query
    $this->query($sql); // This inserts the new row
    $this->query('LAST_INSERT_ID()'); // This throws an error

    return $this->query_result;
  }

Моя функция запроса выглядит так:

  private function query($sql) 
  {
      $this->query_result = mysql_query($sql, $this->conn)
        or die("Unable to query local database <b>". mysql_error()."</b><br>$sql");   
  } 

Я получаю следующую ошибку:

Ошибка базы данных MySQL: у вас ошибка в синтаксисе SQL; проверить руководство, которое соответствует вашему MySQL версия сервера для правильного синтаксиса использовать рядом с 'LAST_INSERT_ID ()'

Я погуглил и посмотрел похожие проблемы, но не нашел ответа: (

Я не пробовал PHP-функцию mysql_insert_id () , поскольку я действительно хотел бы сделать это с помощью SQL.

Ответы [ 11 ]

11 голосов
/ 09 января 2010

Почему бы просто не использовать PHP mysql_insert_id ?

Независимо от того, ...

SELECT LAST_INSERT_ID()

... должно работать , если в таблице есть столбец автоинкремента .

6 голосов
/ 09 января 2010

Вы забыли SELECT:

"SELECT LAST_INSERT_ID()"
4 голосов
/ 09 января 2010

Это не будет работать без SELECT:

SELECT LAST_INSERT_ID();

или просто используйте mysql_insert_id, это функция php, которая делает то же самое на уровне php. Однако используйте первый метод, если ваши идентификаторы таблиц BIGINT.

2 голосов
/ 31 мая 2012

Если у вас есть несколько ссылок на базу данных в одной среде, вы всегда должны указывать идентификатор ссылки.

В случае mysql_insert_id php-функции вы всегда должны вызывать ее, используя mysql_insert_id( $link_id );

В случае, если вы вызываете его с помощью SQL-запроса, используя SELECT LAST_INSERT_ID( link_id ).

1 голос
/ 09 января 2010

LAST_INSERT_ID() возвращает ноль, если строка не была вставлена.

Вы должны проверить, что ваш INSERT действительно успешен. Всегда проверяйте возвращаемое значение mysql_query() и других функций, которое обычно составляет FALSE, если произошла ошибка.

$sql =" INSERT INTO myTable(name, updated) 
        VALUES ('$guideName', 'NOW()')";

if ($this->query($sql) === FALSE) {
  die(mysql_error());
}

if (($result = $this->query("SELECT LAST_INSERT_ID()")) === FALSE) {
  die(mysql_error()); 
}

if (($row = mysql_fetch_array($result)) === FALSE) {
  die(mysql_error()); 
}

$id = $row[0];
1 голос
/ 09 января 2010

Ребята уже ответили, что вы пропустили префикс SELECT.

Кстати, вы должны следить за оператором INSERT ... у него есть свободная дверь для внедрения SQL, если $guideName не экранирован.

1 голос
/ 09 января 2010

Поскольку вы используете функции mysql_*, почему бы просто не использовать функцию mysql_insert_id вместо вызова LAST_INSERT_ID() самостоятельно?


Тем не менее, SQLошибка, которую вы получаете, вероятно, потому что SQL-запрос, который вы отправляете на сервер, выглядит так:

LAST_INSERT_ID()

Вместо этого:

select LAST_INSERT_ID()

Должен быть select, если вы делаете запрос SQL, чтобы ... выбрать ... некоторые данные.

0 голосов
/ 25 августа 2016

Если SELECT LAST_INSERT_ID (); возвращает 0;

Используйте этот запрос:

ВЫБЕРИТЕ LAST_INSERT_ID (Id) из порядка имен таблиц по LAST_INSERT_ID (Id) предельный предел 1;

это даст вам требуемый результат.

0 голосов
/ 22 февраля 2012

Я думаю, что ваша таблица имеет столбец datetime / timestamp, и вы видите, что ваш запрос имеет значение NOW() varchar вместо значения datetime, поэтому ваш SQL query должен возвращать false.

Если запрос вернет false, вы не получите последний вставленный идентификатор (всегда для текущего соединения).

0 голосов
/ 17 февраля 2011

Я согласен с тем, кто говорит, что вы должны использовать mysql_insert_id, но если вы хотите использовать LAST_INSERT_ID, вы можете использовать это:

function getLastInsertId($db_connection)
{
   $result = 0;

   if($query_result = mysql_query("SELECT LAST_INSERT_ID();", $db_connection))
   {
      $temp = mysql_fetch_row($query_result);
      $result = $temp[0];   
   }

   return $result;   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...