classe et connexion obdc

JS
Invité n'ayant pas de compte PHPfrance

28 avr. 2006, 16:02

Salut tout le monde:

Je vous explique mon probleme :

Je souhaite faire une class que j'utiliserai pour faire des requettes vers une base de donnée (SQL server) par obdc.
Mais cela ne marche pas.

Voici comment ce presence la fonction membre qui me permet de la connecter à la base :
function connect()
{
       $idConnexion=odbc_connect($dns,$login,$mdp);
       return $idConnexion;
}
C'est bizzare car losque c'est juste une fonction (donc pas dans une classe) cela marche!
Donc est il possible d'utiliser les classes pour ce genre de choses?

Merci de votre aide!

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

28 avr. 2006, 16:06

Ne faudrait-il pas que les variables $dns, $login et $mdp soient définies quelque part ? déclarée comme globales (global $dns;) , ou comme attributs de ta classe ($this->dns) ?

Eléphant du PHP | 493 Messages

28 avr. 2006, 16:11

Ou tout simplement comme arguments de la fonction connect ?
Si la question est de savoir si tu peux utiliser les classes pour une connexion à une BDD, la réponse est oui. D'ailleur je trouve que c'est plus pratique.

Invité
Invité n'ayant pas de compte PHPfrance

28 avr. 2006, 16:13

Arf dsl normalement c'est comme ça :
function connect() 
{ 
       $idConnexion=odbc_connect('dns',$_SESSION['login'],$_SESSION['mdp']); 
       return $idConnexion; 
} 
Mais de toute façon la fonction marche mais c'est lorsque je la mais dans une classe que ça ne marche plus! :cry:

Merci de votre aide!

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

28 avr. 2006, 16:19

Qu'est ce qui ne marche plus exactement ? as-tu un message d'erreur ? comment l'appelles-tu ? est-ce que tu instancies un nouvel objet ( $obj = new TaClasse; $obj->connect(); ) ou bien l'appelle tu de manière static ( TaClasse::connect(); ) ?

Eléphant du PHP | 493 Messages

28 avr. 2006, 16:20

Il existe des classes de connexion ODBC toutes faites.
<?
###################################################
###
### http://www.phpclasses.org/browse/package/1757.html
###
###################################################
// class odbc tables

class t_odbc{
        var $db = '';
        var $user = '';
        var $password = '';
        var $id_db = '';

        // Abre la base de datos
        function opendb(){
                $this->id_db = odbc_connect($this->db,$this->user,$this->password);
        }
        
        // Regresa el numero de tablas de la base de datos
        function numtable(){
                $tables_t = odbc_tables($this->id_db);
                $i = 1;
                while (odbc_fetch_row($tables_t)) {
                      $i++;
                }
                return $i;

        }
        
        // Regresa en un arreglo los titulos de las tablas
        function headtable(){
                $tables_t = odbc_tables($this->id_db) ;
                $a_tit = array();
                $i = 0;
                while(odbc_fetch_row($tables_t)){
                        $a_tit[$i] = odbc_result($tables_t, 3);
                        //echo $a_tit[$i].'<br>';
                        $i++;
                }
                return $a_tit;
        }
        

        // Regresa en un arreglo los titulos de las columnas de determinada tabla
        function columntable($nomtable){
                $query = "SELECT * FROM $nomtable";
                $qid = odbc_exec($this->id_db, $query);
                $i = 1;
                $a_col = array();
                $j = odbc_num_fields($qid);
                
                while( $i <= $j ){
                        $a_col[$i] = odbc_field_name($qid, $i);
                        //echo $a_col[$i].'<br>';
                        $i++;
                }
                return $a_col;
        }
        
        // Muestra una tabla impresa en html
        function printtable($nomtable){
                echo '<table border="1"><tr>';

                // Consigue los nombres de mis columnas y los imprime
                $columns = $this->columntable($nomtable);
                $i = 1;

                while ($i <= count($columns)){
                        echo "<td>$columns[$i]</td>";
                        $i++;
                }
                echo '</tr>';
                
                $query = "SELECT * FROM $nomtable";
                $result = odbc_exec($this->id_db, $query);
                while ( odbc_fetch_row ($result)){
                        $j = 1;
                        echo '<tr>';
                        while($j < $i){
                                echo "<td>".odbc_result ($result, $j)."</td>";
                                $j++;
                        }
                        echo '</tr>';

                        }
                
                echo '</table>';


        }

        }

