[RESOLU] PDOStatement->execute(Array)

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] PDOStatement->execute(Array)

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

par Saian » 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.

Re: PDOStatement->execute(Array)

par bibou51 » 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.

Re: PDOStatement->execute(Array)

par or 1 » 04 févr. 2024, 16:55

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

Re: PDOStatement->execute(Array)

par bibou51 » 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.

Re: PDOStatement->execute(Array)

par @rthur » 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 ?

Re: PDOStatement->execute(Array)

par bibou51 » 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.

Re: PDOStatement->execute(Array)

par @rthur » 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.

Re: PDOStatement->execute(Array)

par bibou51 » 20 janv. 2024, 11:42

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

Re: PDOStatement->execute(Array)

par Spols » 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.

PDOStatement->execute(Array)

par bibou51 » 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