Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/07/2011, 16h29   #1
Nouveau Membre du Club
 
Inscription : janvier 2009
Messages : 45
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 45
Points : 29
Points : 29
Par défaut PDO probleme de connection.

Bonjour,
Je suis actuellement face a un problème de taille puisque cela fait plus de trois jours que je ne trouver pas de solution, même après avoir consulter google...

Explications:
Je suis en train de créer un site web avec php/mysql. Et n'ayant pas accès directement aux serveurs apache et mysql, je me suis installer sur mon PC un WAMPSERVER histoire de développer tranquille et ensuite tous transférer sur le serveur dédier UNIX (RedHat).

J'utilise PDO pour la connexion a mysql.

Mon WAMPSERVER est a jour, (trop peut être...):
-APACHE 2.2.17
-PHP 5.3.4
-MySql 5.1.53

Tous marche a la perfection sur ce serveur.

Puis est venu le temps de basculer sur le redhat pour test et mise en ligne...

Problème:
J’obtiens ici un des problème les plus étrange auquel j'ai jamais été confronte:
toutes les pages se connectant via PDO a mysql foire et reste blanche sans rien afficher (même avec des echo ni même du HTML) j’obtiens de manière complétement aléatoire certaines erreurs venant de PDO.

version sur le serveur:
-Mysql 5.0.77
-PHP 5.1.6
-Apache 2.2.3

bien que les version soit différente PDO est installer avec les drivers.
Petit code que j'ai trouver sur le site:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
foreach(get_loaded_extensions() as $extension)
{
   if(strpos(strtolower($extension), 'pdo') !== FALSE)
    {
       echo $extension.'<br/>';
    }
}
 
//Affiche
 
PDO
pdo_mysql
pdo_sqlite

En voila un exemple:
Code :
1
2
3
4
5
Warning: PDO::prepare() [function.PDO-prepare]: SQLSTATE[HY000]: General error: constructor arguments must be passed as an array in /www3/OOV/oov/actu/postActu_PDO.php on line 36
 
Warning: PDO::prepare() [function.PDO-prepare]: SQLSTATE[HY000]: General error: failed to instantiate user-supplied statement class in /www3/OOV/oov/actu/postActu_PDO.php on line 36
 
Fatal error: Call to a member function execute() on a non-object in /www3/OOV/oov/actu/postActu_PDO.php on line 83
code de la ligne correspondante (mais ca ne vien pas de la je crois donc):
Code :
$res = $mysqlcnx->query("SELECT * FROM actualites ORDER BY Priority");
code de la connexion:
Code :
1
2
3
4
5
6
7
8
9
10
try
		{
			$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
			$pdo_options[PDO::ATTR_PERSISTENT] = false;
			$mysqlcnx = new PDO("mysql:host=localhost;dbname=newsoov", '$login', '$mdp', $pdo_options);
		}
		catch (Exception $e)
		{
			die("An error occured: " . $e->getMessage());
		}
Je me tue a essayer de trouver une solution, j'ai aussi jeter un œil au log sql:
Code :
1
2
110722 16:50:57 [Warning] Aborted connection 2 to db: 'dbName' user: 
'userName' host: 'localhost' (Got an error reading communication packets)
qui aparait a chaque tentative de connection... doc internet pas tres bavard la dessus (je meme tester ce que Mysql preconnise dans ce genre de cas...)

J'ai aussi fait des tests sur le retour de la fonction PDO et il me retourne un objet PDO, vide...:
Code :
1
2
3
4
5
6
7
8
9
10
11
			var_dump($mysqlcnx);
			print_r($mysqlcnx);
 
			if ($mysqlcnx == NULL)
			{
				ECHO "NULL";
			}
			else
			{
				ECHO "PAS NULL";
			}
affiche:
Code :
object(PDO)#1 (0) { } PDO Object ( ) NULL
Help please, je suis dans le caca!

P.S.: le serveur RedHat est en loopback, le 'localhost', c'est normal.
Vodsky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 16h40   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 106
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 106
Points : 8 454
Points : 8 454
t'as mis setFetchMode ?
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 21h39   #3
Nouveau Membre du Club
 
Inscription : janvier 2009
Messages : 45
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 45
Points : 29
Points : 29
L'objet pdo est vide, comment je pourrai appeler cette méthode?

les erreurs que j'ai mise ici sont sur le query, mais si je met un $db->prepare(...)
ou une autre methode ca me sort les meme erreurs.
Vodsky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 09h16   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 106
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 106
Points : 8 454
Points : 8 454
Citation:
Envoyé par Vodsky Voir le message
L'objet pdo est vide, comment je pourrai appeler cette méthode?
l'objet PDO est toujours vide, il ne contient aucune propriété ...
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 11h07   #5
Nouveau Membre du Club
 
