mysqli INSERT аномалия - PullRequest
       7

mysqli INSERT аномалия

3 голосов
/ 03 марта 2011

У меня есть следующая таблица:

ID: bigint autoinc
NAME: varchar(255)
DESCRIPTION: text
ENTRYDATE: date

Я пытаюсь вставить строку в таблицу.Он выполняется без ошибок, но в базу данных ничего не вставляется.

try {
    $query = "INSERT INTO mytable (NAME, DESCRIPTION, ENTRYDATE) VALUES(?,?,?)";
    $stmt = $conn->prepare($query);
    $name= 'something';
    $desc = 'something';
    $curdate = "CURDATE()";
    $stmt->bind_param("sss", $name, $desc, $curdate);
    $stmt->execute();
    $stmt->close();
    $conn->close();
    //redirect to success page
}
catch(Exception $e) {
    print $e;
}

Он работает нормально и перенаправляет на страницу успеха, но внутри таблицы ничего не может быть найдено.Почему не работает?

Ответы [ 4 ]

2 голосов
/ 03 марта 2011

Попробуйте вместо этого подготовить этот запрос:

"INSERT INTO mytable (NAME, DESCRIPTION, ENTRYDATE) VALUES(?,?,CUR_DATE())"

И проверьте результаты $stmt->execute(). Это дало бы вам предупреждение, что "CUR_DATE()" (sic) не является действительным DATE.

Вы можете проверить, правильно ли был выполнен оператор, проверив возвращаемое значение execute() и запросив метод errorInfo():

if (!$stmt->execute()) {
   throw new Exception($stmt->errorInfo(), stmt->errorCode());
}

Имейте в виду, что при сбое execute() автоматически не генерирует исключение. Вам придется самостоятельно проверить успешность работы и сбой.

2 голосов
/ 03 марта 2011

Как насчет замены DESCTIPTION на DESCRIPTION внутри $query?

Редактировать

Просто из любопытства я создал таблицу с именем mytable и скопировал ваш код в сценарий PHP.

Здесь все работало нормально и строки вставлялись, за исключением того, что связанный параметр CURDATE() не выполнялся должным образом и ячейке ENTRYDATE была присвоена 0000-00-00.

Вы уверены, что отслеживаете ту же базу данных и таблицу, в которую предположительно вставляется ваш скрипт?

Что происходит при переходе с error_reporting(E_ALL);?

Проверено ли, что скрипт действительно завершает вставку?

Похоже, работает следующее:

error_reporting(E_ALL);

try {
    $query = "INSERT INTO mytable (NAME, DESCRIPTION, ENTRYDATE) VALUES (?, ?, CURDATE())";
    $stmt = $conn->prepare($query);
    $name= 'something';
    $desc = 'something';
    $stmt->bind_param("ss", $name, $desc);
    $stmt->execute();

     if ($conn->affected_rows < 1) {
        throw new Exception('Nothing was inserted!');
     }

    $stmt->close();
    $conn->close();
    //redirect to success page
}
catch(Exception $e) {
    print $e->getMessage();
}
2 голосов
/ 03 марта 2011

Вы уверены, что нет ошибки? Например, в названии вашего столбца есть опечатка.

Обратите внимание, что PDO крайне скрыт от ошибок по умолчанию.

См. Как выжать сообщение об ошибке из PDO? о том, как это исправить.

0 голосов
/ 03 марта 2011

Возможно ли, что автокоммит выключен?

Если это так, то вы должны зафиксировать вставку следующим образом

/* commit transaction */
$conn->commit();

Привет

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