8768 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai un code qui fonctionne très bien sur php 7.4 mais suite au changement à la version 8.0
il me mets une Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in PDOStatement->execute(Array)

Voici le code

<?php
	require "require/connet_bdd.php"; //Connexion à la base de données
	
	// ÉTAPE 1 : on vérifie si le pseudo se trouve déjà dans la table.
	// Pour faire ça, on n'a qu'à compter le nombre d'entrées dont le champ "pseudo" le pseudo du visiteur.

	$reqpseudo = $bdd->prepare('SELECT pseudo AS existe_pseudo FROM connect_chat WHERE pseudo= ?');
    $reqpseudo->execute(array($_SESSION['pseudo']));
    $pseudoExist = $reqpseudo->fetch();

	if ($pseudoExist == 0) // Le pseudo ne se trouve pas dans la table, on va l'ajouter.
	{
		$verif = $bdd->prepare('INSERT INTO connect_chat (pseudo, timestamp) VALUES (?, ?)');
		$verif->execute(array($_SESSION['pseudo'], time()));	
	}

	else // Le pseudo se trouve déjà dans la table, on met juste à jour le timestamp.
	{
		$verif = $bdd->prepare('UPDATE connect_chat SET timestamp="'.time().'" WHERE pseudo="'.$_SESSION['pseudo'].'"');
		$verif->execute(array($_SESSION['pseudo']));
		
	}

	// ÉTAPE 2 : on supprime toutes les entrées dont le timestamp est plus vieux que 2 minutes.
	// On stocke dans une variable le timestamp qu'il était il y a 1 minutes :

	$timestamp_min = time() - (60*2); //  nombre en secondes par minute * par nombre de minute
	$bdd->query('DELETE FROM connect_chat WHERE timestamp<"'.$timestamp_min.'"');

	// ÉTAPE 3 : on compte le nombre de pseudo stockées dans la table. C'est le nombre de visiteurs connectés.

	$retour = $bdd->query('SELECT GROUP_CONCAT(pseudo SEPARATOR ", ") FROM connect_chat')->fetchAll();
	$utilisateur = htmlspecialchars($retour[0][0]);
	
	// Ici on compte le nombre d'utilisateur connecté à la ChatBox
	$retour = $bdd->query('SELECT COUNT(*) AS existe_pseudo FROM connect_chat');
	$donnees = $retour->fetch();
	$compter = $donnees['existe_pseudo'];	
?>

et le code de require "require/connet_bdd.php

<?php
// Connexion à la base de données
		try	
		{
			$bdd = new PDO('mysql:host=localhost;dbname=mon-site-test;charset=utf8', 'root', '');
			array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);		
		}	
		catch(Exception $e)
		{
				die('Erreur : '.$e->getMessage());
		}	
?>


Et comme j'ai pas trop suivie l'évolution de PHP 8.0 et maintenant PHP 8.1

Merci de votre contribution.
Modifié par ricem (30 Mar 2022 - 19:48)
Salut,

je n'ai pas l'impression que ce soit lié au passage de php 7 à 8, mais juste ton code qui m'a l'air faux Smiley ohwell

$verif = $bdd->prepare('UPDATE connect_chat SET timestamp="'.time().'" WHERE pseudo="'.$_SESSION['pseudo'].'"');
		$verif->execute(array($_SESSION['pseudo']));


Dans ta requête il n'y a aucun champs pour passer une variable et tu lui passe la variable dans le execute ..
A priori il faut dégager le $_session de la requête pour la remplacer par un ? comme dans tes autres requêtes pour que cela prenne le $_session du execute.
Modifié par Mathieuu (01 Apr 2022 - 10:04)
Meilleure solution
Salut

Mathieu à raison.
Tu utilise une variable dans le execute() mais php ne sait pas où l'injecter. Il manque juste le "token" représenté par un point d'interrogation dans la requêtes prepare()
Bonjour,

Merci Mathieuu et JENCAL (encore une fois Smiley murf )

Ah, oui oupss.... Smiley eek Smiley rolleyes pourtant sur PHP 7.4 cela fonctionnait ...est ce qu'il prenait quand même malgré cette erreur, peut-être la corrigeait-il seul.
J'ai lu que php 8 était beaucoup plus intransigeant sur les erreurs...
Modifié par ricem (03 Apr 2022 - 14:16)
Donc résolu merci à vous.

Edit: Enfin, je me demande pourquoi quand même cela fonctionnait sur php 7.4 ?
Modifié par ricem (03 Apr 2022 - 18:21)
ricem a écrit :
Donc résolu merci à vous.

Edit: Enfin, je me demande pourquoi quand même cela fonctionnait sur php 7.4 ?


Parce que en php 7.4 le mode d'erreur était plus permissif.
en php 8 ils ont changer leur mode de debug et sont passé sur du PDO::ERRMODE_EXCEPTION

avant c'était PDO::ERRMODE_SILENT, donc ton erreur était là, mais en SILENT Smiley smile

En soit, ton erreur n'empêche pas la requête de fonctionner.
Modifié par JENCAL (04 Apr 2022 - 10:20)
Ok, et ben merci pour l'explication...d'où le fait, comme j'ai dit plus haut
ricem a écrit :
J'ai lu que php 8 était beaucoup plus intransigeant sur les erreurs...


Et ben voilà Smiley biggrin ...ça m'apprendra à faire des erreurs ^^

EDIT: je suis même passé sur la version 8.01.17 et aucun souci...(pour vu que ça dur)... Smiley murf
Modifié par ricem (04 Apr 2022 - 16:54)