[RESOLU] Fonction PHP/BDD extraction de données

Eléphanteau du PHP | 24 Messages

13 juin 2016, 11:47

Bonjour, bonsoir, à tous et à toutes !

Alors j'ai ma classe gestionOrdinateur :

Code : Tout sélectionner

<?php require_once("ordinateur.class.php"); class gestionOrdi { static function lecture(){ include('./include/connect.php'); $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; $bdd = new PDO('mysql:dbname=glpi;host=localhost', 'root', ''); $req= $bdd->query("SELECT id,name,entities_id FROM glpi_computers ORDER BY name ASC"); $TableauOrdi = array(); try { while($ligne=$req->fetch()) { $TableauOrdi[] = new Ordinateur($ligne["id"],$ligne["name"],$ligne["entities_id"]); } $req->closeCursor(); return $TableauOrdi; } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } } } ?>
J'ai une classe ordinateur :

Code : Tout sélectionner

<?php require_once("ordinateur.class.php"); class gestionOrdi { static function lecture(){ include('./include/connect.php'); $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; $bdd = new PDO('mysql:dbname=glpi;host=localhost', 'root', ''); $req= $bdd->query("SELECT id,name,entities_id FROM glpi_computers ORDER BY name ASC"); $TableauOrdi = array(); try { while($ligne=$req->fetch()) { $TableauOrdi[] = new Ordinateur($ligne["id"],$ligne["name"],$ligne["entities_id"]); } $req->closeCursor(); return $TableauOrdi; } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } } } ?>


Et j'aimerai pouvoir, retiré une information de la BDD. Cette information se nomme entities_id et se trouve dans une table glpi_computers.

J'ai fais donc une fonction :

Code : Tout sélectionner

static function entiteOrdinateur($ordinateur) { include('./include/connect.php'); $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; $bdd = new PDO('mysql:dbname=glpi;host=localhost', 'root', ''); $req= $bdd->query("SELECT entities_id FROM glpi_computers WHERE name = $ordinateur->name "); $TableauEntite = array(); try { while($ligne=$req->fetch()) { $TableauEntite[] = new User($ligne["entities_id"]); } $req->closeCursor(); return $TableauEntite; } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); }

Et sur une page récapitulatif.php, je l'appel :

Code : Tout sélectionner

if(isset($_POST["choixOrdi"])) { $ordinateur = $_POST["choixOrdi"]; $entiteOrdinateur = Entite::entiteOrdinateur($_POST["choixOrdi"]->name); }


Mais je me rend vite compte, que ça ne marche pas, et je ne vois pas la solution... En faite c'est ce qui m'est venu naturellement tout ça... Et depuis trois heures, je cherche, sans résultat ...



Merci d'avance.

Mammouth du PHP | 1967 Messages

13 juin 2016, 12:00

De ce que je vois d'une première lecture,

$_POST['choixOrdi'] n'est surement pas un objet, donc $_POST["choixOrdi"]->name devrait te renvoyer une erreur
Regarde ce qu'il y a dans $_POST['choixOrdi'] et vois si c'est ce qu'il te faut dans ta fonction ou pas.

Et si tu as des message d'erreur, cela nous aiderait surement à t'aiguiller
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 24 Messages

13 juin 2016, 12:10

Ils me sortent le nom (écrit) seulement de l'ordinateur que j'ai sélectionné dans une liste déroulante. En faite, j'ai trois pages. Une ou je choisis l'ordinateur, une ou je choisis un lieu, et une page récapitulatif. Dans la page un, dans une liste je choisis l'ordinateur, je ressors une donnée sous la forme "Ordinateur - POS001A15", le nom dans la BDD est sous la forme "POS001A15". Je la fais transité dans la page 2, ou j'enlève le "Ordinateur - " et je ne garde que le nom exacte. Et je l'envoie à la page3 (récapitulatif) ou j'essaye d'affiché l'entité, ou le problème est mentionné au dessus.
Donc pas besoin du ->name, mais est-ce que je peux faire marché ma fonction même si ce n'est pas un objet... ?


Le message d'erreur affiché par easyPHP est : Fatal error: Call to undefined method entite::entiteOrdinateur() in F:\STAGE2_VACALIANS\control\recapitulatif.php on line 14

Mammouth du PHP | 1967 Messages

13 juin 2016, 13:09

a priori si tu retire les "->name" (un dans l'appel de fonction l'autre dans la fonction dans une requête) cela a des chances de marcher
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 24 Messages

13 juin 2016, 13:56

Dans ma page control/recapitulatif.php j'ai :

Code : Tout sélectionner

