2013-07-03 2 views
-2

Я испытываю проблемы при вставке значения типа даты в MySQL с использованием PDOошибка вставки в MySQL с использованием PDO

фрагмент кода:

$HOST = 'localhost'; 
$DATABASE = 'db'; 
$USERNAME = 'XXXXXX'; 
$PASSWORD = 'XXXXXX'; 

$DBH = new PDO("mysql:host=$HOST;dbname=$DATABASE;charset=utf8",$USERNAME,$PASSWORD); 
$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$incomingdate = date('Y-m-d', time()); // this echoes 2013-07-03 
$name = "XYZ"; 

try { 

    $stmt = $DBH->query('INSERT INTO tablename (date ,name) VALUES (?, ?)'); 
    $stmt->execute(array($incomingdate, $name )); 
    $row_count = $stmt->rowCount(); 
    echo $row_count.' rows selected'; 

    } 
catch(PDOException $e){ 
    echo 'Error in executing query ...'; 
    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND); 
    } 

Datatype на стороне базы данных MySQL из даты столбца: ДАТА

ошибка: Ниже приводится содержание PDOErrors.txt SQLSTATE [HY000]: Общая ошибка: 2031

Что не так в этом запросе .... более ранний запрос работал ровно, когда я использовал mysql_ * функции ... так что не так с подготовленными операторами ??? А также .... то, что должно быть сделано, если тип данных имеет Timestamp типа и/или DateTime типа на тузд конце

+0

возможный дубликат [Как предотвратить SQL-инъекции в PHP?] (Http://stackoverflow.com/questions/60174/how- to-prevent-sql-injection-in-php) – Strawberry

ответ

0

Используйте обратные кавычки вокруг date имени столбца и использовать ->prepare вместо ->query

$stmt = $DBH->prepare('INSERT INTO tablename (`date` ,`name`) VALUES (?, ?)'); 
+2

По крайней мере, объясните причину для downvoting? –

+1

Не мой нисходящий, но, вероятно, потому, что 'date' не является зарезервированным словом в MySQL. Обратитесь к документам за списком зарезервированных слов. «MySQL разрешает использовать некоторые ключевые слова [например, дата] как некотируемые идентификаторы, потому что многие ранее использовали их. 'http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html – MrCode

+1

+1 выглядит, кому-то нравится участвовать в голосовании здесь –

3

Вам нужно использовать prepare() для подготовленное заявление, не query():

$stmt = $DBH->prepare('INSERT INTO tablename (date ,name) VALUES (?, ?)'); 

PDO::query() не может иметь связанных параметров, только оператор, созданный через PDO::prepare() может.

Смежные вопросы