Page 1 sur 1

erreur sus 'mysql_fetch_object'

Posté : 22 août 2007, 18:29
par Gofromiel
Je suis un peu désespéré. Je viens de créer une boutique en ligne, tout marche très bien sur mon serveur local mais sur le serveur distant la fonction 'mysql_fetch_object()' me renvoie une erreur sournoise :
Warning: mysql_fetch_object() [function.mysql-fetch-object]: The result type should be either MYSQL_NUM, MYSQL_ASSOC or MYSQL_BOTH.
J'ai remplacé la fonction par mysql_fetch_array() et mysql_fetch_row(), les deux fonctionnent. Cette fonction aurati-elle un bug dans la version 4 de PHP ? (la version toute moisie évidement utilisée sur le serveur distant). C'est très pénible parce que j'ai basé tout le code sur des objets (avec des méthodes). Je me vois mal changer tout les '->' par des '[]' et dire adieu au OOP maintenant...

Quelqu'un a une idée ? les recherches sur Google et PHP n'ont rien donné...

Re: erreur sus 'mysql_fetch_object'

Posté : 22 août 2007, 18:34
par zeus
Warning: mysql_fetch_object() [function.mysql-fetch-object]: The result type should be either MYSQL_NUM, MYSQL_ASSOC or MYSQL_BOTH.
Visiblement, selon cette erreur, le 1er paramètre passé à mysql_fetch_object() n'est pas apprécié.
Donne nous un exemple incluant un mysql_query() :-k
...dire adieu au OOP maintenant...
J'espère que tu es conscient que la programmation objet, c'est plus que des -> dans ton code :lol:

Posté : 22 août 2007, 18:49
par Gofromiel
Il va être difficile de te fournir un morceau de code 'simple' car mon système est entièrement OOP avec pas mal de couche, m'enfin :
class User
{
	var $uid;
	var $username;
	var $password;
	var $name;
	var $email;
	var $created;
	var $rid;
	
	function IsAdmin()
	{
		if ($this->uid != 1)
		{
			return FALSE;
		}
		
		return TRUE;
	}
	
	function HasPermission($access)
	{
		...
	}
}

class WdAdmin_users extends WdAdmin
{
	function Load($uid)
	{
		global $_db;

		if (is_numeric($uid))
		{
			$query = "SELECT * FROM {$this->table} WHERE uid = %d";
		}
		else
		{
			$query = "SELECT * FROM {$this->table} WHERE LOWER(username) = LOWER('%s')";
		}
		
		$rc = $_db->Query($query, $uid);
		
		if (!$rc)
		{
			return NULL;
		}
		
		return $_db->FetchObject($rc, 'User');
	}
}
Mais le problème ne vient pas du résultat puisque 'assoc', 'array' and 'row' fonctionnent. C'est l'implémentation de 'mysql_fetch_object' qui pêche :-(

Posté : 22 août 2007, 18:59
par zeus
Dans ce cas, donne moi la classe d'interfacage avec la base de données

Posté : 22 août 2007, 19:02
par Gofromiel
Une version directe :
$rc = mysql_query("SELECT * FROM users WHERE uid = '1' LIMIT 1");

if ($rc)
{
	$_SESSION['log'][] = "result: $rc, rows: " . mysql_num_rows($rc) . ", fields: " . mysql_num_fields($rc);
			
	$obj = @mysql_fetch_object($rc, 'User');
			
	$_SESSION['log'][] = print_r($obj, true);
}
else
{
	$_SESSION['log'][] = "result is NULL";
}
Avec pour messages:
# result : Resource id #19, rows: 1, fields: 7
# stdClass Object ( )
Raaaaaa, ske c'est pénible ! En plus pas moyen de connaitre le type de résultat renvoyé par 'query()'...

Posté : 22 août 2007, 19:04
par zeus
et si tu fait un var_dump($rc) dans le 1er exemple ?

Posté : 22 août 2007, 19:12
par Gofromiel
Mince, j'ai mis à jour mon message pendant que tu répondais. Merci beaucoup de m'aider d'ailleurs !

var_dump() me donne :

Code : Tout sélectionner

resource(19) of type (mysql result)
Rien d'étonnant.

C'est vraiment incompréhensible. Comme tu peux le voir dans le message précédent, il y a bien une ligne avec 7 champs dans le résultat...

Posté : 22 août 2007, 19:45
par zeus
Dans ce cas, on va attaquer le problème d'une autre manière.

Regarde une page qui te donne cette erreur, remonte jusqu'à la requête qui pose problème et donne nous le bout de code en question ;)

Posté : 22 août 2007, 19:54
par Gofromiel
L'exemple que j'ai donné précédemment est tout simple et provoque une erreur avec 'fetch_object', alors que le résultat est valable pour 'fetch_array', 'fetch_assoc' ou encore 'fetch_row'. Je ne vois pas quoi te donner comme information complémentaire. Si seulement un de mes hébergeurs utilisait le PHP5 je pourrais tester mon code ailleurs que sur mon serveur local :-(

Tu n'as jamais eu de problème avec mysql_fetch_object ?

Posté : 22 août 2007, 20:01
par zeus
Effectivement, c'est très bizarre :-k

J'avoue que je ne vois absolument pas de quoi ça peut venir :?

Posté : 22 août 2007, 20:07
par Gofromiel
Ben moi non plus, c'est complètement débile. Du coup je suis en train de créer un 'workaround' pour transformer le tableau associatif en un objet d'une classe spécifique, avec ce qu'il faut pour l'initialiser. Pff, c'est n'importe quoi.

Je vais aussi essayer le code chez 1and1 pour voir s'ils s'en sortent mieux que OVH. Je vous tiens au jus. En attendant voici un remplaçant pour fetch_object:

Code : Tout sélectionner

function FetchObject($rc, $class=NULL) { //return mysql_fetch_object($rc, $class); $rc = mysql_fetch_assoc($rc); if (!$rc) { return; } // $_SESSION['log'][] = "class: $class, assoc: <pre>" . print_r($rc, true) . '</pre>'; if ($class) { $object = new $class; foreach ($rc as $key => $value) { $object->$key = $value; } // $_SESSION['log'][] = "FETCH OBJECT ($class) : <pre>" . print_r($rc, true) . '</pre>'; $methods = get_class_methods($class); $low = strtolower($class); foreach ($methods as $name) { // $_SESSION['log'][] = "compare '$name' ?= '$low' : " . ($name == $low); if ($name == $low) { // $_SESSION['log'][] = "call initializer: $class"; $object->$class(); break; } } $rc = $object; } else { $rc = (object) $rc; } // $_SESSION['log'][] = "FETCH OBJECT ($class) : <pre>" . print_r($rc, true) . '</pre>'; return $rc; }
Bon, ça marche, mais le constructeur est appelé deux fois (objet vide / objet rempli par nos soins).

Merci pour ton aide. Si tu as vent d'une solution meilleure que mon 'truc' merci de m'en faire part.

Bonne continuation ++


*** EDIT ***

Grâce à la ligne "SetEnv PHP_VER 5" dans le fichier .htaccess, on peut utiliser PHP5 sur les serveur OVH. Et Ô miracle, mysql_fetch_object() marche comme sur des oeufs, il s'agit donc bien d'un problème lié au PHP4. Bref, ma fonction ne sert plus à grand chose, mais elle pourra peut-être être utile à d'autres qui n'ont pas la possibilité de choisir qu'elle version de PHP exécuter.