<?php require('model/gestionEntite.class.php'); if(isset($_POST["choixOrdi"])) { $ordinateur = $_POST["choixOrdi"]; $entiteOrdinateur = Entite::entiteOrdinateur($_POST["choixOrdi"]); } if(isset($_POST["listeLieux"])) { $lieu = $_POST["listeLieux"]; $entiteLieu = Entite::entiteLieu($_POST["listeLieux"]); } include('view/recapitulatif.php'); ?>
Et dans ma page view/recapitulatif.php j'ai :

Code : Tout sélectionner

echo "TEST : " .$entiteOrdinateur;
Et j'ai l'erreur :


Fatal error: Call to undefined method entite::entiteOrdinateur() in F:\STAGE2_VACALIANS\control\recapitulatif.php on line 7

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

13 juin 2016, 14:20

salut,

c'est quoi le code complet de la classe ?
il semble que la classe entite n'ai pas de méthode statique entiteOrdinateur()

La syntaxe du bout de code semble correct (doc http://nl3.php.net/manual/fr/language.oop5.static.php), en mettant de coté les poitn déjà un indiqué par spols ;)

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 24 Messages

13 juin 2016, 14:26

salut,

c'est quoi le code complet de la classe ?
il semble que la classe entite n'ai pas de méthode statique entiteOrdinateur()

La syntaxe du bout de code semble correct (doc http://nl3.php.net/manual/fr/language.oop5.static.php), en mettant de coté les poitn déjà un indiqué par spols ;)

@+
Oui j'ai modifié la méthode n'est pas dans entite mais dans gestionEntite, j'ai effectué la correction.

Ma classe Entite :

Code : Tout sélectionner

<?php class entite { #region Attributs private $id; private $name; #endregion function __construct($i,$n) { $this -> id = $i ; $this -> name = $n ; } #region Accesseurs public function __set($attribut,$valeur) { switch ($attribut) { case'id': $this->id=$valeur; case'name': $this->name=$valeur; } } public function __get($attribut) { switch ($attribut) { case'id': return $this->id; case'name':return $this->name; } } #endregion public static function affecter($entite) { return unserialize(serialize($entite)); } //Méthode Affichage public function __toString() { return "Entité - " . $this->id . " " .$this->name; } }
ma classe gestionEntite :

Code : Tout sélectionner

<?php require_once("entite.class.php"); class gestionEntite { static function entiteOrdinateur($ordinateur) { include('./include/connect.php'); $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; $bdd = new PDO('mysql:dbname=glpi;host=localhost', 'root', ''); $req= $bdd->query('SELECT entities_id FROM glpi_computers WHERE name ="?"'); $TableauEntite = array($ordinateur); try { while($ligne=$req->fetch()) { $TableauEntite[] = new Ordinateur($ligne["entities_id"]); } $req->closeCursor(); return $TableauEntite; } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } } static function entiteLieu($lieu) { include('./include/connect.php'); $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; $bdd = new PDO('mysql:dbname=glpi;host=localhost', 'root', ''); $req= $bdd->query("SELECT entities_id FROM glpi_locations WHERE name = "); $TableauEntite = array($lieu); try { while($ligne=$req->fetch()) { $TableauEntite[] = new Lieu($ligne["entities_id"]); } $req->closeCursor(); return $TableauEntite; } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } } static function entiteUtilisateur($utilisateur) { include('./include/connect.php'); $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; $bdd = new PDO('mysql:dbname=glpi;host=localhost', 'root', ''); $req= $bdd->query('SELECT entities_id FROM glpi_locations WHERE name ="?"'); $TableauEntite = array($utilisateur); try { while($ligne=$req->fetch()) { $TableauEntite[] = new User($ligne["entities_id"]); } $req->closeCursor(); return $TableauEntite; } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } } } ?>
Mon controler :

Code : Tout sélectionner

if(isset($_POST["choixOrdi"])) { $ordinateur = $_POST["choixOrdi"]; $entiteOrdinateur = gestionEntite::entiteOrdinateur($ordinateur); } if(isset($_POST["listeLieux"])) { $lieu = $_POST["listeLieux"]; $entiteLieu = gestionEntite::entiteLieu($_POST["listeLieux"]); }
ma view :

Code : Tout sélectionner

echo "TEST : " .$entiteOrdinateur;
L'erreur actuelle :
Fatal error: Call to a member function fetch() on a non-object in F:\STAGE2_VACALIANS\model\gestionEntite.class.php on line 36

Mais ça ne marche pas...

Eléphanteau du PHP | 24 Messages

13 juin 2016, 14:43

J'ai modifié ma fonction :

Code : Tout sélectionner

static function entiteOrdinateur($ordinateur) { include('./include/connect.php'); $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; $bdd = new PDO('mysql:dbname=glpi;host=localhost', 'root', ''); $req= $bdd->prepare('SELECT entities_id FROM glpi_computers WHERE name ="?"'); $req->execute(array($ordinateur)); $TableauEntite = array($ordinateur); try { while($ligne=$req->fetch()) { $TableauEntite[] = new Ordinateur($ligne["entities_id"]); } $req->closeCursor(); return $TableauEntite; } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } }
J'ai modifié mon controler :