?>

JS
Invité n'ayant pas de compte PHPfrance

28 avr. 2006, 16:31

Merci beaucoup pour cette classe

Mais j'aimerais quand même resoudre mon probleme :

Voici comment je l'instancie :
$db = new db_infos();
$cnx = $db->connect();
Voici ce qu'il m'affiche :
Warning: odbc_connect() [function.odbc-connect]: SQL error: [Microsoft][Gestionnaire de pilotes ODBC] Source de données introuvable et nom de pilote non spécifié, SQL state IM002 in SQLConnect in d:\www\Risk_v01\maintenance\odbc_db.clss.php on line 9
bool(false)

Eléphant du PHP | 493 Messages

28 avr. 2006, 16:32

Il faut activer le support ODBC dans ton php.ini

JS
Invité n'ayant pas de compte PHPfrance

28 avr. 2006, 16:35

Oki! Merci!

Et c'est ça qui fait que çela ne marche pas dans la classe?

Eléphant du PHP | 493 Messages

28 avr. 2006, 16:44

Non :D

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

28 avr. 2006, 16:54

lol, m'enfin ça sera toujours une bonne chose de faite... pis tu peux aussi ouvrir la fenêtre, ça résoudra rien non plus, mais il fait beau alors autant en profiter ;)

Plus sérieusement, le premier paramètre de odbc_connect "dns" correspond il bien à ton serveur bdd ? essaye directement avec la chaine de connexion odbc de sql server sans passer par le dns :

Code : Tout sélectionner

'DRIVER={SQL Server};SERVER=<servername>;DATABASE=<databasename>'

Mammouth du PHP | 19672 Messages

28 avr. 2006, 21:24

...essaye directement avec la chaine de connexion odbc de sql server sans passer par le dns :

Code : Tout sélectionner

'DRIVER={SQL Server};SERVER=<servername>;DATABASE=<databasename>'
Pour info, c'est ce que je viens de faire pour accéder via ODBC à une base MS-Access, l'utilisation d'un DSN ne fonctionnant pas, et là, plus de problème, j'ai pu faire ce que je voulais.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

JS
Invité n'ayant pas de compte PHPfrance

02 mai 2006, 10:27

Salut tout le monde!
Dsl j'ai pas pu repondre j'été en weekend :D
J'espere que vous en avais passer un bon vous aussi!

Merci pour vos reponses!

Oui je pense que le paramettre dns correspond bien a mon server bbd puisque la connection marche lorsque la fonction n'est pas dans une classe.

Pour l'utilisation de la chaine de connexion odbc de sql server dans une fonction membre d'une classe comment doit-je proceder?
Comme ceci ?

class maclass
{
     function connex()
     {
            
'DRIVER={SQL Server};SERVER=<servername>;DATABASE=<databasename>' ;

      }
}
Comment recupéré l'id de connexion?
Merci!

Mammouth du PHP | 19672 Messages

02 mai 2006, 10:40

Bon, je ne sais pas comment est construite ta classe, pour ma part, je me suis vite fait une classe "à l'arrache" pour des besoins basiques : mes paramètres sont définis sous forme de constantes dans un fichier de configuration à part, pour le reste voilà à quoi ça ressemble:
<?php
require_once("./lib/conf.php");
/* Classe de connexion à MS-Access via ODBC */
class connectodbc
{
    /**
     * Paramètres de connexion à ODBC
     *
     * @var String
     */
    private $dsn         = "";

    /**
     * Nom d'utilisateur pour la connexion à ODBC
     *
     * @var String
     */
    private $utilisateur = "";

    /**
     * Mot de passe pour la connexion à ODBC
     *
     * @var String
     */
    private $mdp         = "";

    /**
     * Ressource de connexion
     *
     * @var Ressource
     */
    private $cnx;

    /**
     * Nombre de ligne : propriété alimentée lors d'une requête SELECT
     *
     * @var Int
     * @see nombrelignes();
     */
    private $nblignes    = 0;

    /**
     * Message d'erreur reçu lors de la dernière opération ayant échoué
     *
     * @var String
     */
    private $msgerreur   = "";

