2010-10-17 29 views
2

J'utilise AOP et je ne peux pas insérer des données:Comment insérer des données dans Aop

utilisent ce code:

$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(); 

, mais les données ne sont pas insérées à la base de données. tous les noms vérifiés et valides. id comme champ AUTO_INCREMENT. Si j'utilise ce code, $ this-> db-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_WARNING); $ sql = 'INSÉRER DANS releases (artistes, version, étiquette, catalogue, date, liste de pistes, type, statut, vote, votes_count)'; $ sql. = 'VALEURS (: artistes,: version,: étiquette,: catalogue,: date,: liste de suivi,: type,: statut,: vote,: votes_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); 

je reçois l'erreur:
Attention: PDOStatement :: execute() [pdostatement.execute]: SQLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1064 Vous avez une erreur dans votre syntaxe SQL ; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'release, label, catalogue, date, tracklist, type, statut, vote, votes_count) VALUE' à la ligne 1 dans C: \ Program Files \ Wamp \ www \ contrôleurs à venir Application \ \ de \ release.php en ligne

+4

PDO est un peu secret sur les erreurs. Activez d'abord les rapports d'erreur. Voir ici pour plus de détails: http://www.php.net/manual/en/pdo.error-handling.php –

+0

Vous pouvez également vérifier les valeurs dans PDO :: errorCode() et PDO :: errorInfo() après l'instruction a été exécuté pour voir quelle est l'erreur. Personnellement, je définis toujours le mode d'erreur PDO sur des exceptions. Je trouve que cela me donne le meilleur contrôle car une exception est soulevée quand une erreur se produit. Je peux alors attraper ceci et le manipuler en conséquence selon l'application. – Jeremy

Répondre

5

date et type sont reserved words dans mySQL.

Surround les noms de champs avec des accents graves:

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

ou les renommer.

+0

merci beaucoup! Ça marche! –

1

bindParam utilise la sémantique de référence. Je ne pense pas que vous pouvez l'utiliser sur une constante, comme vous le faites avec vos lignes PDO::PARAM_INT. Je n'emploie jamais bindParam, et je recommande que vous employiez bindValue à la place. Ou mieux encore - Passez un tableau associatif à execute.

+1

PDO :: bindParam() et PDO :: bindValue() sont pour des choses différentes. PDO :: bindParam() vous permet de lier une variable à un espace réservé. La variable peut alors changer de valeur avant ou après l'exécution de l'instruction. Cela vous permet de préparer une déclaration une fois et de l'exécuter plusieurs fois, en changeant les valeurs des variables. PDO :: bindValue() vous permet uniquement de lier une valeur statique à un espace réservé. Les deux sont parfaitement bons et utilisés pour différentes choses. Le troisième argument de chaque méthode est une constante PDO (comme PDO :: PARAM_INT) qui indique à PDO le type de valeur que contient la variable ou la valeur liée. – Jeremy

3

Si ID est un auto_increment, pourquoi le spécifier dans votre requête d'insertion. Ce n'est pas nécessaire et peut être la raison pour laquelle vous ne voyez pas votre ligne insérée.

+0

afin que je puisse écrire $ sql = 'INSÉRER DANS les versions (artistes, version, étiquette, catalogue, date, tracklist, type, statut, vote, votes_count)'; $ sql. = 'VALEURS (: artistes,: version,: label,: catalogue,: date,: tracklist,: type,: statut,: vote,: votes_count)'; '' ? –

+0

Oui, vous pouvez écrire ça! –