requete query recalcitrante

Eléphant du PHP | 108 Messages

14 juin 2006, 10:48

bonjour

en local, tout se passe bien, mais une fois en ligne chez free
j'ai une erreur sur ce script :
$result = $conn->query("select * from user where username='$username'");
Fatal error: Call to a member function query() on a non-object in /mnt/124/free.fr/2/0/chezmm/v3/fct_user_auth.php5 on line 13
A noter:
en changeant mon extension en .php5 on peut utiliser php5 chez free.
voir phpinfo()

Merci pour ceux qui aide sur ce forum (deja pas mal de problemes resolus grace a eux :P )

Eléphant du PHP | 119 Messages

14 juin 2006, 10:52

$result = $conn->query("select * from user where username='$username'");

moi je mettrais plutot
$result = $conn->query("select * from user where username='.$username.'");
et est ce que tu es sur de tes identifiants de connexion a la base de données de chez Free ??

Eléphant du PHP | 108 Messages

14 juin 2006, 11:05

si http://blabla.free.fr

serveur : sql.free.fr
login : blabla
mot passe: mot de passe de blabla
base : blabla

pour chez free

et ensuite dans la requete, je selectionne la table user

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

14 juin 2006, 11:16

Fatal error: Call to a member function query() on a non-object in /mnt/124/free.fr/2/0/chezmm/v3/fct_user_auth.php5 on line 13
=> Erreur Fatale : Appel d'une fonction membre (donc d'un objet) query() sur un non objet dans le script fct_user_auth.php5 ligne 13

$conn n'est donc pas considéré comme un objet... la classe est elle accessible, as-tu bien un $conn = new NomObjet() ? fait un print_r($conn) pour savoir ce qu'il contient...

Eléphant du PHP | 108 Messages

14 juin 2006, 11:24

print_r($conn) m'affiche : 1

donc ca doit etre bon, non?
// Connexion la base de donnee
  $conn = db_connect();
  print_r($conn);

  // Verifie s'il existe un nom d'utilisateur identique
  $result = $conn->query("select * from user where username='.$username.'");

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

14 juin 2006, 11:30

Nope c'est pas bon du tout :)

Tu devrais avoir un objet de type "Connexion" (en toute logique d'après le reste de ton code) là tu as juste un nombre :) (et forcément, appeller une méthode sur un nombre au lieu d'un objet, ça a peut de chance de réussir ;))

Ta méthode db_connect() devrait donc d'après ton code te retourner un objet, quelque chose du genre : Object (db =>, login => ... ) et pour lequel la méthode query() est définie

(chais pas si je suis très clair, donc n'hésite pas s'il faut que je sois plus précis sur certains points)

Eléphant du PHP | 108 Messages

14 juin 2006, 11:38