Code : Tout sélectionner

require('model/gestionEntite.class.php'); if(isset($_POST["choixOrdi"])) { $ordinateur = $_POST["choixOrdi"]; $entiteOrdinateur = gestionEntite::entiteOrdinateur($ordinateur); } include('view/recapitulatif.php');
Et ma view :

Code : Tout sélectionner

if(isset($_POST["choixOrdi"])) { echo "<br/>L'entité est " .$entiteOrdinateur[0]. "."; }

Néanmoins, je n'obtient pas l'entities_id que je recherche, mais le nom ...

Mammouth du PHP | 1967 Messages

13 juin 2016, 15:12

c'est normal, tu rempli le tableau $entiteOrdinateur d'abords avec le nom puis avec les entité retrouvé dans ta base.
les entité de ta base se trouveront à
$entiteOrdinateur[1] et suivant

Affiche $entiteOrdinateur avec un var_dump pour t'en rendre compte
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 24 Messages

13 juin 2016, 15:17

c'est normal, tu rempli le tableau $entiteOrdinateur d'abords avec le nom puis avec les entité retrouvé dans ta base.
les entité de ta base se trouveront à
$entiteOrdinateur[1] et suivant

Affiche $entiteOrdinateur avec un var_dump pour t'en rendre compte
Ca n'affiche que le nom même avec [1] ou le var_dump ...
Erreur : array(1) { [0]=> string(9) "POR009A14" }

Mammouth du PHP | 1967 Messages

13 juin 2016, 15:19

alors ta requète ne renvoi pas de donnée
affiche là et teste là en php myadmin
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 24 Messages

13 juin 2016, 15:22

alors ta requète ne renvoi pas de donnée
affiche là et teste là en php myadmin

Code : Tout sélectionner

$req= $bdd->prepare('SELECT entities_id FROM glpi_computers WHERE name ="?"'); $req->execute(array($ordinateur));
La requette fonction lorsque je remplace le "?" par le nom exacte. Je pense qu'en faite, je n'arrive pas à remplacer le "?" par le nom du PC dans mon view ou dans mon controler, je ne sais pas vraiment ...

Mammouth du PHP | 1967 Messages

13 juin 2016, 15:28

en lisant la doc, je me pencherai vers des guillemets en trop dans ta requète, ils seront ajouté par pdo en cas de besoin
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 24 Messages

13 juin 2016, 15:30

Code : Tout sélectionner

static function entiteOrdinateur($ordinateur) { include('./include/connect.php'); $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; $bdd = new PDO('mysql:dbname=glpi;host=localhost', 'root', ''); $req= $bdd->prepare('SELECT entities_id FROM glpi_computers WHERE name = "?"'); $req->execute(array($ordinateur)); $TableauEntite = array($ordinateur); try { while($ligne=$req->fetch()) { $TableauEntite[] = new Ordinateur($ligne["entities_id"]); } $req->closeCursor(); return $TableauEntite; } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } }
Je penserai plus sur une erreur dans la suite du code moi :/

Ou dans mon controler :

Code : Tout sélectionner

if(isset($_POST["choixOrdi"])) { $ordinateur = $_POST["choixOrdi"]; $entiteOrdinateur = gestionEntite::entiteOrdinateur($ordinateur); }
Ou dans l'appel ...

Eléphanteau du PHP | 24 Messages

13 juin 2016, 16:20

Ma fonction :

Code : Tout sélectionner

static function entiteOrdinateur($ordinateur) { try { include('./include/connect.php'); $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; $bdd = new PDO('mysql:dbname=glpi;host=localhost', 'root', ''); $req= $bdd->prepare('SELECT entities_id FROM glpi_computers WHERE name = "?"'); $req->execute(array($ordinateur)); $TableauEntite = $req->execute(array($ordinateur)); return $TableauEntite; } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } }
mon controler :

Code : Tout sélectionner

if(isset($_POST["choixOrdi"])) { $ordinateur = $_POST["choixOrdi"]; $entiteOrdinateur = gestionEntite::entiteOrdinateur($ordinateur); }
ma view :

Code : Tout sélectionner

if(isset($_POST["choixOrdi"])) { echo "<br/>L'entité est " .$entiteOrdinateur."."; }
J'ai encore un peu modifié. Maintenant, ils me sortent sans cesse 1 pour l'entité. Je n'ai plus le nom de l'ordinateur, mais j'ai 1. Et après vérification avec la BDD, peu importe le PC sélectionné, il n'y a pas la bonne entities_id.