classe et connexion obdc

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : classe et connexion obdc

par Invité » 28 sept. 2006, 11:07

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!

par JS » 16 mai 2006, 11:24

Up!
Salout tous le monde!
Merci!Le foreach été une tres bonne idée!

Mais en faite je voudrait maintenant recuper les noms des tables de la base et je me retrouve avec les tables systemes! :shock:

Apparement dans sql server il y a des tables systems et des tables utilisateurs
Moi c'est au tables utilisateurs que je voudrait avoir acces.
Apparement il y aurait un parametre (je ne sait même pas sur laquelle des fonctions) qui me permettrait de choisir mais je ne trouve pas!

Can somebody help me?

par Ryle » 03 mai 2006, 12:04

Maintenant que tu as vu la structure de ton tableau, tu dois pouvoir en déduire une règle te permettant de récupérer les éléments un par un :)

En général, il te suffit d'utiliser l'index numérique au lieu du nom associé :
$monTableau[0] te retourne le premier élément
$monTableau[1] te retourne le deuxième
...
$monTableau[n] te retourne le dernier élément
les fonctions count() et sizeOf() te permettent de connaitre le nombre d'éléments d'un tableau. Tu peux ainsi faire une boucle while ou for pour les parcourir un par un.

Une autre solution plus simple est d'utiliser directement la commande foreach() qui s'arrête automatiquement à la fin du tableau et ne se soucis pas des index.

par JS » 03 mai 2006, 11:48

Oki!
Mais ya pas un moyen de recupérer '1eredimension' et '2edimension' ect... dynamiquement?Parce que je les connais pas et le tableau à l'aire d'etre enorme pour que je le recupere à la main!
Merci

par Cyrano » 02 mai 2006, 17:04

Si tu as réussi avec un print_r, tu as forcément vu également le nom des index de la seconde dimension : donc, fais afficher :
echo($tableau['1eredimension']['2emedimension']);

par JS » 02 mai 2006, 16:57

Arf il s'agit bien d'un tableau mais pas qu'a 2 dimensions :shock:
Vous n'avez pas une idée de comment faire pour afficher les procédures?
(quelqu'un qui serait passer par la aussi)

par JS » 02 mai 2006, 16:50

Oki!
Merci!

Mais vu que je parcours mon tableau($procedures[]) il devrai pas m'afficher son contenues?
A moin qu'il s'agisse d'un tableau a 2 dimensions :shock: )

Je vais tester en fesant un print_r($procedures)!

par Ryle » 02 mai 2006, 16:29

debuggage, debuggage, debuggage.... :)

S'il t'écrit "Array" en toute lettre, c'est que tu lui demande d'afficher un tableau et comme il ne sait pas faire ça tout seul, il écrit juste "Array".

La question est pourquoi affiche-t-il un tableau ?
> sans doute parce que la variable $procedures[$i] que tu affiches est un tableau.

Comment a été initialisé la variable $procedures pour devenir un tableau de tableau ?
> elle contient le résultat de la fonction $db->Procedure_stockee()

Que retourne la fonction $db->Procedure_stockee() ?
> Elle retourne le tableau $procedures

Que contient ce nouveau tableau $procedures ?
> Il contient les différentes valeurs de $row

Que contient la variable $row ?
> le résultat de la fonction odbc_fetch_array()

Et que retourne la fonction odbc_fetch_array() d'après la doc ?
> odbc_fetch_array -- Lit une ligne de résultat dans un tableau associatif
Description
array odbc_fetch_array ( resource result [, int rownumber] )

Cette fonction retourne donc un tableau. CQFD :)

par JS » 02 mai 2006, 15:42

Re tout le monde!!

Dans ma classe je souhaite récupérer les procédures stockées
Voila comment je procede :
Ma methode:
	function Procedure_stockee()
	{
		$procedures = array();
		$proc = odbc_procedures ($this->connex);

		while ( $row = odbc_fetch_array($proc))
		 {
			echo "Proc : $row <br />";
			array_push($procedures,$row);
		 }
		
		return $procedures;
	}
Comment j'affiche :
$i = 0; 
$procedures = array();
$nb = count($procedures = $db->Procedure_stockee());
echo "nb: $nb";

while( $i <= $nb)
{
	echo "Procedure:$i:".$procedures[$i]."<br>";
	$i++;
}
Mais voila ce que j'ai :
Procedure:1:Array
Procedure:2:Array
Procedure:3:Array
Procedure:4:Array
Procedure:5:Array
Et sa jusqu'a plus de 1000

Je ne voit pas ou est le probleme car je n'est pas l'habite d'utiliser odbc(et j'y suis obliger :( ).

Merci

par JS » 02 mai 2006, 10:44

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

par Cyrano » 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

par JS » 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!

par Cyrano » 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.

par Ryle » 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>'

par Vaedan » 28 avr. 2006, 16:44

Non :D