voila ma fonction dbconnect():
function db_connect()
{
   $db = new mysqli('sql.free.fr', 'blabla', '****', 'blabla');
   if (!$db)
     throw new Exception('Le Serveur ne répond pas');
   else
     return $db;
mais j'ai eu un message d'erreur a cause de mysqli
Fatal error: Class 'mysqli' not found in /mnt/124/free.fr/2/0/chezmm/v3/cnx_db.php5 on line 5
donc j'ai change en:
function db_connect()
{
 $serveur = "sql.free.fr"; // serveur. Ex : localhost.
$login = "blabla"; // Login de connexion à la base.
$pass = "****"; // Password de connexion à la base.
$base = "blabla"; // Base de Données.

$connect=mysql_connect($serveur,$login,$pass) or die ("Le Serveur ne répond pas");
$db=mysql_select_db("$base",$connect) or die ("Connexion à la base $base impossible");

   if (!$db)
     throw new Exception('Le Serveur ne répond pas');
   else
     return $db;
};
chose qui doit etre fausse alors donc j'ai remis comme la premiere version avec mysqli.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

14 juin 2006, 12:18

Par rapport à ta fonction, la fonction initiale retourne un objet de type mysqli. L'erreur que tu avais indiquait qu'il ne trouvait pas la classe nommée mysqli. Il te manquait donc probabelemnt un include pour que ta fonction puisse instancier un tel objet.

La fonction par laquelle tu l'as remplacé se connecte effectivement bien à mysql, mais retourne le résultat de la fonction mysql_select_db, qui n'a du coup rien à voir avec l'objet mysqli attendu par le reste du code, nottament pour pouvoir appeler sa méthode query() :)

Il faut donc que tu inclus cette classe dans ton script pour qu'il fonctionne :)

Eléphant du PHP | 108 Messages

14 juin 2006, 12:21

Merci de ta reponse Ryle

mais alors pourquoi en local tout se passe bien la connexion se fait mais pas chez free..

PS: je n'ai pas bien compris ce que je dois faire :? avec mysqli

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

14 juin 2006, 12:39

C'est une très bonne question :-k

Quand tu fais un print_r en local de ton $conn tu obtiens quoi ? un objet ou toujours un "1" ?

En gros, pour appeller $conn->query() il faut que $conn contienne un objet (ou classe) mysqli, que ta fonction db_connect() doit pouvoir instancier. Tu dois donc avoir quelque part un fichier contenant la déclaration de cette classe (class mysqli { ... })

(à moins que ce ne soit un truc inclu ou paramétrable dans ta version de php et qui ne serait pas chez free ? .. je doute un peu mais comme je ne connais pas particulierement php5)

Eléphant du PHP | 108 Messages

14 juin 2006, 12:52

voila le messageque j'ai en local :
mysqli Object ( )
Tiré du livre PHP 5 et MYSQL 5
PHP5 possede une nouvelle bibiliotheque pour la connexion a MYSQL. Cette bibiliotheque est appele mysqli (le i = improved). ... La bibliotheque mysqli vous permet d'utiliser une syntaxe orientée objet ou procedural...
Elle peut etre utilise avec MYSQL 4 et ulterieures.

Donc a mon avis ca doit etre incorporer a PHP 5!

Avec l'extension .php5 chez free, ca permet d'utiliser php5 (verifier avec phpinfo() ) -->PHP Version 5.1.3RC4-dev

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

14 juin 2006, 13:49

Oui mais il faut que free utilise php5 et la classe mysqli.
Tes modifications ne tiennent pas la route, si t'as modifé ta fonction de connexion il faut créer une autre pour exécuter les requête car tes modifs rende l'objet obsolète en l'absence d'une référence à mysqli.

Proposition sans mysqli:
function db_connect() 
{ 
global $connect;

$serveur = "sql.free.fr"; // serveur. Ex : localhost. 
$login = "blabla"; // Login de connexion à la base. 
$pass = "****"; // Password de connexion à la base. 
$base = "blabla"; // Base de Données. 

$connect=mysql_connect($serveur,$login,$pass) or die ("Le Serveur ne répond pas"); 
$db=mysql_select_db("$base",$connect) or die ("Connexion à la base $base impossible"); 

return $connect; 
}
il faudra aussi inventer une fonction pour remplacer l'appel à la méthode query :
function query($sql) 
{ 
global $connect;

if (!$result = mysql_query($sql, $connect) )
     throw new Exception('Le Serveur ne répond pas'); 
   else 
     return $result; 
}
Dans le programme principal tu devras écrire alors:
// Connexion la base de donnee 
  db_connect(); 

  // Verifie s'il existe un nom d'utilisateur identique 
  $result = query("select * from user where username='.$username.'");
Mais si t'as remarqué, $connect est une variable globale partagée par toutes les fonctions et le programme principal.
Modifié en dernier par sadeq le 14 juin 2006, 13:57, modifié 2 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 108 Messages

14 juin 2006, 13:52

donc je ne peux pas utiliser
function db_connect()
{
   $db = new mysqli('sql.free.fr', 'blabla', '****', 'blabla');
   if (!$db)
     throw new Exception('Le Serveur ne répond pas');
   else
     return $db;
et
// Connexion la base de donnee
  $conn = db_connect();
  print_r($conn);

  // Verifie s'il existe un nom d'utilisateur identique
  $result = $conn->query("select * from user where username='.$username.'");
et que je dois faire les changements que tu m'as propose, Sadeq?

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

14 juin 2006, 13:56

Effectivement, en l'absence de la classe mysqli le programme est obsolète.
il faut réécrire tous les accès mysql. Comme j'ai proposé dans mon ex post.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 108 Messages

14 juin 2006, 13:58

merci

mais pourtant free gere php5 (phpinfo() )

bon il me reste du boulot en fin de compte, je croyais en avoir termine :?

Merci encore