    /**
     * Ressource retournée par une requête SQL
     *
     * @var Ressource
     */
    private $ressreq;

    /**
     * Constructeur
     *
     * @param  String   $dsn            Paramètres de connexion à la base MS_Access
     * @param  String   $utilisateur    Nom identifiant l'utilisateur autorisé à la base de données
     * @param  String   $mdp            Mot de passe de l'utilisateur.
     * @return Resource                 Connexion à la base MS_Access
     */
    public function __construct($dsn = null, $utilisateur = null, $mdp = null)
    {
        $this->dsn         = isset($dsn) ? $dsn : DSN;
        $this->utilisateur = isset($utilisateur) ? $utilisateur : UTILISATEUR;
        $this->mdp         = isset($mdp) ? $mdp : MDP;
        $this->cnx = odbc_connect($this->dsn, $this->utilisateur, $this->mdp);
        if($this->cnx == false)
        {
            $this->msgerreur = "Connexion impossible sur le dsn ". $this->dsn .", erreur numéro ". odbc_error($this->cnx) ." : ". odbc_errormsg($this->cnx);
            return false;
        }
    }

    /**
     * Exécute la requête SQL envoyée en paramètre
     *
     * @param  String $sql  Requête SQL (Syntaxe MS-Access)
     * @return Boolean      True si l'exécution s'est correctement déroulée, false dans le cas contraire
     */
    public function executer($sql)
    {
        $execution = true;
        if(empty($this->msgerreur))
        {
            $this->ressreq = odbc_exec($this->cnx, $sql);
            /* On vérifie si c'est une requête de sélection et on récupère le nombre de lignes retournées */
            if(preg_match("#^SELECT\s.*#i", $sql))
            {
                $this->nblignes = odbc_num_rows($this->ressreq);
            }
            if($this->ressreq == false)
            {
                $this->msgerreur = "Exécution de la requête ". $sql ." impossible, erreur numéro ". odbc_error($this->cnx) ." : ". odbc_errormsg($this->cnx);
                $execution = false;
            }
        }
        return $execution;
    }

    /**
     * Retourne un tableau associatif des données d'une requête SELECT
     *
     * @return Array
     */
    public function tableauAssoc()
    {
        if(empty($this->msgerreur))
        {
            $donnees = odbc_fetch_array($this->ressreq);
            if($donnees != false)
            {
                return $donnees;
            }
            else
            {
                $this->msgerreur = "Récupération des données impossible, erreur numéro ". odbc_error($this->cnx) ." : ". odbc_errormsg($this->cnx);
                return false;
            }
        }
        else
        {
            return false;
        }
    }

    /**
     * Retourne le nombre de lignes extraite dans une requête SELECT : appeler cette méthode sur
     * un autre type de requête retournera un message d'avis.
     *
     * @return Mixed Nobre de lignes retournées dans une requête SELECT ou avis si la propriété est vide
     */
    public function nombrelignes()
    {
        return isset($this->nblignes) ? $this->nblignes : "Aucun nombre de ligne n'a été récupéré.";
    }

    /**
     * Méthode retournant le message d'erreur de la dernière opération ratée
     *
     * @return String Dernier message enregistré.
     */
    public function afficheerreur()
    {
        return $this->msgerreur;
    }

    /**
     * Destructeur
     *
     * Fermeture de la connexion
     */
    public function __destruct()
    {
        odbc_close($this->cnx);
    }
}
?>
Pour l'utilisation, je ne me préoccupe pas de l'identifiant de connexion, c'est dans la classe et je ne fais que des appels de méthode : donc pour l'utiliser, je procède sommairement comme ceci, exemple :
<?php
/* Création de la liste des produits */
$queryprod  = "SELECT FamilleProduit FROM T_Famille_produits ORDER BY FamilleProduit ASC";
$cnxprod  = new connectodbc();
$cnxprod->executer($queryprod);
$tab_prod = array();
while(($resultprod = $cnxprod->tableauAssoc()) != false)
{
    $tab_prod[] = $resultprod['FamilleProduit'];
}
?>
Est-ce que ça peut t'aider à avancer ? :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

JS
Invité n'ayant pas de compte PHPfrance

02 mai 2006, 10:44

Oui merci je pense que ça peut d'aider!
Si j'ai un probleme je vous en ferait part!!