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

Я воскрешал старый проект для новых целей, и запуск его на новых версиях PHP привел к этой ошибке:

Устаревший: нестатический метод База данных ::connect () не должен вызываться статически, предполагая $ this из несовместимого контекста в / home / user / public_html / app / models / mainmodel.php on line 108

Итак, я нашел старый код, похожий на этот

$db = Database::connect();
$db->query("INSERT INTO users (userId) values ('1')");

, и превратил их в

$db = new Database();
$db->connect();
$db->query("INSERT INTO users (userId) values ('1')");

После этого изменения он прекрасно работал сисключение из следующего

function save(){
  $db = Database::connect();
  if($this->id == 0){
    //Insert New
    $db->query("INSERT INTO `entities` (`active`) VALUES ('1')");
    $this->id = $db->last();
  }else{
    $db->query("UPDATE entities SET
                                   active = '" . $this->active . "',
                                   modified = now()
                                   WHERE id = '" . $this->id . "';");
  }
  return $this->id;
}

, которое, когда я изменяю, приводит к этому

function save(){
  $db = new Database();
  $db->connect();
  if($this->id == 0){
    //Insert New
    $db->query("INSERT INTO `entities` (`active`) VALUES ('1')");
    $this->id = $db->last();
  }else{
    $db->query("UPDATE entities SET
                                   active = '" . $this->active . "',
                                   modified = now()
                                   WHERE id = '" . $this->id . "';");
  }
  return $this->id;
}

Однако теперь эта строка больше не работает

$this->id = $db->last();

var_dump of $ this-> id показывает, что ему присваивается значение int (0), чего не происходит, когда я использую Database :: connect () и вставляется запись

В качестве теста я вставил в свой код следующеепроверить

function save(){
  $dbconn = new mysqli ($mysql_host, $mysql_username, $mysql_password, $mysql_database);
  if($dbconn->connect_error){
    die('Connection Error (' . $dbconn->connect_errono . ') ' . $dbconn->connect_error);
  }

  if($this->id == 0){
    //Insert New
    $dbconn->query("INSERT INTO `entities` (`active`) VALUES ('1')");
    $this->id = $dbconn->last();
  }else{
    $dbconn->query("UPDATE entities SET
                                   active = '" . $this->active . "',
                                   modified = now()
                                   WHERE id = '" . $this->id . "';");
  }
  return $this->id;
}

Это сработало и не вернуло int (0).

ДляСсылка, вот мой класс базы данных:

class Database extends mysqli {
    private static $db;
    public $results;

    public function __construct() {
      if(parent::__construct(DB_HOST, DB_USER, DB_PASS, DB_NAME, NULL, NULL)) {
        return $this;
      } else {
        return false;
      }
    }

    public function connect($host = DB_HOST, $user = DB_USER, $pass = DB_PASS, $db = DB_NAME, $port = NULL, $socket = NULL) {
      if (!isset(self::$db)) {
        self::$db = new Database;
      }
      return self::$db;
    }

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

    function last() {
            return $this->insert_id;
    }

final private function __clone() {}
}

Наконец версии PHP и MySQL:

PHP Version: 5.6.40
MySQL Version: 5.6.43

Боюсь, что проблема существует в моем расширении класса базы данных, но не могу точно увидеть проблему,может кто-нибудь помочь?

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Переходит к / 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 голосов
/ 05 марта 2019

Я полагаю, что у вашего класса 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

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