Page 1 sur 2

Problème résultat requête PDO

Posté : 09 août 2010, 15:44
par palozob
Bonjour à tous ;)

Je suis exposé à un soucis assez pénible avec PDO sur mon site web, je m'explique :

J'ai créé mon site web en xhtml/css et php/mysql sous WAMP (en local donc) et tout fonctionne parfaitement.
J'ai donc acheté un hébergement mutualisé chez ovh et je l'ai mis dessus, ici aussi tout marche parfaitement.
J'utilise PDO pour ma connexion à la BDD et pour mes requêtes. J'ai voulu utiliser la fonction get_browser() pour obtenir des infos sur la personne connectée (comme son OS ou son navigateur par exemple), mais il faut changer la valeur de browscap dans le php.ini et chez ovh en mutualisé je n'ai pas accès à ce fichier...du coup j'ai voulu mettre mon site sur une machine perso sous debian à la maison.

Après des apt-get install de apache2, php5, mysql-server et php5-mysql, j'ai utilisé les deux commandes suivantes pour les extensions PDO :

Code : Tout sélectionner

pecl install pdo pecl install pdo_mysql
Ca me dit que c'est ok, je rajoute donc :

Code : Tout sélectionner

extension=pdo.so extension=pdo_mysql.so
dans le php.ini, et je reboot apache2.

Les ennuis commencent ici...

Mon site est là, ça se connecte bien à la BDD via PDO, j'arrive à faire des requêtes. Cependant j'ai une erreur qui apparait dans une de mes pages alors qu'en local ou sur ovh, la même page ne donne pas d'erreurs o_O :
$cat = $connexion->prepare("SELECT id,name FROM category_projects");
$cat->execute();
				
while($categorie = $cat->fetch())
{
      $num_cat = $connexion->prepare("SELECT COUNT(*) FROM projects WHERE id_cat = " . $categorie['id']);
      $num_cat->execute();
      $number_cat = $num_cat->fetchColumn();
					
      echo "<h4>" . $categorie['name'] . "</h4>";

      if($number_cat != 0) //si la catégorie contient au moins un projet
      {
             $pjt = $connexion->prepare("SELECT id,title,avancement,priority FROM projects WHERE id_cat = ?");
             $pjt->execute(array($categorie['id']));

             while($projet = $pjt->fetch())
             {
		      echo "<p>" . $projet['title'] . "</p>";
             }
      }

}

Voici mes deux tables SQL:

category_projects

id | name
-----------
1 | C
2 | C++
3 | Python

-------------------------------------------------------------------------------------------------------------------------

projects

id | id_cat | title | description | avancement |
---------------------------------------------------------------------------------------------------
1 | 1 | Helloworld | Mon premier programme en C | 100% |
2 | 1 | Addition | Additionneur en C | 100% |
3 | 3 | Helloworl | Mon helloworld en python | 100% |


L'erreur est donc que $num_cat est un bool(false) et non un objet pdo comme il devrait être =/ du coup l'erreur sur mon site est :

Code : Tout sélectionner

Fatal error: Call to a member function execute() on a non-object in /var/www/projects.php in line 57
(vous pouvez voir la requête dans le code php que j'ai fourni ^^)

Voilà, si quelqu'un pourrait eclairer ma lanterne svp car je suis un peu perdu là =/ Quelque soit la requête faite à cet endroit, ca me renvoie toujours un bool(false) alors que les requêtes (testées sous phpmyadmin) fonctionnent correctement...

Merci d'avance!

Palozob

Re: Problème résultat requête PDO

Posté : 09 août 2010, 16:01
par stealth35
montre tout le code

Re: Problème résultat requête PDO

Posté : 09 août 2010, 16:04
par palozob
Voici ;)
<?php
include("head.php");
?>
		
<!-- corps -->
<div id="corps">
	
	<?php
		include("config.php");
		
		if(isset($_GET['action']) && !empty($_GET['action']))
		{
			$action = addslashes($_GET['action']);
		}
		else
		{
			$action = "default";
		}
		
		switch($action)
		{
			case "details":
				
				if(isset($_GET['id']) && !empty($_GET['id']))
				{
					$id = addslashes($_GET['id']);
				}
				else
				{
					$id = 1;
				}
				
				$pjt = $connexion->prepare("SELECT title,description,avancement,priority FROM projects WHERE id = ?");
				$pjt->execute(array($id));
				
				$projet = $pjt->fetch();
				
				//affichage de la page
				
				echo "<p>"
						. "<h4>" . $projet["title"] . "</h4>"
						. $projet["description"]
					. "</p>";
				
				echo "<p>[<a href='projets.php'>Retour</a>]</p>";
				
				break;
				
			default:
				
				$cat = $connexion->prepare("SELECT id,name FROM category_projects");
				$cat->execute();
				
				while($categorie = $cat->fetch())
				{
					$num_cat = $connexion->prepare("SELECT COUNT(*) FROM projects WHERE id_cat = " . $categorie['id']);
					$num_cat->execute();
					$number_cat = $num_cat->fetchColumn();
					
					echo "<p>"
							. "<h4>" . $categorie['name'] . "</h4>";
								
					if($number_cat != 0)
					{
						echo "<table align='center' width='80%' border='1'>"
								. "<tbody>"
									. "<th width='30%'>Titre</th>"
									. "<th width='30%'>Avancement</th>"
									. "<th width='20%'>Priorité</th>";
								
						$pjt = $connexion->prepare("SELECT id,title,avancement,priority FROM projects WHERE id_cat = ?");
						$pjt->execute(array($categorie['id']));

						while($projet = $pjt->fetch())
						{
							echo "<tr>"
									. "<td width='30%'>"
										. "<a href='projets.php?action=details&id=" . $projet['id'] . "'>"
										. $projet['title']
										. "</a>"
									. "</td>"
									
									. "<td width='30%'>"
										. "<div id='jauge' style='width:" . $projet['avancement'] . "%;'>"
										. $projet['avancement'] . "%"
										. "</div>" 
									. "</td>"
									
									. "<td width='20%'>"
										. $projet['priority']
									. "</td>"
								. "</tr>";
						}
												
						echo "</tbody>"
						. "</table>"
					. "</p>";
					}
					else
					{
						echo "Pas encore de projets";
					}
				} // fin while
				break;
		}//fin switch
		
	?>	
	