Inscription : janvier 2009
Messages : 45
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 45
Points : 29
Points : 29
je met quoi comme valeur?
Vodsky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 11h09   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 106
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 106
Points : 8 454
Points : 8 454
Citation:
Envoyé par Vodsky Voir le message
je met quoi comme valeur?
la question était plutôt si t'en a mis un ou pas, montre tout ton code
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 12h38   #7
Nouveau Membre du Club
 
Inscription : janvier 2009
Messages : 45
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 45
Points : 29
Points : 29
Non je n'ai pas mis de setFetchMode.

Voici le code:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?php
	session_start();
?>
<?//xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
  	<meta http-equiv="Pragma" content="no-cache" />
	<link rel="stylesheet" type="text/css" href="css/actu.css" />
	<title>Actualites</title>
  </head>
 
  <body>
<?php	
	if (isset($_SESSION['from']) && $_SESSION['from'] == "writeActu.php")
	{
		/*
			Connexion aux bases mysqlcnx via l'extension PDO de PHP
		*/
		try
		{
			$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
			$pdo_options[PDO::ATTR_PERSISTENT] = false;
			$mysqlcnx = new PDO("mysql:host=localhost;dbname=newsoov", 'user', 'mdp', $pdo_options);
		}
		catch (Exception $e)
		{
			die("An error occured: " . $e->getMessage());
		}
 
		/*
			Prepare la requete sql
		*/
		$query = $mysqlcnx->prepare("INSERT INTO actualites VALUES('', ?, ?, ?, ?, ?)");
 
		if (isset($_POST['title']))
		{
			$queryRep[0] = htmlspecialchars($_POST['title']);
		}
 
		if (isset($_POST['url']))
		{
			$queryRep[1] = htmlspecialchars($_POST['url']);
		}
 
		if (isset($_POST['desc']))
		{
			$queryRep[2] = htmlspecialchars($_POST['desc']);
		}
 
		if (isset($_POST['priority']))
		{
			$queryRep[3] = htmlspecialchars($_POST['priority']);
		}
 
		if (isset($_POST['atTop']))
		{
			$queryRep[4] = htmlspecialchars($_POST['atTop']);
		}
 
		for ($j = 0; $j < 5; $j++)
		{
			if (!isset($queryRep[$j]))
			{
				$queryRep[$j] = "";
			}
		}
 
		if ($queryRep[4] == 1)
		{
			$sortAtTopQuery = $mysqlcnx->query("SELECT Id FROM actualites WHERE AtTop = '1'");
			$res = $sortAtTopQuery->fetch();
			if ($res != false)
			{
				$q = $mysqlcnx->prepare("UPDATE actualites SET AtTop='0' WHERE Id=?");
				$q->execute(Array($res['Id']));
			}
			$sortAtTopQuery->closeCursor();
		}
			$_SESSION['from'] = "postActu.php";
			$query->execute($queryRep);
			$mysqlcnx = NULL;
			unset($mysqlcnx);
	}
?>
	<meta http-equiv="refresh" content="2; url=writeActu.php" />
  </body>
 
</html>
Vodsky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 12h56   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 106
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 106
Points : 8 454
Points : 8 454
y'a pas de ligne 100 dans ton code, met exactement les mêmes choses,
sinon tu n'as pas a mettre de htmlspecialchars sur tes paramètres
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 13h01   #9
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
Bonjour,

j'ajoute : met tout le code PDO dans le try/catch...

__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 26/07/2011, 13h04   #10
Modérateur
 
Inscription : septembre 2010
Messages : 7 106
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 106
Points : 8 454
Points : 8 454
Citation:
Envoyé par ska_root Voir le message
Bonjour,

j'ajoute : met tout le code PDO dans le try/catch...

pourquoi faire ? il est en mode exception si y'a un erreur le script s’arrêtera et affichera l'erreur
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 13h16   #11
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
heu, je ne connais pas bien les options de l'objet de connexion PDO, mais la doc dit :

Citation:
PDO::ERRMODE_EXCEPTION

En plus de définir le code erreur, PDO lancera une exception PDOException et y définit les propriétés afin de représenter le code erreur et les informations complémentaires
je ne vois pas où il est précisé que tu peux te passer de la capture...
néanmoins, je te crois
__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 13h18   #12
Modérateur
 
Inscription : septembre 2010
Messages : 7 106
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 106
Points : 8 454
Points : 8 454
Citation:
Envoyé par ska_root Voir le message
je ne vois pas où il est précisé que tu peux te passer de la capture...
néanmoins, je te crois
...

a quoi va te servir ta capture ?
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 13h27   #13
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
dans le cas présent, à pas grand chose effectivement, mais dans ce cas, autant retirer tout le try/catch...

__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 15h29   #14
Nouveau Membre du Club
 
Inscription : janvier 2009
Messages : 45
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 45
Points : 29
Points : 29
Bonjour, j'actualise mes post voici les erreur pour cette page:
Code :
1
2
3
4
5
Warning: PDO::prepare() [function.PDO-prepare]: SQLSTATE[HY000]: General error: constructor arguments must be passed as an array in /www3/OOV/oov/actu/postActu_PDO.php on line 36
 
