PDO et non exécution de requête

ViPHP
ViPHP | 3607 Messages

28 janv. 2008, 13:06

Bonjour à tous,
Je suis face à un problème bien embêtant...
J'ai dévelloper un petit site en local chez moi qui fonctionne très bien (php5,mysql5,apache2)
et j'ai voulu pour le faire tester (entre à vous utilisateurs de phpfrance) mettre une première version online, seulement j'ai une erreur que je n'arrive pas à éliminer...:
Fatal error: Call to a member function fetch() on a non-object in /home/www/joris/www/webrappels/auth.php on line 37
Donc je vous copie/colle mon bout de code:
[...]
//ceci est une requête qui permet de savoir si le membre qui est en train de se connecter est déja en ligne ailleur
$sql3='SELECT count(*) as nb_results FROM users WHERE (pass=MD5('.$connexion->quote($_POST['pass']).') AND pseudo='.$connexion->quote($_POST['pseudo']).' AND id_connexion=\'deco\')';

//on execute
$res3=$connexion->query($sql3);
$donnee3=$res3->fetch(PDO::FETCH_ASSOC);

//si le champ id_connexion est bien à 'deco' suite du code
if($donnee3['nb_results']=='1'){
etc...
Bon vous l'aurez commpris la ligne 37 c'est celle où la méthode fetch apparait...
Alors j'ai essayer d'afficher la requête ce qui donne:
SELECT count(*) as nb_results FROM users WHERE (pass=MD5('pass') AND pseudo='pseudo' AND id_connexion='deco')
ce qui est tout à fait normal et qui fonctionne en direct dans phpmyadmin...
Je précise que j'ai d'autre requêtes exécutée via pdo plus haut dans mon script, et elles fonctionnent très bien...
Pour info mais je ne pense pas que ce soit lié, puisque la requête marche dans phpmyadmin, la version de mysql en ligne et 4.*
Voilou, à priori je ne pense pas que ce soit un problème sql, donc j'ai posté içi, si la donne change je ferais appel à vous chers admin ;)

Merci d'avance pour vos lumières!!!

Mammouth du PHP | 1029 Messages

29 janv. 2008, 11:19

Salut,

Toutes tes requêtes utilisent ->quote ?
L'expérience est la somme de toutes nos erreurs.

ViPHP
ViPHP | 3607 Messages

29 janv. 2008, 20:00

Bonsoir,
Alors oui j'ai d'autres requêtes au dessus, qui utilisent ->quote()...(pas toutes mais bon...)
Donc je ne sais pas trop ou est le problème...
Au cas ou, je vais vous mettre le ode en entier:
<?php
error_reporting(E_ALL);
$ERROR=array('1'=>'Inactivitée détectée!!!!','2'=>'Votre pseudo ou votre mot de passe sont incorrects','3'=>'Vous êtes déjà connecté sur un autre poste');
include('./config/config.mysql.php');
	//Connexion à Mysql
	try {
		$connexion = new PDO('mysql:host='.$CONFIG['host'].';dbname='.$CONFIG['db'], $CONFIG['user'], $CONFIG['pass']);
	} catch(Exception $e) {
		echo 'Erreur : '.$e->getMessage().'<br />';
		echo 'N° : '.$e->getCode();
	}

	//gestion de l'utf8

	try {
		$utf8=$connexion->query('SET NAMES utf8');
	} catch(Exeption $e) {
		echo 'Erreur : '.$e->getMessage().'<br />';
		echo 'N° : '.$e->getCode();
	}
if(isset($_GET['action']) && $_GET['action']==='deco'){
	session_start();
	$sql1='UPDATE `rappels`.`users` SET `id_connexion` = \'deco\' , `last_action` = NOW( ) WHERE `users`.`id_user` ='.$_SESSION['user']['id'].' LIMIT 1 ;';
	$res1=$connexion->query($sql1);
	$_SESSION=null;
	session_destroy();
}
if(isset($_GET['action']) && $_GET['action']==='valid'){
	include('./libs/fonctions.php');
	
	$sql2='SELECT count(*) as nb_results FROM users WHERE (pass=MD5('.$connexion->quote($_POST['pass']).') AND pseudo='.$connexion->quote($_POST['pseudo']).')';
	$res2=$connexion->query($sql2);
	$donnee2=$res2->fetch(PDO::FETCH_ASSOC);
	if($donnee2['nb_results']=='1'){
		$sql3='SELECT count(*) as nb_results FROM users WHERE (pass=MD5('.$connexion->quote($_POST['pass']).') AND pseudo='.$connexion->quote($_POST['pseudo']).' AND id_connexion=\'deco\')';
		$res3=$connexion->query($sql3);
		$donnee3=$res3->fetch(PDO::FETCH_ASSOC);
		if($donnee3['nb_results']=='1'){
		session_start();
		$_SESSION['user']['ok']=true;
		$sql4='SELECT id_user, nom, prenom FROM users WHERE (pass=MD5('.$connexion->quote($_POST['pass']).') AND pseudo='.$connexion->quote($_POST['pseudo']).')';
		$res4=$connexion->query($sql4);
		$donnee4=$res4->fetch(PDO::FETCH_ASSOC);
			$_SESSION['user']['time']=time();
			$_SESSION['user']['id']=$donnee4['id_user'];
			$_SESSION['user']['pseudo']=$_POST['pseudo'];
			$_SESSION['user']['np']=$donnee4['nom'].' '.$donnee4['prenom'];
			$sql5='UPDATE `rappels`.`users` SET `id_connexion` = \''.getConnexionId().'\' , `last_action` = NOW( ) WHERE `users`.`id_user` ='.$donnee4['id_user'].' LIMIT 1 ;';
			$res5=$connexion->query($sql5);
			header('Location: index.php');
			exit();
		} else {
			header('Location: auth.php?error=3');
			exit();
		}
	} else {
		header('Location: auth.php?error=2');
		exit();
	}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta http-equiv="pragma" content="no-cache" />
  <meta http-equiv="content-language" content="fr">
  <title>WebRappels V0.5 - Authentification</title>
  <link type="text/css" href="./design.css" rel="stylesheet" media="screen" />
  <link type="text/css" href="./form.css" rel="stylesheet" media="screen" />
</head>
<body>
<div class="little_upperleft">
        <div class="upperright">
                <div class="lowerleft">
                        <div class="lowerright">
				<h1 id="titre">WebRappels V0.5</h1>
				
	<form name="authentification" id="authentification" method="post" action="auth.php?action=valid">

    <div id="titreForm">Authentification</div>
    <div id="corpForm">
        <fieldset id="identifiants">
		<?php if(isset($_GET['error'])) { echo '<p class="error">'.$ERROR[$_GET['error']].'</p>';}?>
                <legend>Identifiants</legend>
                <br />
                <p>
			<label for="nom" title="Veuillez saisir votre pseudo" class="oblig">* Pseudo :</label>
                        <input type="text" name="pseudo" id="pseudo" title="Veuillez saisir votre pseudo" tabindex="1" onfocus="this.className='focus';" onblur="this.className='normal';" />
                </p>
                <p>
			<label for="pass" title="Veuillez saisir votre mot de passe" class="oblig">* Mot de passe :</label>
                        <input type="password" name="pass" id="pass" title="Veuillez saisir votre prénom" tabindex="2" onfocus="this.className='focus';" onblur="this.className='normal';" />
                </p>
        </fieldset>
        <br />
        <em>* Champs obligatoires</em>
	
    </div>
    <div id="piedForm">
      <input type="submit" name="valid" id="valid" value="Connexion" title="Cliquez sur ce bouton pour vous connecter" tabindex="3" />
    </div>
</form>

			</div>
                </div>
        </div>
</div>
</body>
</html>
(désolé au passage pour les erreurs d'encodage, mais je récupère mon fichier via webftp, et l'utf8 n'est pas son fort... ;) )
Merci de vous pencher sur mon problème !!!

Eléphant du PHP | 259 Messages

29 janv. 2008, 20:29

hello,

print_r( $sql3 ) donne quoi ?

print_r( $connexion->errorInfo() ) ?

ViPHP
ViPHP | 3607 Messages

29 janv. 2008, 22:36

AH!
Je croit qu'on tient quelque chose:
SELECT count(*) as nb_results FROM users WHERE (pass=MD5('demo') AND pseudo='demo' AND id_connexion='deco')
Array (
[0] => HY000
[1] => 2014
[2] => Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. )
Alors comment gérer ça? utiliser la constante conseillée?

Eléphant du PHP | 259 Messages

29 janv. 2008, 23:40

Oui.

Jette un oeil à la notice de mysql_unbuffered_query() pour comprendre le problème :)

ViPHP
ViPHP | 3607 Messages

30 janv. 2008, 11:35

Bonjour,
Alors je suis en train de voir avec mon hébergeur pourquoi j'ai cette restriction...
Donc on attend un petit peu et on verra ;)

Eléphant du PHP | 259 Messages

30 janv. 2008, 12:07

Hello,

Les unbuffered queries économisent les ressources du serveur mysql et accélerent l'accès aux données. La contrepartie est que tant que tu n'as pas "terminé" la lecture d'un jeu de résultat, tu ne peux pas effectuer d'autre requête.

Apparemment PDO est réglé pour faire des requêtes unbuffered pour optimiser les dialogues avec la base de données, et que, dans la plupart des cas, ça ne pose pas de problèmes. Ce n'est absolument pas une restriction.

Eléphant du PHP | 185 Messages

30 janv. 2008, 14:51

De plus il y a un bug : quand il y a un seul résultat dans le buffer de requête, celui-ci n'est pas vidé quand tu fais $resultat->fetch() (alors qu'il devrait l'être). La solution est de faire un $resultat->close() explicitement.

[edit] Je ne suis pas forcément clair, alors plus d'infos ici.