message d'erreur sur une requete sql

Petit nouveau ! | 5 Messages

28 févr. 2014, 15:21

bonjour,

j'ai crée un formulaire pour l'upload de fichier mais j'ai un probléme avec ma requete sql voila le message d'erreur

Cannot add or update a child row: a foreign key constraint fails (`intra`.`documents`, CONSTRAINT `documents_ibfk_2` FOREIGN KEY (`Num_validateur`) REFERENCES `utilisateurs` (`Id_utilisateurs`))1


		// Requête de récupération des données
		$req = $mysqli->prepare('INSERT INTO documents(Id_document, Nom_document, Type_mime, Document, Taille_document, Num_categorie_document, Num_SS_categorie_document, Mots_cles, Date_valide, Valide, Num_validateur) 
								VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
			
			$arr = array("id"=>"", "nom"=> $fichier, "type"=> $file_type, "doc"=> $chemin, "taille"=> $taille, "numCat"=> $categorie, "numSS"=> $SScategorie, "motscles"=> $_POST['motscles'], "date"=> date("Y-m-d H:i:s", strtotime("+2 month")), "valide"=> 0, "numValid"=> 1); 
			$req->bind_param('issbiiissii', $arr['id'], $arr['nom'], $arr['type'], $arr['doc'], $arr['taille'], $arr['numCat'], $arr['numSS'], $arr['motscles'], $arr['date'], $arr['valide'], $arr['numValid']);
			
			 /* Exécution de la requête */
			$req->execute() or die(print_r($req->error));
			
			
	
			/* Fermeture du traitement */
			$req->close();

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

01 mars 2014, 14:54

salut,

demande 12 paramètres et n'en renseigne que 11 dans le bind.
du coup le dernier a null pour valeur, donc tu ne satisfait pas la FK et mysql retourne une erreur.

si tu le peux utilise PDO qui offre une solution quand même plus clair pour ce type chose que ce merdier de i / s / d et 4000 paramètre dans une fonction.

en plus tu pourras utiliser des paramètres nommé ce qui est beaucoup plus simple pour s'y retrouver ;)

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 5 Messages

12 mars 2014, 15:50

merci pour ta réponse , mais je suis débutant en PHP et PDO ça a l'aire compliquer


et peut tu m’éclaire + sur mon problème s'il te plait

cordialement

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

12 mars 2014, 19:39

qu'est ce que tu n'as pas compris dans ma réponse ?

tu indique 12 paramètres dans la requête préparée et n'en fournit que 11 à l'utilisation.

ensuite ton problème doit provenir du fait que la valeur par défaut du 12 ème champ (qui n'est pas fournit) ne satisfait pas une clef étrangère (documents_ibfk_2` FOREIGN KEY (`Num_validateur`) REFERENCES `utilisateurs` (`Id_utilisateurs`))
donc la référence à la table utilisateur.

Tant que tune fournit pas cette valeur cela ne pourras fonctionner.

Ton problème est auss du au fait que tu as énormément de paramètre et que la requête ainsi fait est illisible.

l'utilisation de requête préparée est inutile dans ton cas, il te suffit de construire ta requête "à la main" (chaine de caractère + concaténation) et de l'executer (pense quand même à sécuriser la requete avec mysqli_real_escape_string.
se sera plus clair et tu verras ce qu'il te manque.

pour info une requête préparé n'est réellement utile qui si utilisée dans une boucle car compilée une seule fois sur le SGBD (d'ailleurs, a vérifier, mais je ne suis pas certain qu'il s'agisse d'une véritable requête préparée coté serveur donc inutile au final ;) ).

@+
Il en faut peu pour être heureux ......