Warning: PDO::prepare() [function.PDO-prepare]: SQLSTATE[HY000]: General error: failed to instantiate user-supplied statement class in /www3/OOV/oov/actu/postActu_PDO.php on line 36
 
Fatal error: Call to a member function execute() on a non-object in /www3/OOV/oov/actu/postActu_PDO.php on line 83
En désespoir de cause j'ai tout transformer en mysqli mais le sujet m’intéresse puisque ça me fout les boules et que je veux le faire avec PDO. D'autant plus qu'il y a plein de personne dans ce cas (c.f. internet...) et qu'une réponse serai la bienvenue.

P.S.: Je rappel que j'obtiens ces erreurs de manière aléatoire... des fois page blanche des fois erreurs...

Citation:
Envoyé par ska_root Voir le message
dans le cas présent, à pas grand chose effectivement, mais dans ce cas, autant retirer tout le try/catch...

Dans ce cas, si PDO provoque une erreur et qu'une exception est lancée a cet endroit du code :
Code :
1
2
3
4
5
6
		try
		{
			$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
			$pdo_options[PDO::ATTR_PERSISTENT] = false;
			$mysqlcnx = new PDO("mysql:host=localhost;dbname=newsoov", 'user', 'mdp', $pdo_options);
		}
Il ce pourrait que le message d'erreur contient les information de connection a la base SQL, i.e. le user et le mot de pass... ce qui serai embêtant...
Vodsky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 15h41   #15
Modérateur
 
Inscription : septembre 2010
Messages : 7 106
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 106
Points : 8 454
Points : 8 454
essaye en supprimant

Code :
$pdo_options[PDO::ATTR_PERSISTENT] = false;
pourquoi le mettre sur false sachant qu'il l'est par défaut ?
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 16h17   #16
Nouveau Membre du Club
 
Inscription : janvier 2009
Messages : 45
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 45
Points : 29
Points : 29
Effectivement mais c’était pour être sur, a la base je l'avait pas mis. c'est mon boss qui planche avec moi la dessus qui m'avait demander d’être sur de ça.
Ça ne change rien au problème l'erreur ne viens pas de la...

Dernière news: nous avons tester avec une base sqlite pour voire si c’était mysql qui était mal confé, pareil même erreurs.

P.S.: a propos des options, j'ai essayer les deux maniere de faire:
- celle comme montré dans le code et
Code :
1
2
$mysqlcnx = new PDO("mysql:host=localhost;dbname=newsoov", 'user', 'mdp');
$mysqlcnx->setAttribute('atribut', 'option');
Avec cette deuxieme methode il semble qu'il soit plus dure d'obtenire l'affichage des erreurs.. ici la page reste blanche en ignorant tout le code. I.e si j'affiche le code source de la page ca donne:
Code :
1
2
3
4
5
6
<html>
<head></head>
<body>
<pre></pre>
</body>
</html>
celon firebug... sinon si j'affiche la source directement via firefox, y a rien... page vide.
Vodsky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 16h20   #17
Modérateur
 
Inscription : septembre 2010
Messages : 7 106
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 106
Points : 8 454
Points : 8 454
c'est un erreur qui vient de la classe PDOStatement, qui visiblement n'arrive pas se charger, je te conseil de faire un test sur un autre serveur avec un version à jour de PHP
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 16h28   #18
Nouveau Membre du Club
 
Inscription : janvier 2009
Messages : 45
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 45
Points : 29
Points : 29
Citation:
Envoyé par stealth35 Voir le message
c'est un erreur qui vient de la classe PDOStatement, qui visiblement n'arrive pas se charger, je te conseil de faire un test sur un autre serveur avec un version à jour de PHP
Celons toi cela serai du a la version de PHP du serveur?
Il est aussi vrai que sur mon WAMP comme dis dans mon premier post, le code marche très bien...

Je n'ai pas la possibilité de teste sur un autre serveur la ou je suis. Mais si il s’avère que le problème viens de là, je me met sous mysqli de manière définitive.
Vodsky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 16h35   #19
Modérateur
 
Inscription : septembre 2010
Messages : 7 106
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 106
Points : 8 454
Points : 8 454
Citation:
Envoyé par Vodsky Voir le message
Celons toi cela serai du a la version de PHP du serveur?
y'a de grand chance ta version est vraiment obsolète (5 ans), il est grand temps de la mettre à jour
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 11h24   #20
Nouveau Membre du Club
 
Inscription : janvier 2009
Messages : 45
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 45
Points : 29
Points : 29
Citation:
Envoyé par stealth35 Voir le message
y'a de grand chance ta version est vraiment obsolète (5 ans), il est grand temps de la mettre à jour
Haha merci, je vais dire ca a mon boss, il va etre content
Vodsky est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h08.


 
 
 
 
Partenaires

Hébergement Web