2010-10-17 3 views
2

Я использую PDO и я не могу вставить некоторые данные:Как вставить данные в PDO

использовать этот код:

$sql = 'INSERT INTO `releases` (id, artists, release, label, catalog, date, tracklist, type, status, vote, votes_count) '; 
$sql .= 'VALUES (:id, :artists, :release, :label, :catalog, :date, :tracklist, :type, :status, :vote, :votes_count)'; 

$query = $this->db->prepare($sql); 

$query->bindParam(':id', 0, PDO::PARAM_INT); 
$query->bindParam(':artists', implode('|||', $data['artists']), PDO::PARAM_STR); 
$query->bindParam(':release', $data['release'], PDO::PARAM_STR); 
$query->bindParam(':label', $data['label'], PDO::PARAM_STR); 
$query->bindParam(':catalog', $data['catalog'], PDO::PARAM_STR); 
$query->bindParam(':date', $data['date'], PDO::PARAM_STR); 
$query->bindParam(':tracklist', $data['tracklist'], PDO::PARAM_STR); 
$query->bindParam(':type', $data['type'], PDO::PARAM_STR); 
$query->bindParam(':status', $data['status'], PDO::PARAM_INT); 
$query->bindParam(':vote', 0, PDO::PARAM_INT); 
$query->bindParam(':votes_count', 0, PDO::PARAM_INT); 

$query->execute(); 

, но данные не вставляются в базу данных. все имена проверены и действительны. id как поле AUTO_INCREMENT.

если я использую этот код: $ this-> db-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_WARNING); $ sql = 'INSERT INTO releases (исполнители, релиз, ярлык, каталог, дата, треклист, тип, статус, голос, vote_count)'; $ sql. = 'VALUES (: artist,: release,: label,: catalog,: date,: tracklist,: type,: status,: vote,: vote_count)';

$query = $this->db->prepare($sql); 

$array = array(':artists' => implode('|||', $data['artists']), 
       ':release' => $data['release'], 
       ':label'  => $data['label'], 
       ':catalog' => $data['catalog'], 
       ':date'  => $data['date'], 
       ':tracklist' => $data['tracklist'], 
       ':type'  => $data['type'], 
       ':status' => $data['status'], 
       ':vote'  => 0, 
       ':votes_count' => 0); 

$query->execute($array); 

я получаю сообщение об ошибке:
Предупреждение: PDOStatement :: Execute() [pdostatement.execute]: SQLSTATE [42000]: ошибка синтаксиса или нарушение доступа: 1064 У вас есть ошибка в вашем SQL синтаксиса ; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «релизом, ярлыком, каталогом, датой, треклистом, типом, статусом, голосованием, vote_count) VALUE 'в строке 1 в C: \ Program Files \ Wamp \ WWW \ ближайший \ приложений \ контроллеры \ release.php на линии

+4

PDO немного скрыт в отношении ошибок. Сначала откройте отчет об ошибках. Подробнее см. Здесь: http://www.php.net/manual/en/pdo.error-handling.php –

+0

Вы также можете проверить значения в PDO :: errorCode() и PDO :: errorInfo() после утверждения был выполнен, чтобы увидеть, что такое ошибка. Лично я всегда устанавливал режим ошибок PDO на исключения. Я считаю, что это дает мне лучший контроль, поскольку возникает исключение при возникновении какой-либо ошибки. Затем я могу поймать это и обработать его в зависимости от приложения. – Jeremy

ответ

5

date и type: reserved words in mySQL.

Surround имена поле с обратными кавычками:

INSERT INTO `releases` (`id`, `artists`, `release`, `label`, `catalog`, 
`date`, `tracklist`, `type`, `status`, `vote`, `votes_count`) '; 

или переименовать их.

+0

большое спасибо! оно работает! –

1

bindParam использует эталонную семантику. Я не думаю, что вы можете использовать его на постоянной основе, как вы делаете с вашими линиями PDO::PARAM_INT.

Я никогда не использую bindParam, и я рекомендую вместо этого использовать bindValue. Или еще лучше - передать ассоциативный массив execute.

+1

PDO :: bindParam() и PDO :: bindValue() для разных вещей. PDO :: bindParam() позволяет привязать переменную к заполнителю. Затем переменная может изменить значение до или после выполнения инструкции. Это позволяет вам подготовить инструкцию один раз и выполнить ее много раз, изменив значения переменных. PDO :: bindValue() позволяет привязать статическое значение к заполнителю. Оба они отлично подходят и используются для разных вещей. Третий аргумент для каждого метода - это константа PDO (например, PDO :: PARAM_INT), которая сообщает PDO, какое значение имеет связанная переменная или значение. – Jeremy

3

Если идентификатор является auto_increment, зачем его указывать в запросе на ввод. Это не требуется, и может быть причиной, по которой вы не видите свою вставленную строку.

+0

поэтому я могу написать $ sql = 'INSERT INTO релизы (исполнители, релиз, ярлык, каталог, дата, треклист, тип, статус, голос, vote_count)'; $ sql. = 'VALUES (: artist,: release,: label,: catalog,: date,: tracklist,: type,: status,: vote,: vote_count)'; ' ? –

+0

Да, вы можете это написать! –

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