mysqli_insert_id () возвращает 0 на том же соединении после запроса вставки

Прежде чем спросить, я использовал функцию поиска переполнения стека и Google!

В моем коде mysqli_insert_id всегда возвращает 0.

В моем «Model»-PHP-классе моя функция сохранения выглядит так:

$result = DB::q($sql);

if(!$result)
{
throw new Exception("Error:".mysqli_error(DB::getDB()));
}
else
{
if(is_null($this->id))
{
$this->id = DB::insert_id();
}
}

$this->update();

Мой Class DB выглядит так:

class DB
{
public static $db = null;

public static function q($sql)
{
self::checkDB();

if(!isset($sql) OR $sql == null OR $sql == "")
{
throw new Exception("\$sql may not be empty");
}
else
{
$result = mysqli_query(self::$db, $sql);
if(!$result)
{
error_log($sql);
throw new Exception(mysqli_error(self::$db));
die();
}

return new DBResult($result);
}
}

public static function checkDB()
{
if(is_null(self::$db))
{
self::$db = mysqli_connect(DB_PORT, DB_USERNAME, DB_PASSWORD, DB_DATABASE);

if(!self::$db)
{
throw new Exception(mysqli_error(self::db));
}
}
}

public static function insert_id()
{
return mysqli_insert_id(self::$db);
}
}

class DBResult
{
private $result = null;

public function __construct($result)
{
$this->result = $result;
}

public function fetch_assoc()
{
return mysqli_fetch_assoc($this->result);
}

public function fetch_object()
{
return mysqli_fetch_object($this->result);
}

public function __get($willget)
{
if($willget == "num_rows")
{
return mysqli_num_rows($this->result);
}
else
{
return $this->result;
}
}
}

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

INSERT INTO users (name, age) VALUES ('personA', 42); SELECT last_insert_id() as k;

Я также установил AUTO_INCREMENT флаг на моем id колонка.

Также, кажется, в моем коде нет места между любыми запросами, где я буду перезаписывать $db в DB учебный класс.

Большое спасибо за вашу помощь!

1

Решение

Эта проблема:
В Модельном классе был этот кусок кода:

if(is_null($this->id))
{
$this->id = DB::insert_id();
}

По какой-то причине я пока не знаю почему, $this->id не является нулевым Вместо этого его 0.
Так что все, что мне нужно было сделать, это изменить его на

if(empty($this->id))
{
$this->id = DB::insert_id();
}

Спасибо как @Syscall. Вы помогли мне отладить этот код. Извините за глупый вопрос, но я думаю, что некоторые из вас знают это. Программирование весь день, но в качестве хобби ничего не получится.

-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]