</div>
			
<?php
include("foot.php");
?>


Re: Problème résultat requête PDO

Posté : 09 août 2010, 16:09
par stealth35
elle est ou ta connexion a PDO ?

Re: Problème résultat requête PDO

Posté : 09 août 2010, 16:12
par palozob
quand je fais include("config.php"); ^^
<?php

$host  = 'monhost';
$user  = 'user';
$pass  = 'pass';
$database  = 'madatabase';

try
{
	$connexion = new PDO('mysql:host='.$host.';dbname='.$database, $user, $pass);
	$first = $connexion->query("SET NAMES 'utf8';");
        $first->closeCursor();
}

catch(Exception $e)
{
	echo 'Une erreur est survenue !';
	die();
}

?>

Re: Problème résultat requête PDO

Posté : 09 août 2010, 16:15
par stealth35
active la gestion des erreurs pour PDO (exemeple 1), vérifie aussi que ton niveau d'erreur PHP sois bien a E_ALL | E_STRICT :wink:

Re: Problème résultat requête PDO

Posté : 09 août 2010, 16:19
par palozob
à quel niveau veux tu que j'active la gestion des erreurs?

$connexion->errorInfo(); ?
$num_cat->errorInfo(); ?

pour le niveau d'erreur php je vais tenter de voir avec phpinfo() et dès que j'ai la rép je poste ^^

Re: Problème résultat requête PDO

Posté : 09 août 2010, 16:29
par palozob
Bon alors quelques avancées ^^:

J'ai tapé : error_reporting(E_ALL | E_STRICT);

ensuite j'ai fait :
$connexion->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
$num_cat->errorInfo();

voici le résultat :

Code : Tout sélectionner

Warning: PDO::prepare() [function.PDO-prepare]: SQLSTATE[HY000]: General error: 2014 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. in /var/www/projets.php on line 57

Re: Problème résultat requête PDO

Posté : 09 août 2010, 16:44
par stealth35
ouai tu peux pas faire des prepare a tout va comme ca, il va falloir les fermer avec closeCusor a un moment, de plus tu fais des requêtes prépareés dans les boucles du-coup elle servent a rien, il faut faire
$requete = $pdo->prepare('blabla');
boucle
    $requete->execute('truc');
finboucle
d'ailleur tu peux faire en 1 seule requete pour $num_cat :wink:

Re: Problème résultat requête PDO

Posté : 09 août 2010, 16:48
par palozob
ok je vais tenter les modifs et je te tiens au courant ;) merci beaucoup pour l'avancée !! =D

Re: Problème résultat requête PDO

Posté : 09 août 2010, 16:54
par palozob
le problème c'est que j'ai absolument besoin d'une structure comme ça :
$cat = $connexion->prepare("SELECT id,name FROM category_projects");    //récupère toutes mes catégories
$cat->execute();
				
while($categorie = $cat->fetch())   //pour chaque catégorie
{
		  //requete pour savoir s'il y a au moins 1 projet dans la catégorie
                 
                 if(nb_project >= 1)
                 {
                                //requete pour selectionner les infos de chaque projet de cette catégorie
                 }
                 else
                 {
                       //echo "pas de projects dans cette catégorie";
                 }


}
une suggestion ?

Re: Problème résultat requête PDO

Posté : 09 août 2010, 17:02
par stealth35
tu peux la faire en 1 requête pour les count
SELECT cp.id, cp.name, COUNT(p.id) num_project, p.id, p.title, p.avancement, p.priority
FROM category_projects cp
LEFT JOIN projects p ON p.id_cat = cp.id
grâce a FETCH_GROUP tu pourrais faire ca sur ton cp.name :wink:

Re: Problème résultat requête PDO

Posté : 09 août 2010, 17:06
par palozob
Arf les LEFT JOIN, c'est loin dans ma tête ça :mrgreen: je vais tenter tout ceci alors ;) merci :)

Re: Problème résultat requête PDO

Posté : 09 août 2010, 17:21
par palozob
Tout ça pour une requête dans une requête...vive PDO =/ j'aurais du resté sous fonctions mysql classiques lol :oops:

Re: Problème résultat requête PDO

Posté : 09 août 2010, 20:29
par stealth35
tu pouvais utilisé query :wink: