Page 1 sur 1

Update de table qui ne se fait pas

Posté : 25 avr. 2012, 20:42
par smashcfr
Bonsoir,

Je suis de retour avec un nouveau problème pour lequel je n'arrive pas à voir ce qui cloche....

J'essaie de faire un update sur une table, en fonction d'arguments récupérés dans une URL.
L'update ne se fait pas, pourtant, lorsque je demande un affichage des erreurs dans la requête, php m'indique 00000, donc tout va bien.
Si j'affiche les arguments au moment du binding, je n'ai rien vu d'anormal.
Rien non plus dans les logs mysql et php.

Si j'exécute la requête directement dans phpmyadmin, cela fonctionne. Il doit donc bien y avoir un problème dans mon code ! Mais où ???

Histoire de repérer le pb =>

Extrait du 1er fichier :
<?php

// Inclusion des fichiers nécessaires
require($_SERVER['DOCUMENT_ROOT']."/classes/class_gestion_sql.php");
require($_SERVER['DOCUMENT_ROOT']."/fonctions/gestion_mysql/gestion_connection.php");
require($_SERVER['DOCUMENT_ROOT']."/fonctions/gestion_users/gene_sql_validation_inscriptionuser.php");

// .....

else
{
	// La connection à la base de données a réussi.
	// Update de la table pour mettre à jour la validation utilisateur.

	$retour = validation_sql_user($req_sql, $_GET['login'], $_GET['idvalid']);

	// $retour donne le nombre de lignes qui ont été affectées.

	if ($retour == 1)
	{
		echo "Votre inscription a bien été confirmée. Dès que l'administrateur aura définitivement validé votre inscription, vous en serez informé et pourrez commencer à utiliser le site.";
	}
	else
	{
		echo "La confirmation d'inscription a échoué. Veuillez rententer, ou envoyer un message au webmaster.";
	}

}
?>

2e fichier :
<?php

function validation_sql_user($req_sql, $login, $idvalid)
{
	// Fonction appelée une fois que l'utilisateur a cliqué sur l'URL de confirmation,
	// située dans le mail qu'il a reçu suite à son inscription.
	// Sert à valider cette action dans la base de données.
	
	$liste_valid = array(
    	":login" => $login,
	":unique_id" => $idvalid,
	);
   
	$requete = "UPDATE gen_users SET validation_user = 1 WHERE login = :login AND unique_id = :unique_id";
	
	$retour = $req_sql -> updater($requete, $liste_valid);
	
	return $retour;
}

?>
extrait du 3e fichier :
	function updater($requete, $param = NULL)
	{
		$requete = $this -> prepare($requete);
		if ($param != NULL)
		{
			foreach($param as $cle=>$valeur)
			{
				$requete -> bindParam($cle, $valeur);
			}
		}

		$requete -> execute();
		
		return $requete -> rowCount();
	}	
A noter que la connexion à la bdd se fait sans problème, elle est utilisée par ailleurs pour faire un SELECT qui donne des résultats corrects.

Merci !

Re: Update de table qui ne se fait pas

Posté : 25 avr. 2012, 21:11
par xTG
Les erreurs PDO sont-elles configurées ?
Sinon pourquoi utiliser une boucle foreach avec du bind au lieu de passer ton array à la fonction execute() ?

Re: Update de table qui ne se fait pas

Posté : 25 avr. 2012, 21:25
par smashcfr
Pour les erreurs PDO, je vais voir ce que je peux trouver dans la doc pour vérifier ça.

Pour la boucle foreach, ce que j'avais trouvé dans les docs pour faire un SELECT passait par un bind. J'avoue avoir fait ma fonction d'update sur le même schéma sans trop vérifier :(.
Mais c'est vrai que ce que j'avais vu dans la doc me semblait cohérent, ce d'autant plus pour les évolutions futures de l'appli, que je n'ai pas encore en tête (ici : http://www.php.net/manual/fr/pdostatement.bindparam.php).

En tous cas en passant l'array dans l'execute, sans passer par le bind, cela fonctionne....
Donc on va dire que c'est résolu, mais pour l'instant je ne comprends pas trop pourquoi cela fonctionne en passant l'array, et que cela ne fonctionne pas par le bind.

