INSERT не срабатывает после SELECT

Не могу понять свою ошибку (PHP 7.3)

$db = new test_mysqli();
$dbSelect = "SELECT name, password FROM users WHERE name = '".$_POST['name']."';";
$resultSelect = $db->query($dbSelect);
echo "Row:".$resultSelect->num_rows."!<br>";
if ($resultSelect->num_rows > 0) {
    echo "Fail. Name ".$_POST['name']." already used <br>";
    while ($row = $resultSelect->fetch_assoc()) 
        echo $row['name']." ".$row['password']."<br>";
} else {
    $dbInsert = "INSERT INTO users VALUES (NULL, '".$_POST['name']."', '".$_POST['password']."', '".gmdate('Y-m-d h:i:s')."');";
    echo $dbInsert."<br>";
    $resultInser = $db->query($dbInsert);
    if ($resultInser)
        echo "Success. ".$resultInser->insert_id."!<br>";
    else
        echo "Fail. ".$db->error."<br>";
    $resultInser->close();
}
$resultSelect->close();
$db->close();

Результат

Row:1!
Fail. Name qwe3 already used
qwe3 3ewq

Select работает

Row:0!
INSERT INTO users VALUES (NULL, 'qwe4', '4ewq', '2020-03-09 11:43:17');
Success. !

Insert не работает. В базе ничего не появляется. Корректность запроса проверял вписывая в базу 2ую строчку мануально. $db->error тоже пуст.

Но если проверку SELECT вырезать, INSERT создаст запись в базе, хотя и не вернув insert_id.


Ответы (2 шт):

Автор решения: Ипатьев

Изначально вопрос был сформулирован как "INSERT выполняется без ошибок, но в БД ничего нет", поэтому ниже идет ответ на него. Вопрос же "INSERT не срабатывает после SELECT" гораздо более примитивный, и полностью покрывается третьим пунктом.


Причин для такого поведения может быть две

  1. Где-то выше по коду стартует транзакция/отключается автокоммит. Для решения проблемы надо вернуть БД в нормальный режим атомарных запросов.
  2. Проверка вставки производится не в той базе данных, к которой подключается пхп скрипт. Для проверки сделать запрос на получение только что добавленной строки в том же пхп скрипте.
  3. Ошибка всё-таки есть. Для проверки надо сконфигурировать пхп и mysqli, чтобы они показывали сообщения об ошибках.
→ Ссылка
Автор решения: Yaroslav

Заменил две переменные $resultSelect и $resultInser на одну $queryResult и заработало. Я ваш php шатал с матом-перематом.

$db = new mpo_mysqli();
$dbSelect = "SELECT name, password FROM users WHERE name = '".$_POST['name']."';";
$queryResult = $db->query($dbSelect);
echo "Row:".$queryResult->num_rows."!<br>";
while ($row = $queryResult->fetch_assoc()) 
        echo $row['name']." ".$row['password']."<br>";
$fail = $queryResult->num_rows > 0;
$queryResult->close();
if ($fail) {
    echo "Fail. Name ".$_POST['name']." already used <br>";
} else {
    $dbInsert = "INSERT INTO users VALUES (NULL, '".$_POST['name']."', '".$_POST['password']."', '".gmdate('Y-m-d h:i:s')."');";
    echo $dbInsert."<br>";
    $queryResult = $db->query($dbInsert);
    if ($queryResult)
        echo "Success. ".$queryResult->insert_id."!<br>";
    else
        echo "Fail. ".$db->error."<br>";
    $queryResult->close();
}
$db->close();
→ Ссылка