Récupération de recordset sur base distante

Signaler
Messages postés
7
Date d'inscription
mercredi 14 mai 2003
Statut
Membre
Dernière intervention
6 octobre 2008
-
Messages postés
7
Date d'inscription
mercredi 14 mai 2003
Statut
Membre
Dernière intervention
6 octobre 2008
-
Bonjour,

Je me connecte sur une base distante sans problème mais
je n'arrive pas à récupérer les résultats de requête probablement à
cause du stockage temporaire des ressources sur le serveur distant et
non sur le local:

$con=mysql_pconnect($this->host,$this->user,$this->pwd); PAS D'ERREUR
$sql=mysql_query($query,$this->con); RETOURNE BIEN UN ID DE RECORDSET (PAR EXEMPLE #4)
$rez["cols"]=mysql_num_fields($sql);
RETOURNE L'ERREUR: Warning: mysql_num_fields(): supplied argument is
not a valid MySQL result resource in...

Quelqu'un sait-il comment accéder au resultat de la requête ?

Merci par avance!

9 réponses

Messages postés
510
Date d'inscription
lundi 27 novembre 2006
Statut
Membre
Dernière intervention
5 juillet 2009
3
Donne nous voir le contenu de $query...

Et également, ca peut aider à voir d'ou vient le pb, fais :
$sql = mysql_query ($query, $this->con) or die ("Erreur SQL
" . mysql_error ());
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
24
Hello,

pourquoi un pconnect ? Essayes sans, aussi, histoire de voir si t'as pas un soucis côté config Apache et Mysql sur ton serveur distant.
Tu peux aussi essayer une requête non mise en tampon : musql_unbuffered_query ().
Messages postés
7
Date d'inscription
mercredi 14 mai 2003
Statut
Membre
Dernière intervention
6 octobre 2008

Merci pour les réponses, mais le problème reste entier.

Je ne détaille pas la totalité du code ni les requêtes car ce serait un peu long et n'apporterait rien de plus mais voici des précisions pour que vous comprenniez le problème.
L'application marche parfaitement bien sur des accès a la DB en local (localhost) et le résultat de requête est normalement accessible.
Il est stocké dans une ressource identifiée par son ID et récupérable par php en faisant référence à cet ID.
Dans mon cas, depuis que j'ai déplacé mon application sur un autre serveur, je fais des requêtes sur la base située sur l'ancien serveur.
L'accès à la base se fait sans aucun problème (utilisateur mysql reconnu et accès distant autorisé sur cet utilisateur), le résultat de ma requête  passée par la fonction mysql_query() génère bien un ID de ressource mais l'utilisation de cette ressource pour récupérer le recordset génère l'erreur mentionnée.

Il n'y a pas d'erreur de fonctionnement du code de la couche de DB que je vous livre ci-après pour ceux qui s'y intéresseraient:

<?
class DB{

    var $con = null;
    var $host = DBHOST;
    var $user = DBUSER;
    var $pwd = DBPWD;
    var $dbname = DBNAME;

    function DB(){
        $this->con = $this->connect();
    }

    function connect(){
        if(!($con=mysql_pconnect($this->host,$this->user,$this->pwd)))
            trigger_error("Cant connect to database!");
        if(!mysql_select_db($this->dbname))
            trigger_error("Cant use db " . $this->dbname);
        return $con;
    }
   
    function new_connect($host,$user,$pwd,$dbname){
    $this->host=$host;
    $this->user=$user;
    $this->pwd=$pwd;
    $this->dbname=$dbname;
    $this->DB();
    }

    function get($query){
    //echo $query;
        if(strlen($query) > 4){
            $sql=mysql_query($query,$this->con);
            $rez = array();
            if(mysql_error()==""){
                $rez["&status"]="1";
                $rez["&cols"]=mysql_num_fields($sql);
                $rez["&rows"]=mysql_num_rows($sql);
                $rez["&total"]=$rez["&cols"]*$rez["&rows"];
                if($rez["&cols"]<=1 && $rez["&rows"]<=1){    // cols = 1, rows = 1
                    $sql1=mysql_fetch_array($sql);
                    $rez["&val"]=$sql1[0];
                    $fname = mysql_field_name($sql,0);
                    $rez["&fieldname"] = array();
                    $rez["&fieldname"][] = $fname;
                    $rez[$fname]=array();
                    $rez[$fname][]=$sql1[0];
                }
                elseif($rez["&cols"]<=1 && $rez["&rows"]>1){        // cols = 1, rows > 1
                    $i=0;
                    $fname = mysql_field_name($sql,$i);
                    $rez["&fieldname"] = array();
                    $rez[$fname] = array();
                    $rez["&fieldname"][] = $fname;
                    while($sqlr=mysql_fetch_array($sql)){
                        $rez[]=$sqlr[0];
                        $rez[$fname][]=$sqlr[0];
                        $i++;
                    }
                }
                elseif($rez["&cols"]>1 && $rez["&rows"]<=1){    // cols > 1, rows = 1
                    $i=0;
                    $rez["&fieldname"] = array();
                    for($j=0;$j<$rez["&cols"];$j++){
                        $fname = mysql_field_name($sql,$j);
                        $rez["&fieldname"][] = $fname;
                        $rez[$fname] = array();
                    }
                    while($sqlr=mysql_fetch_array($sql)){
                        for($j=0;$j<$rez["&cols"];$j++){
                            $rez[$rez["&fieldname"][$j]][]=$sqlr[$j];
                            $rez[$j][]=$sqlr[$j];
                        }
                        $i++;
                    }
                }
                elseif($rez["&cols"]>1 && $rez["&rows"]>1){        // cols > 1, rows > 1
                    $i=0;
                    $rez["&fieldname"] = array();
                    for($j=0;$j<$rez["&cols"];$j++){
                        $fname = mysql_field_name($sql,$j);
                        $rez["&fieldname"][] = $fname;
                        $rez[$fname] = array();
                    }
                    while($sqlr=mysql_fetch_array($sql)){
                        for($j=0;$j<$rez["&cols"];$j++){
                            $fname = mysql_field_name($sql,$j);
                            $rez[$fname][]=$sqlr[$j];
                        }
                        $i++;
                    }
                }
      }else{
            $rez["&status"]="0";
            $rez["&error"]=mysql_error();
      echo "QUERY: $query
";
            trigger_error("ERROR: " . mysql_error());
      }
            mysql_free_result($sql);
            return $rez;
        }
    }

    function query($query){
        $sql=mysql_query($query,$this->con);
        //echo $query;
        $rez = array();
        if(mysql_error()==""){
            $rez["&status"]="1";
            $lastid=$this->get("SELECT LAST_INSERT_ID() as lid");
            $rez["&id"]=$lastid["&val"];
        }else{
            $rez["&status"]="0";
            $rez["&error"]=mysql_error();
      echo "QUERY: $query
";
      trigger_error("ERROR: " . mysql_error());
        }
        return $rez;
    }
}

$DB=new DB;
?>

Le problème vient juste de la récupération de la ressource générée.

Qui a déjà fait l'expérience d'adresser des requêtes sur un serveur distant?
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
24
Je requête sans cesse sur des serveurs distants, mssql ou mysql, sans aucun problème.
Tu as le même problème en faisant ujn fetch_assoc, un num_rows, etc ?
Messages postés
7
Date d'inscription
mercredi 14 mai 2003
Statut
Membre
Dernière intervention
6 octobre 2008

C'est justement en faisant appel à ces fonctions dans la class DB que ça foire et retourne l'erreur, pourtant la ressource utilisée en paramètre de connexion ($this->con) est bien présente, l'accès à la DB étant sans problème:

            $sql=mysql_query($query,$this->con); ===> ne retourne aucun résultat (vide, pas en erreur car pas 0)
            $rez = array();
            if(mysql_error()==""){
                $rez["&status"]="1";
                $rez["&cols"]=mysql_num_fields($sql);  ===> erreur "supplied argument is not a valid MySQL result resource..." normale puisque pas de résultat passé en ressource
                $rez["&rows"]=mysql_num_rows($sql);

Là je suis complêtement bloqué...
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
24
            $sql=mysql_query($query,$this->con); ===> ne retourne aucun résultat (vide, pas en erreur car pas 0)

ce n'est pas ce que tu as dit dans ton 1er message...tu as dit :
$sql=mysql_query($query,$this->con); RETOURNE BIEN UN ID DE RECORDSET (PAR EXEMPLE #4)

Si tu fais ceci :
  $sql=mysql_query($query,$this->con);
if (false === $sql) {
    echo 'Erreur';
} else {
    echo 'Tout va bien :
';
    if (is_resource ($sql)) {  
      echo 'Ressource de type : ', get_resource_type ($sql);
    } else {
         echo 'Type : ', gettype ($sql), ' && valeur ', $sql;
    }
}

il se passe quoi ?
Messages postés
7
Date d'inscription
mercredi 14 mai 2003
Statut
Membre
Dernière intervention
6 octobre 2008

mince, je me suis tompé dans le premier message, c'est pas le recordset mais l'ID de connection
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
24
L'ID de connexion n'indique pas si mysql_query a fonctionné. mysql_query () renvoie une ressource de résultat mysql (mysql result), et c'est cette ressource qui est utilisée par les mysql_num, ou fetch_*.
Que donne mon test ?
Messages postés
7
Date d'inscription
mercredi 14 mai 2003
Statut
Membre
Dernière intervention
6 octobre 2008

Ben après un démontage complet des objets générés par mon application, je crois avoir mis le mis le doigt sur quelquechose de beaucoup plus compliqué que prévu. J'ai fait une petite page de test simple et il s'avère que là je récupère normalement le résultat de requête. Dans mon cas, il y a des tas d'objets simples qui sont ensuite dérivés, dont les objets de connexion de DB qui appartiennent à des objets de niveau supérieur.
En me connectant sur la base distante, l'objet de connexion ne doit générer un ID qui fait conflit avec un autre stocké dans l'objets parent.
Je vais regarder de ce côté là.

Merci en tout cas malalam pour ton intervention.
Chaque chose étant bénéfique, je peux t'assurer que la class DB est d'une efficacité redoutable avec si peu de lignes de code..
Je m'en sers depuis des mois sans aucun soucis.