(Au cas où pour info, le contenu provisoire de mon fichier de classe (Il faut que je prévoie le cas où il n'y a pas de paramètre), comme ça si pb n'hésite pas à me le signaler pour que je m'améliore :p).

<?php

class gestion_sql extends PDO
{
	private $_serveur;
	private $_user;
	private $_mdp;
	private $_bdd;
	public $connexion;

	function __construct()
	{
		$this -> _serveur = "xxxx";
		$this -> _user = "yyyy";
		$this -> _mdp = "zzzz";
		$this -> _bdd = "nombdd";
	}

	function connection()
	{
		try 
		{
			parent::__construct('mysql:host='.$this -> _serveur.';dbname='.$this -> _bdd, $this -> _user, $this -> _mdp);
			$cnx_ok = true;
		}
		catch (PDOException $error) 
		{
			die();
			$cnx_ok = false;
		}
		return $cnx_ok;
	}

	function selectionner($requete, $param = NULL)
	{
		$requete = $this -> prepare($requete);
		if ($param != NULL)
		{
			foreach($param as $cle=>$valeur)
			{
				$requete -> bindParam($cle, $valeur);
			}
		}
		$requete -> execute();
		$requete -> setFetchMode(PDO::FETCH_OBJ);
		return $requete;
	}
	
	function creer_uniqueid()
	{
		return md5(uniqid());		
	}
	
	function updater($requete, $param = NULL)
	{
		$requete = $this -> prepare($requete);
		if ($param != NULL)
		{
			//foreach($param as $cle=>$valeur)
			//{
			//	$requete -> bindParam($cle, $valeur);
			//}
			$requete -> execute($param);
		}
		echo $requete -> queryString;
		//$requete -> execute();

		
		return $requete -> rowCount();
	}	
	
}

?>

Merci en tous cas !

Re: Update de table qui ne se fait pas

Posté : 25 avr. 2012, 21:47
par smashcfr
Pour les erreurs PDO, c'est de ça dont tu parlais ?

http://www.php.net/manual/fr/pdo.error-handling.php

Parce que si c'est le cas, quand j'ai utilisé errorCode() pour avoir le code erreur de l'exécution de ma requête, cela aurait du me donner quelque chose non ?

De même, pour la différence entre le "bindparam" et passer l'array dans l'execute, j'ai trouvé ça http://www.siteduzero.com/tutoriel-3-33 ... #ss_part_3 (En espérant ne pas commettre d'impair en mettant le lien) mais, à part que c'est plus "joli" par le bind, ça ne me donne pas grand chose de plus...

Je continue à chercher :)

Re: Update de table qui ne se fait pas

Posté : 26 avr. 2012, 08:50
par xTG
Bizarre tout de même cette histoire de bind qui ne fonctionne pas...
A la rigueur on aurait pu penser que c'était un problème de type de variable et qu'il passait tout en String alors que mysql attendait un certain champ en int mais...
Il aurait du générer une erreur du coup.

Re: Update de table qui ne se fait pas

Posté : 27 avr. 2012, 22:34
par smashcfr
A priori cela vient de la fonction BindParam (J'ai aussi un résultat "foireux" avec un insert).

Si je la remplace dans ma classe par un BindValue, cela fonctionne sans problème.

Etrange...

Re: Update de table qui ne se fait pas

Posté : 28 avr. 2012, 08:19
par xTG
Oh honte à moi je n'avais pas vu...
Alors je peux t'expliquer pourquoi cela ne fonctionne pas. ;)

bindParam() agit par référence à la variable.
Sauf que du fait de ta boucle foreach tu as des variables locales qui n'existent plus lors du execute().
Donc il fait son association avec des variables à NULL.

Re: Update de table qui ne se fait pas

Posté : 28 avr. 2012, 15:39
par smashcfr
Ok je comprends alors.

Merci pour cette explication :).

Du fait que c'est une fonction située dans une classe, il n'y a finalement pas trop d'intérêt à faire un bindparam après réflexion (La fonction ne s'appelle pas elle même avec changement de valeur des variables...). Du coup j'ai tout passé en bindvalue, et cela fonctionne sans problème.