IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

bindColum() [PDO]


Sujet :

PHP & Base de données

  1. #1
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut bindColum()
    Bonjour,

    ayant développé un site pour à l'origine un serveur tournant en 5.3 et qui finalement s'avère être en 5.0.5 et qui ne subira pas de mise à jour de la version de PHP avant longtemps... J'ai du créer des class émulant le comportement de PDO.

    Je suis malheureusement tombé sur un souci en tentant de reproduire le fonctionnement de la fonction PDOStatement::bindColumn()
    Le fait est que je ne récupère aucune valeur autre que NULL...

    Voici mon code d'exécution:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $res = $dbh->query("SELECT id, nom FROM site");
    	$res->execute();
    	$res->bindColumn("id",$id);
    	$res->bindColumn("nom",$nom);
    	var_dump($id); // Affiche NULL
    	while($r = $res->fetch() )
    		echo $id . "-" . $nom . "<br />"; // Affiche vide => NULL
    J'ai dans ma class PDOStatement une variable column qui me permet de faire le lien de référence. Je la créée dans execute() :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Mise à jour de column pour le bindColumn
    		if( isSet($this->result[0]) && count($this->result[0]) > 0 )
    			foreach($this->result[0] as $cle => $valeur)
    				$this->column[$cle] = "test";
    Je remplie le tableau avec la valeur test (c'était pour voir si une valeur null ou bien un caractère vide n'était pas la source de mon problème).

    Ensuite voilà ma fonction bindColumn() :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /*
    	* Lie une colonne à une variable PHP 
    	* @param (int) numéro de la colonne (en commençant à 1)
    	* @param (mixed) Nom de la variable PHP à laquelle la colonne doit être liée.
    	* @param (int) Non implémenté
    	* @param (int) Non implémenté
    	* @param (mixed) Non implémenté
    	*/
    	public function bindColumn($column, &$param, $type = "", $maxlen = "", $driverdata = "")
    	{
    		if( isSet($this->column[$column]) )
    			$param = &$this->column[$column];
    	}
    Dans cette fonction l'affichage de $param ou de $this->column[$column] fonctionne parfaitement.

    Et enfin ma fonction fetch() :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /*
    	* Récupère la ligne suivante d'un jeu de résultat PDO
    	* @return (array)
    	*/
    	public function fetch()
    	{
    		if( $this->valid() === false )
    			return false;
    		$el = $this->current();
    		foreach($el as $cle => $val) // Stockage de la valeur des colonnes pour bindColumn
    			$this->column[$cle] = $val;
    		$this->next();
    		return $el;
    	}

    Je ne comprend pas d'où provient mon erreur...

    J'ai tenté des trucs basiques de ce genre pour vérifier que je comprenais bien le principe :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function test(&$une_var){$une_var = 1;}
    test($test);
    echo $test;
    Code qui fonctionne correctement.

    Auriez-vous une idée ? Une piste que je pourrai étudier pour trouver mon problème ?
    Merci d'avance.

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $param = $this->column[$column];

  3. #3
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    C'était donc cela.

    Car effectivement stocker une adresse dans une adresse c'est pas tiptop...

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    tu peux monter ta classe en entière ça m’intéresse

  5. #5
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    J'ai encore un peu de travail à faire dessus mais ensuite je compte bien la mettre sur github.
    A noter que je ne compte pas émuler toutes les fonctions mais juste les plus courante. Car par exemple pour les commit et compagnie je dois bien avouer que je n'ai aucune idée à l'heure actuelle de comment procéder pour reproduire cela sans faire une usine à gaz...

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

  6. #6
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    Chose promise chose due.

    https://github.com/xTG/PDO

    Pas très complète mais suffit amplement pour une utilisation basique.

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo