8768 sujets

Développement web côté serveur, CMS

Bonjour, j'ouvre ce sujet dans le but d'avoir un peu d'aide. Pour le contexte, je réalise un captcha en image (proche reCaptcha) , mais il s'avère que j'ai des problème avec les requêtes. Pourtant je n'ai pas de message d'erreur même dans les logs il ne semblent pas y avoir d'erreur et pourtant rien est envoyé en base de données je ne comprend pourquoi.
Voici les traitements effectué:

if (!isset($_POST['question'])){
	//Requête permettant de récupérer les images
	$get_image = $bdd->prepare('SELECT LienImage FROM image ORDER BY rand() LIMIT 2');

	//Requête permettant de récupérer les questions
	$get_question = $bdd->prepare('SELECT LibelleQuestion FROM question ORDER BY rand() LIMIT 5');

	//Requête permettant de récupérer un couple
	$get_couple = $bdd->prepare('SELECT IdCouple FROM couple WHERE IdImage = :IdImage AND IdQuestion = :IdQuestion AND PositionCouple = [langue]ositionCouple');

	/*Requête permettant de créer un couple
	$insert_couple = $bdd->prepare('INSERT INTO couple(IdImage, IdQuestion, PositionCouple, CompteurCouple) VALUES(:IdImage, :IdQuestion, [langue]ositionCouple, :CompteurCouple)');
	*/
	
	//Requête permettant de mettre à jour le compteur de clics d'un couple
	$update_couple = $bdd->prepare('UPDATE couple SET CompteurCouple = :CompteurCouple WHERE IdCouple = :IdCouple');

	//Récupération des images
	try{
		$get_image->execute();
		$image = $get_image->fetchall();

	} catch (Exception $e){
	    // En cas d'erreur, on affiche un message et on arrête tout
	    $error = "Erreur lors de la récupération des images";
	  	w_log("ERROR/" + $error);
	  	die ('Erreur : '.$e->getMessage());
	}



if(isset($_POST['submit'])){
    if(isset($_POST['question'])){
        if(isset($_POST['image'])){
            $IdImage  = $_POST['image'];
            $IdQuestion = $_POST['question'];
            $PositionCouple = "$IdImage".","."$IdQuestion";
            $CompteurCouple = 0;

           $insertion = "INSERT INTO couple(IdImage, IdQuestion, PositionCouple, CompteurCouple) VALUES ('$IdImage','$IdQuestion', '$PositionCouple', '$CompteurCouple')";
            $execute = $bdd-> query($insertion);
        
        	print_r(IdImage);
         
                  
            if($execute == true){
                echo "succes";
            }else{
                echo "faille";
            }
        }
    }
}


NB : Rien ne se passe du coté serveur mais lorsque je veux afficher les valeurs apres les cliques j'ai bien les ids qui correspondent donc je ne comprend pourquoi le traitement du formulaire ne fonctionne pas

Merci d'avance pour vos réponses
Bonjour,

Une première piste : que se passe-t-il si tu extrais ta requête et que tu l'exécutes directement côté PhpMyAdmin ?

Une deuxième piste : quand tu effectues tes requêtes préparées dans la première partie, je vois bien le prepare() et le execute(), mais entre les deux, normalement on utilise par exemple bindValue() pour associer un paramètre :nom à une valeur $nom, comme ceci :

<?php

// 1) Préparation :
$q = $db->prepare('UPDATE table SET champ = :nom WHERE id = :id');

// 2) Association des paramètres aux valeurs :
$q->bindValue(':nom', $nom, PDO::PARAM_STR);
$q->bindValue(':id', $id, PDO::PARAM_INT);

// 3) Exécution :
$q->execute();


L'avantage avec bindValue() (il y a aussi bindParam()), c'est que la fonction accepte 3 paramètres : l'identifiant :nom, sa valeur, mais surtout le type (PDO::PARAM_STR pour les chaines de caractère, PDO::PARAM_INT pour les entiers, etc.)
C'est très pratique car ça sécurise un minimum et facilement tes requêtes Smiley smile

Et enfin, tu utilises des requêtes préparées dans la première partie de ton script (et c'est très bien) mais pourquoi pas aussi dans la deuxième partie ? Surtout que là tu utilises des variables provenant de $_POST, et c'est tout l'avantage des requêtes préparées de pouvoir contrôler le type de données qu'on va insérer dans notre base...

PS : Dans cette ligne, une petite faute de frappe peut être aussi ?
<?php
$get_couple = $bdd->prepare('SELECT IdCouple FROM couple WHERE IdImage = :IdImage AND IdQuestion = :IdQuestion AND PositionCouple = [langue]ositionCouple');


[langue]ositionCouple != [langue]positionCouple

Mais je ne comprends pas la syntaxe de langue ? Est-ce que c'est $truc['langue'] plutôt ?

Bonne journée Smiley smile

Edit : as-tu aussi activé l'affichage des erreurs SQL ? ça peut aider...
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Modifié par Loraga (14 Apr 2021 - 10:35)
Salut, Alors Merci de ta réponse qui est assez riche en information du coup. J'ai réussi à faire rentrer les valeurs dans la base de données, il fallait faire quelque ajustement au niveau du code T_T, De plus oui j'ai bien mis les PDO::ATTR_ERRMODE ...

D'acord je vais essayer de faire pour la deuxieme partie un prépare aussi. Cependant, maintenant j'ai un autre souci j'aimerais concatener les deux id (IdImage et IdQuestion) dans le champ Position couple comment pourrais je faire ? Avez vous des idées ? Smiley decu
Meilleure solution
Kems a écrit :
Cependant, maintenant j'ai un autre souci j'aimerais concatener les deux id (IdImage et IdQuestion) dans le champ Position couple comment pourrais je faire ?


Je ne suis pas sûr d'avoir bien compris ta question... J'imagine que tu sais déjà comment concaténer des variables en PHP :
$concatenation = $idImage . $idQuestion;

C'est aussi possible en SQL de concaténer les valeurs de plusieurs champs avec CONCAT() pour n'en former qu'un, mais c'est pas bien compliqué non plus...
Modifié par Loraga (14 Apr 2021 - 20:54)
Bah du coup cela revient à ce que j’ai fait pour Position Couple mais ça ne rentre pas comme il faut en base de données ????.
Mais à votre avis pour réaliser ce captcha serait-ce plus simple de le faire avec checkbox ?
Kems a écrit :
Bah du coup cela revient à ce que j’ai fait pour Position Couple mais ça ne rentre pas comme il faut en base de données ????

As-tu essayé ma première piste comme indiqué précédemment ?
Extrait ta requête SQL avec la concaténation (avec un var_dump($insertion); par exemple) et exécute là directement dans PhpMyAdmin (Sélectionne ta base de données puis menu SQL --> Exécuter).
S'il y a un problème avec cette requête, SQL te le dira. Si au contraire la requête passe sans souci, alors le problème se trouve du côté de ton script PHP. Smiley smile

Kems a écrit :
Mais à votre avis pour réaliser ce captcha serait-ce plus simple de le faire avec checkbox ?

Je ne sais pas, je ne connais ni le contexte ni tes besoins en matière de captcha. Sur ce sujet, le web grouille de tutos/exemples en tout genre, il y a des solutions simple, d'autres plus complexes.
Le but d'un captcha, c'est qu'il soit simple pour les humains et difficile (voir impossible, idéalement) pour les robots. Les robots savent cocher des cases, donc il faut voir.
C'est peut-être dommage d'abandonner ta solution pour une erreur SQL non ? Tant qu'à y être, autant déboguer et comprendre d'où vient l'erreur ? Smiley smile
Modifié par Loraga (15 Apr 2021 - 10:11)
Hello Loraga ?????, alors je n’ai pas encore fait le test mais je compte bien le faire là et je te tiendrai au courant. Par rapport, aux checkbox c’était juste pour m’informer je ne compte pas laisser ce qu’on a fait jusqu’à présent or qu’il nous reste plus grand chose je pense ???????? t’inquiète pas pour ça. Il me semble que c’est les dernières requêtes qu’il manque pour qu’il soit fonctionnel.
Alors encore une fois merci pour ta réponse et je reviens vers toi dès que j’aurai fait les tests ??????????