php-mysqli insert_id возвращает 0 вместо последнего идентификатора, когда вызов объекта переключается со статического вызова

Из моего ответа здесь , подумал, что это может быть полезно:

Я попробовал много шагов, чтобы устранить эту проблему. Существует так много источников для возможных решений этой проблемы, что трудно отфильтровать смысл от бессмыслицы. Наконец, я нашел хорошее решение здесь :

Шаг 1: Идентифицировать версию базы данных

$ mysql --version

Вы увидите такой вывод с MySQL:

$ mysql  Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using  EditLine wrapper

Или выводите как это для MariaDB:

mysql  Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1

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

Шаг 2: Остановка сервера базы данных

Чтобы изменить пароль root, вам необходимо закрыть сервер базы данных

Вы можете сделать это для MySQL с помощью:

$ sudo systemctl stop mysql

И для MariaDB с:

$ sudo systemctl stop mariadb

Шаг 3: Перезапуск сервера базы данных без Проверка прав доступа

Если вы запустите MySQL и MariaDB без загрузки информации о привилегиях пользователей, это позволит вам получить доступ к командной строке базы данных с правами root без предоставления пароля. Это позволит вам получить доступ к базе данных, не зная об этом.

Для этого вам необходимо остановить загрузку базы данных таблицами грантов, в которых хранятся данные о привилегиях пользователя.

Запустите базу данных без загрузки таблиц грантов или создания сетей:

$ sudo mysqld_safe --skip-grant-tables --skip-networking &

Амперсанд в конце этой команды заставит этот процесс работать в фоновом режиме, чтобы вы могли продолжать использовать ваш терминал.

Теперь вы можете подключиться к базе данных как пользователь root, что не должно попросите пароль.

$ mysql -u root

Вместо этого вы сразу увидите приглашение оболочки базы данных.

MySQL Prompt

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

MariaDB Prompt

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Теперь, когда у вас есть root-доступ, вы можете изменить пароль root.

Шаг 4: Изменение корневого пароля

mysql> FLUSH PRIVILEGES;

Теперь мы можем реально изменить пароль root.

Для MySQL 5.7.6 и новее, а также для MariaDB 10.1.20 и новее используйте следующую команду:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

Для MySQL 5.7.5 и старше а также MariaDB 10.1.20 и старше, используйте:

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');

Обязательно замените new_password с вашим новым паролем по выбору.

Примечание. Если команда ALTER USER не работает, это обычно указывает на большую проблему. Тем не менее, вы можете попробовать UPDATE ... SET сбросить пароль root.

[ВАЖНО] Это конкретная строка, которая исправила мою конкретную проблему:

mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';

Не забудьте перезагрузить таблицы предоставления после этого.

В любом случае вы должны увидеть подтверждение того, что команда была успешно выполнена.

Query OK, 0 rows affected (0.00 sec)

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

Шаг 5: Перезапустите сервер баз данных Обычно

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

Для MySQL используйте: $ sudo systemctl start mysql

Для MariaDB используйте:

$ sudo systemctl start mariadb

Теперь вы можете подтвердить, что новый пароль был применен правильно, выполнив:

$ mysql -u root -p

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

Заключение

Теперь у вас есть административный доступ к серверу MySQL или MariaDB. Убедитесь, что новый корневой пароль, который вы выбрали, прочный и безопасный и сохраните его в надежном месте.

-1
задан iggi 5 March 2019 в 03:24
поделиться

2 ответа

Переходит к / u / bobbykjack в / r / PHPhelp для поиска проблемы.

Проблема в том, что функция запроса использовала процедурные вызовы и метод объекта, из-за чего объект не обновлял переменную insert_id.

Старый код:

public function query($str) {
  $this->results = mysqli_query(self::$db, $str);
  if($this->results===false) {
    echo $this->mysqli_error();
  }
  else
    return $this->results;
}

Новый код:

public function query($str) {
  $this->results = parent::query($str);
  if($this->results===false) {
    echo $this->mysqli_error();
  }
  else
    return $this->results;
}

Я также изучаю назначение этого класса базы данных, поскольку он кажется ненужным.

0
ответ дан iggi 5 March 2019 в 03:24
поделиться

Я полагаю, что у вашего класса Database нет свойства insert_id, и, возможно, у класса его не должно быть, потому что insert_id является свойством mysqli-object . См.

$mysqli = new mysqli(host, user, pass, database_name); //create new mysqli object
$query = "write your own INSERT query";
$mysqli->query($query); //execute query
$last_id = $mysqli->insert_id; //get the last id of the row

. Внимательно прочитайте примеры в официальном руководстве: http://php.net/manual/ru/mysqli.insert-id.php

.
0
ответ дан Nikolay Zubkov 5 March 2019 в 03:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: