Page 1 sur 1

PDOStatement->execute(Array)

Posté : 18 janv. 2024, 14:43
par bibou51
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

Re: PDOStatement->execute(Array)

Posté : 18 janv. 2024, 15:30
par Spols
La requète éxécutée ne contient pas de paramètre. c'est ce que dit ton message d'erreur d'ailleurs.

Re: PDOStatement->execute(Array)

Posté : 20 janv. 2024, 11:42
par bibou51
Bonjour,
et comment je peux corriger cette erreur ?
Merci d'avance.

Re: PDOStatement->execute(Array)

Posté : 20 janv. 2024, 15:35
par @rthur
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.

Re: PDOStatement->execute(Array)

Posté : 20 janv. 2024, 17:13
par bibou51
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.

Re: PDOStatement->execute(Array)

Posté : 21 janv. 2024, 15:42
par @rthur
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 ?

Re: PDOStatement->execute(Array)

Posté : 04 févr. 2024, 11:46
par bibou51
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.

Re: PDOStatement->execute(Array)

Posté : 04 févr. 2024, 16:55
par or 1
il y a une différence entre le nombre de variables et les tokens.
combien de chaque ?

Re: PDOStatement->execute(Array)

Posté : 07 févr. 2024, 19:25
par bibou51
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.

Re: [RESOLU] PDOStatement->execute(Array)

Posté : 08 févr. 2024, 12:58
par Saian
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.