8791 sujets

Développement web côté serveur, CMS

Bonjour,
je développe actuellement un site en local et j'ai un petit problème avec ma requête SQL suivante :

$bdd = new PDO('mysql:host=localhost;dbname=tuf', 'root', '');

$req = $bdd->prepare("INSERT INTO film (TITRE, ANNEE, NEED_ANNEE, DUREE, SIGNAL, ACTEUR, SYNOPSYS, ACTION, CRITERE, SOUS-CRITERE, ID)");
    $req->execute(array($_POST['nom'], $_POST['annee'], $check, $_POST['duree'], $_POST['acteur'], $_POST['synopsys'], $_POST['critere'], $_POST['sous-critere'], ));

(je vous ai épargné les try/catch pour plus de lisibilité)
Ce code ne génère aucune erreur et est interprété du début à la fin (j'ai testé avec des echo), je pense donc que c'est wamp qui pose problème.
De plus, j'ai essayé avec une requête direct (sans le prepare/execute).
Merci d'avance pour vos réponses Smiley smile .
Modifié par Stickman (02 Jun 2012 - 22:22)
Salut,
À première vue il manque des marqueurs dans ta requête préparée pour pouvoir liée les valeurs à ta requête.

Ce qui devrait ressembler à ça :
$req = $bdd->prepare("INSERT INTO film (TITRE, ANNEE, NEED_ANNEE, DUREE, SIGNAL, ACTEUR, SYNOPSYS, ACTION, CRITERE, SOUS-CRITERE, ID) VALUES (?,?,?,?,?,?,?,?)");
    $req->execute(array($_POST['nom'], $_POST['annee'], $check, $_POST['duree'], $_POST['acteur'], $_POST['synopsys'], $_POST['critere'], $_POST['sous-critere'], ));

http://www.php.net/manual/fr/pdostatement.execute.php
Modifié par moust (03 Jun 2012 - 00:07)
Salut,

Le nombre de champs a modifier ne correspond pas au nombre de valeurs que tu envoi:


$req = $bdd->prepare("INSERT INTO film (TITRE, ANNEE, NEED_ANNEE, DUREE, ACTEUR, SYNOPSYS, CRITERE, SOUS-CRITERE) VALUES (?,?,?,?,?,?,?,?)");
$req->execute(array($_POST['nom'], $_POST['annee'], $check, $_POST['duree'], $_POST['acteur'], $_POST['synopsys'], $_POST['critere'], $_POST['sous-critere']));


De même, si ton ID est auto increment, pas la peine de le mettre dans tes champs
Ha oui, je n’ai pas du tous fais attention à ça ! Je te remercie et tout est corrigé :

$req = $bdd->prepare("INSERT INTO film (TITRE, ANNEE, NEED_ANNEE, DUREE, SIGNAL, ACTEUR, SYNOPSYS, CRITERE, SOUS-CRITERE) VALUES (?,?,?,?,?,?,?,?,?)");
    $req->execute(array($_POST['nom'], $_POST['annee'], $check, $_POST['duree'],  $_POST['signal'], $_POST['acteur'], $_POST['synopsys'], $_POST['critere'], $_POST['sous-critere']));

NetBeans ne me donne aucune erreur, mais la requête ne marche toujours pas Smiley decu
est tu sur de tes noms de champs (majuscules, etc...), si tu a plus d'infos a me filer sur ton script je suis prenneur
Merci pour vos réponses. Je ne connaissais pas ErrorInfo(). Il me renvoi :
array(3) { [0]=> string(0) "" [1]=> NULL [2]=> NULL }
Donc si j'ai bien compris la doc il n'y aurais pas d'erreur.
De plus, j'ai vérifié mes noms de champs comme tu me le conseillais JJK801. Il me manquais un "S" à acteurs, corrigé mais ne marche toujours pas.
Voici ma table :
`TITRE` varchar(255) NOT NULL,
  `ANNEE` year(4) NOT NULL,
  `NEED_ANNEE` tinyint(1) NOT NULL,
  `DUREE` varchar(255) NOT NULL,
  `SIGNAL` varchar(255) NOT NULL,
  `ACTEURS` varchar(255) NOT NULL,
  `SYNOPSYS` text NOT NULL,
  `CRITERE` varchar(255) NOT NULL,
  `SOUS-CRITERE` varchar(255) NOT NULL,
  `ID` int(11) NOT NULL AUTO_INCREMENT,

et ma requête actuelle (bien vérifiée !) :
$req = $bdd->prepare("INSERT INTO film (TITRE, ANNEE, NEED_ANNEE, DUREE, SIGNAL, ACTEURS, SYNOPSYS, CRITERE, SOUS-CRITERE) VALUES (?,?,?,?,?,?,?,?,?)");
 
  $req->execute(array($_POST['nom'], $_POST['annee'], $check, $_POST['duree'],  $_POST['signal'], $_POST['acteur'], $_POST['synopsys'], $_POST['critere'], $_POST['sous-critere']));
Bon ca va être plus compliqué sans le code complet mais bon, je vais essayer de te donner d'autre pistes:

1. Tous tes champs de table son sur NOT NULL. As-tu bien vérifié que toutes des variables sont remplies? (montre nous si possible le résultat d'un var_dump($_POST))
2. Je ne sais pas ce qu'il y a comme info dans ton champ NEED_ANNEE, mais tu as mis un TINYINT(1). Autrement dit il faut un entier entre 0-9 (sauf erreur)
3. Heu, je sèche pour trouver plus d'idées avec les info que tu nous laisse Smiley smile

courage
Voila mon var_dump($_POST), tout semble logique :
array(8) { ["nom"]=> string(12) "True romance" ["annee"]=> string(4) "1999" ["duree"]=> string(7) "2h 0min" ["signal"]=> string(3) "-16" ["acteur"]=> string(16) "Act1, Act2, Act3" ["synopsys"]=> string(27) "lorem ipsum dolore sit amet" ["critere"]=> string(3) "1/7" ["sous-critere"]=> string(5) "41/75" } 
(il manque le NEDD_ANNEE qui ne viens pas du $_post)

Et je crois que le TINYINT(N) stock un nombre entre 0 et N, dans ce cas, il fait office d'une booléen (mais je peux me tromper, à vérifier !).
Modifié par Stickman (05 Jun 2012 - 17:56)
Tu peux essayer avec l'autre méthode, on sais jamais:



$req  = $bdd->prepare("INSERT INTO film (TITRE, ANNEE, NEED_ANNEE, DUREE, SIGNAL, ACTEURS, SYNOPSYS, CRITERE, SOUS-CRITERE) 
 				 VALUES (:TITRE, :ANNEE, :NEED_ANNEE, [lol]UREE, :SIGNAL, :ACTEURS, :SYNOPSYS, :CRITERE, :SOUS-CRITERE)");

$req->bindParam(':TITRE', 		$_POST['nom'], 		PDO: [langue]ARAM_STR);
$req->bindParam(':ANNEE', 		$_POST['annee'], 	PDO: [langue]ARAM_STR);
$req->bindParam(':NEED_ANNEE', 	$check, 			PDO: [langue]ARAM_INT);
$req->bindParam(':DUREE', 		$_POST['duree'], 		PDO: [langue]ARAM_STR);
$req->bindParam(':SIGNAL', 		$_POST['signal'], 		PDO: [langue]ARAM_STR);
$req->bindParam(':ACTEURS', 	$_POST['acteur'], 	PDO: [langue]ARAM_STR);
$req->bindParam(':SYNOPSYS', 	$_POST['synopsys'], 	PDO: [langue]ARAM_LOB);
$req->bindParam(':CRITERE', 		$_POST['critere'], 	PDO: [langue]ARAM_STR);
$req->bindParam(':SOUS-CRITERE', 	$_POST['sous-critere'], PDO: [langue]ARAM_INT);
			
if($req->execute() !== TRUE){

    var_dump($req->errorInfo());
    return false;

}
		 
return true;


edit: je ne sais pas pkoi ces foutu smeily apparaissent, mais remplace les par : P (PDO:: PARAM_...) sans espaces
Modifié par Sp4tz (06 Jun 2012 - 08:59)
J'ai essayé et ça avance ! Ça ne marche toujours pas, mais on une erreur Smiley lol !
J'ai bien remplace les smileys, y compris ce lui pour DUREE. Voici le code erreur que je reçois : HY093 et ça description : "Invalid parameter number".
Si j'ai bien compris, il manque un paramètre. J'ai fais un petite recherche et tout les cas comme moi sont dus à un petit oublie de ':', a un caractère en trop...
J'ai donc passé tout le code au peigne fin sans trouver de faute Smiley ohwell . Cela dit, je ne connais pas très bien le PDO, donc il est possible qu'une faute ais passé les mailles du filet !
Je me demande si ton problème n'est pas dû au tiret dans "SOUS-CRITERES", il me semble que ça pose des problème, essaye comme ça:


$req = $bdd->prepare("INSERT INTO film (TITRE, ANNEE, NEED_ANNEE, DUREE, SIGNAL, ACTEURS, SYNOPSYS, CRITERE) VALUES (?,?,?,?,?,?,?,?)");
 
  $req->execute(array($_POST['nom'], $_POST['annee'], $check, $_POST['duree'],  $_POST['signal'], $_POST['acteur'], $_POST['synopsys'], $_POST['critere']));


et si ca fonctionne, change ton nom de champ en "SOUS_CRITERES"
Ça fonctionne ! Merci Smiley smile !
Et excusez moi de vous avoir fais perdre votre temps pour quelque chose de si simple !