[RESOLU] PDOStatement->execute(Array)

Avatar du membre
Eléphant du PHP | 60 Messages

18 janv. 2024, 14:43

Bonjour, nouveau problème pour lequel j'ai besoin d'aide.

Code : Tout sélectionner

<?php define('include',NULL); include('../core.php'); if (!isset($_SESSION['membre']) || $_SESSION['connect'] != true) { die(); } /// error_reporting(E_ALL); ini_set("display_errors", 1); /// if (isset($_POST['membre']) && isset($_POST['case']) && !empty($_POST['case'])) { $_POST['case'] = intval($_POST['case']); $_POST['membre'] = intval($_POST['membre']); $verif = $db->prepare('SELECT actif FROM grille WHERE id = :id'); $verif->execute(array(':id' => $_POST['case'])); $verif2 = $verif->fetch(PDO::FETCH_OBJ); if ($verif2->actif == 0) echo 'Cette case à déjà été jouée'; else{ $sqlinfos3 = $db->prepare('SELECT grille FROM membres WHERE id = :id'); $sqlinfos3->execute(array(':id' => $_POST['membre'])); $infos3 = $sqlinfos3->fetch(PDO::FETCH_OBJ); if ($infos3->grille == 0) echo 'Vous n\'avez plus de parties pour aujourd\'hui'; else { $gain = mt_rand($config->ticketmin,$config->ticketmax); $update2 = $db->prepare('UPDATE grille SET actif = 0 WHERE id = :id'); $update2->execute(array(':id' => $_POST['case'])); $veriff = $db->prepare('SELECT count(id) as count FROM grille WHERE actif = 0'); $veriff->execute(array(':id' => $_POST['case'])); $veriff2 = $veriff->fetch(PDO::FETCH_OBJ); if($veriff2->count == 105){ $update3 = $db->query('UPDATE grille SET actif = 1'); } $update = $db->prepare('UPDATE membres SET credits = credits + :credits, creditsjour = creditsjour + :credits, grille = grille - 1 WHERE id = :membre'); $update->execute(array(':credits' => $gain, ':membre' => $_POST['membre'])); $insert = $db->prepare('INSERT INTO gains SET gain = :gain, membre = :membre, date = :date'); $insert->execute(array(':gain' => $gain, ':membre' => $_POST['membre'], ':date' => time())); $sqlinfos4 = $db->prepare('SELECT grille FROM membres WHERE id = :id'); $sqlinfos4->execute(array(':id' => $_POST['membre'])); $infos4 = $sqlinfos4->fetch(PDO::FETCH_OBJ); echo 'Case jouée, vous recevez '.$gain.' crédits !<br />Il vous reste '.$infos4->grille.' partie(s)'; } } } ?>
Et voici le code d'erreur que j'ai :
Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /home/vol15_7/byethost14.com/b14_29615537/phenixptp.fast-page.org/htdocs/jeux/submit.php:33 Stack trace: #0 /home/vol15_7/byethost14.com/b14_29615537/phenixptp.fast-page.org/htdocs/jeux/submit.php(33): PDOStatement->execute(Array) #1 {main} thrown in /home/vol15_7/byethost14.com/b14_29615537/phenixptp.fast-page.org/htdocs/jeux/submit.php on line 33

C'est donc : $veriff->execute(array(':id' => $_POST['case'])); qui pose problème.
Merci d'avance pour l'aide que l'on m'apportera

Mammouth du PHP | 1967 Messages

18 janv. 2024, 15:30

La requète éxécutée ne contient pas de paramètre. c'est ce que dit ton message d'erreur d'ailleurs.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Avatar du membre
Eléphant du PHP | 60 Messages

20 janv. 2024, 11:42

Bonjour,
et comment je peux corriger cette erreur ?
Merci d'avance.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

20 janv. 2024, 15:35

Bonjour Bibou51,

Que comprends-tu du message d'erreur ? Réexplique le nous en français avec tes mots à toi stp.
Et ensuite, qu'as tu essayé pour tenter de corriger le problème ?

L'objectif de PHPfrance est de te guider et te faire progresser, mais si on donne des réponses qu'il y a juste à copier-coller ça n'a que peut d'intérêt.
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Eléphant du PHP | 60 Messages

20 janv. 2024, 17:13

Bonjour @rthur ,
En fait, ce que je comprend pas c'est que le script fonctionnait avant que l'hébergement passe en php8 _
En ce qui concerne l'erreur je pense que $veriff->execute(array(':id' => $_POST['case'])) ne renvoie pas une valeur valide et c'est ça que je ne sais pas modifier.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

21 janv. 2024, 15:42

En fait, ce que je comprend pas c'est que le script fonctionnait avant que l'hébergement passe en php8 _
Ne fais pas de fixation là-dessus, c'est rarement efficace pour déboguer efficacement.
Ton script a été codé pour une ancienne version de PHP, il ne marche pas sur la dernière... et bien il faut que tu le débugues comme si tu le développais aujourd'hui pour cette nouvelle version.

Donc... on en revient au message d'erreur :

Code : Tout sélectionner

Uncaught PDOException: Invalid parameter number: number of bound variables does not match number of tokens
:arrow: Traduis ce message en français, que comprends-tu ?
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Eléphant du PHP | 60 Messages

04 févr. 2024, 11:46

Bonjour @rthur,
traduit en français ça donne :

Code : Tout sélectionner

PDOException non interceptée : numéro de paramètre non valide : le nombre de variables liées ne correspond pas au nombre de jetons
mais ça ne m'avance pas vraiment.
tout ce que je comprend c'est qu'il y a une différence entre le nombre de variables et les tokens.

Mammouth du PHP | 2703 Messages

04 févr. 2024, 16:55

il y a une différence entre le nombre de variables et les tokens.
combien de chaque ?

Avatar du membre
Eléphant du PHP | 60 Messages

07 févr. 2024, 19:25

Bonjour,
J'ai trouvé une solution qui fonctionne.

Code : Tout sélectionner

$veriff = $db->prepare('SELECT sum(actif) FROM grille'); $veriff2 = $veriff->fetch(PDO::FETCH_OBJ); if($veriff2 == 0){ $update3 = $db->query('UPDATE grille SET actif = 1'); }
je ne sais pas si c'et la meilleure solution mais en tous cas ça fonctionne.
Merci pour l'aide apportée.

Avatar du membre
Mammouth du PHP | 1609 Messages

08 févr. 2024, 12:58

Salut, ne pas exécuter la requête n'est effectivement pas ce qu'on peut appeler la meilleur solution. A priori dans ce cas le fetch retournera toujours false et l'update se fera toujours (false étant considéré égal à 0 avec un test ==). A ce compte la, autant enlever les 3 lignes au dessus et faire systématiquement l'update.

Dans la requête :

Code : Tout sélectionner

SELECT count(id) as count FROM grille WHERE actif = 0
tu n'as aucun paramètre nommé (:nomDuParametre), mais lors du execute, tu lui passes un tableau :
array(':id' => $_POST['case'])
avec un paramètre nommé :id, d'où le message d'erreur.

Il y a donc 2 solutions, soit tu intègres le paramètre nommé :id à la requête, soit tu ne le passes pas au execute. A toi de voir ce qui est le plus pertinent selon la logique du script.
Développeur web depuis + de 20 ans