PDO et non exécution de requête

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 : PDO et non exécution de requête

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

par Jules Petibidon » 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.

par jojolapine » 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 ;)

par Jules Petibidon » 29 janv. 2008, 23:40

Oui.

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

par jojolapine » 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?

par Jules Petibidon » 29 janv. 2008, 20:29

hello,

print_r( $sql3 ) donne quoi ?

print_r( $connexion->errorInfo() ) ?

par jojolapine » 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 !!!

par Maitrepylos » 29 janv. 2008, 11:19

Salut,

Toutes tes requêtes utilisent ->quote ?

PDO et non exécution de requête

par jojolapine » 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!!!