Récupération de recordset sur base distante

denra Messages postés 7 Date d'inscription mercredi 14 mai 2003 Statut Membre Dernière intervention 6 octobre 2008 - 4 déc. 2006 à 17:32
denra Messages postés 7 Date d'inscription mercredi 14 mai 2003 Statut Membre Dernière intervention 6 octobre 2008 - 5 déc. 2006 à 15:52
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

Bling 182 Messages postés 510 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 5 juillet 2009 3
4 déc. 2006 à 18:02
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 ());
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 déc. 2006 à 19:17
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 ().
0
denra Messages postés 7 Date d'inscription mercredi 14 mai 2003 Statut Membre Dernière intervention 6 octobre 2008
5 déc. 2006 à 11:24
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?
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
5 déc. 2006 à 11:47
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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
denra Messages postés 7 Date d'inscription mercredi 14 mai 2003 Statut Membre Dernière intervention 6 octobre 2008
5 déc. 2006 à 12:46
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é...
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
5 déc. 2006 à 13:00
            $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 ?
0
denra Messages postés 7 Date d'inscription mercredi 14 mai 2003 Statut Membre Dernière intervention 6 octobre 2008
5 déc. 2006 à 14:14
mince, je me suis tompé dans le premier message, c'est pas le recordset mais l'ID de connection
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
5 déc. 2006 à 15:26
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 ?
0
denra Messages postés 7 Date d'inscription mercredi 14 mai 2003 Statut Membre Dernière intervention 6 octobre 2008
5 déc. 2006 à 15:52
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.
0
Rejoignez-nous