Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Décrivez ici votre code ou ce que vous cherchez à faire
J'ai une classe ordinateur :

<?php
require_once("gestionOrdi.class.php");
class ordinateur
{
    #region Attributs
    private $id;
    private $name;
    private $entite;
    #endregion 

    function __construct($i,$n,$e) 
    {
        $this -> id = $i ;
        $this -> name = $n ;
        $this -> entite = $e;
    } 

    #region Accesseurs
    public function __set($attribut,$valeur)
    {

        switch ($attribut) 
        {
            case'id': $this->id=$valeur;
            case'name': $this->name=$valeur;
            case'entite': $this->entite=$valeur;
        }
    }   

    public function __get($attribut)
    {
        switch ($attribut) 
        {
            case'id': return $this->id;
            case'name':return $this->name;
            case'entite':return $this->entite;
        }
    }
    #endregion

    public static function affecter($ordinateur)
    {
        return unserialize(serialize($ordinateur));
    }

    //Méthode Affichage
    public function __toString() 
    {
        return "Ordinateur - " . $this->name;
    }
}
?>

Une classe gestionOrdi :

<?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 un controller recapitulatif.php :

<?php
    require('model/gestionEntite.class.php');
    require('model/ordinateur.class.php');

    if(isset($_POST["choixOrdi"]))
    {
        $ordinateur = new ordinateur("", $_POST["choixOrdi"], "");
        $entiteOrdinateur = gestionEntite::entiteOrdinateur($ordinateur);
    }
    include('view/recapitulatif.php');
?>

J'ai une view recapitulatif.php :

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Récapitulatif</title>
    </head>
    </head>
    <body>
<?php
    if(isset($_POST["listeLieux"]))
    {
    $choixLieu = $_POST["listeLieux"];
    $choixLieu = substr ($choixLieu,7);
    }

    if(isset($_POST["choixOrdi"]))
    {
    $choixOrdi = $_POST["choixOrdi"];
    }
    if(isset($_POST["choixUser"]))
    {
    $choixUser = $_POST["choixUser"];
    }
    echo "Le lieu correspondant à ".$choixOrdi.$choixUser." est ".$choixLieu.".";

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

    //echo "TEST : " .$entiteOrdinateur;
?>

    <form id="frmOrdi" name="frmOrdi" action="?page=lieu" method="post">

    <input type="submit" value="Modifier entitée" onclick=""/>
    <input type="button" value="Accueil" onclick="self.location.href='http://glpi.diamant.soleilhpa.fr/glpiNelson/index.php/fiches_ctrl'"/>
    </form>
</body>
</html>

J'ai une fonction dans une classe gestionEntite qui est :

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 = :ordinateur');
            //$req->execute(array($ordinateur));
            $TableauEntite = $req->execute(array(':ordinateur' =>$ordinateur));
            $TableauEntite = $TableauEntite->fetchAll();
            return $TableauEntite;
        }
        catch (Exception $e)
        {
            die('Erreur : ' . $e->getMessage());
        }
    }

Ce que je veux

Je voudrai obtenir "entities_id" qui se situe dans ma BDD dans une table glpi_computers.

Ce que j'obtiens

Problème, c'est que ma fonction ou mes appels ne marchent pas. Il me retourne sans cesse 1. Sans mettre la ligne :
$TableauEntite = $TableauEntite->fetchColumn(); ou $TableauEntite = $TableauEntite->fetchAll();
J'obtient 1, avec cette ligne j'obtient l'erreur
Fatal error: Call to a member function fetchColumn() on a non-object in monchemin on line 15.
Lors que je fais la commande :
$req->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
J'ai l'erreur :
Warning: PDOStatement::setAttribute(): SQLSTATE[IM001]: Driver does not support this function: This driver doesn't support setting attributes in monchemin on line 15

Je vous remercie par avance, je galère vraiment depuis deux ou trois jours, c'est une erreur débile j'en suis sur, mais voilà, ça me bloque tout mon projet.

18 réponses


Freezon
Auteur
Réponse acceptée

Ca me retourne -1, tu as raison.

        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 id,name,entities_id FROM glpi_computers WHERE name = :ordinateur');
        //$req->execute(array($ordinateur));
        $req->execute(array(':ordinateur' =>$ordinateur));

L'erreur est donc dans ce bloc.

Huggy
Réponse acceptée

Oui forcement tu passes un objet Ordinateur à ta fonction alors qu'elle attend un nom d'ordinateur (String)
il faudrait faire

$entiteOrdinateur = gestionEntite::entiteOrdinateur($ordinateur->name);

1) Le setAttribute doit être fait sur l'objet $bdd
2) avant de faire le fetchAll, vérifie que la méthode exécute a bien retourné un objet et pas false

Freezon
Auteur

1) Le setAttribute sur $bdd ne m'affiche aucune erreur.
2) Comment le vérifier ? Vue que ça m'affiche 1 sur ma page php, je pense que execute est une fonction booléenne, et donc elle me renverrai true...

pour 2) exact ça retourne un booléen désolé

Pour le 1)
si tu fais $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
tu devrais catcher l'erreur sans pb
je vois que tu avais préparé un tableau d'options, donc

$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:dbname=glpi;host=localhost', 'root', '', $pdo_options);

Essaye PDOException plutôt qu'Exception

Freezon
Auteur

Je veux bien effectuer ces changements, j'applique comme j'ai pu apprendre en cours nous on utiliser Exception. Mais ça ne fait toujours pas marcher ma fonction en faite ... Je ne vois vraiment pas d'où peu venir mon erreur.

Merci en tout cas de m'apprendre les différentes syntaxes de PDO et de m'avoir conseillé !

Ta fonction retourne une matrice parceque fetchAll retourne un tableau à 2 dimensions (lignes x colonnes)
même si ta requête ne renvoie qu'une seule ligne
il faut lire

 $entiteOrdinateur[0]['entities_id']

si tu avais utilisé fetch tu aurais eu qu'un tableau à une dimension

 $entiteOrdinateur['entities_id']
Freezon
Auteur

Merci de m'avoir expliqué la différence des fetch !! Ca m'aide vraiment !
Donc j'ai remplacé le fetchAll par un fetch.
Le :
$entiteOrdinateur['entities_id']
Si je comprend bien c'est dans ma view, c'est l'appel.
Mais avec ma fonction :

    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 = :ordinateur');
            //$req->execute(array($ordinateur));
            $TableauEntite = $req->execute(array(':ordinateur' =>$ordinateur));
            $TableauEntite = $TableauEntite->fetch();
            return $TableauEntite;
        }
        catch (Exception $e)
        {
            die('Erreur : ' . $e->getMessage());
        }
    }

J'obtiens l'erreur suivante :
Fatal error: Call to a member function fetch() on a non-object in F:\STAGE2_VACALIANS\model\GestionEntite.class.php on line 15

Tu l'as dit toi même, le execute renvoie un booleen
tu dois appliquer le fetch sur $req

Freezon
Auteur
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 = :ordinateur');
        //$req->execute(array($ordinateur));
        $TableauEntite = $req->execute(array(':ordinateur' =>$ordinateur));
        $TableauEntite = $req->fetch();
        return $TableauEntite;
    }
    catch (Exception $e)
    {
        die('Erreur : ' . $e->getMessage());
    }
}

Je fais donc ça ?
Si oui, je n'ai plus rien du tout, plus de 1, plus d'erreur, c'est peut-être une avancée..

essaye de renvoyer l'id seul

$req->execute(array(':ordinateur' =>$ordinateur));
$TableauEntite = $req->fetch();
return $TableauEntite['entities_id'];
Freezon
Auteur

Notice: Undefined index: entities_id in F:\STAGE2_VACALIANS\model\GestionEntite.class.php on line 16
Soit sur cette ligne : return $TableauEntite['entities_id'];

c'est que PDO ne renvoie pas de tableau associatif
essaye
return $TableauEntite[0];

Freezon
Auteur
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 id,name,entities_id FROM glpi_computers WHERE name = :ordinateur');
        //$req->execute(array($ordinateur));
        $req->execute(array(':ordinateur' =>$ordinateur));
        $TableauEntite = $req->fetchAll();
        return $TableauEntite[0];
    }
    catch (Exception $e)
    {
        die('Erreur : ' . $e->getMessage());
    }
}

ERREUR : Notice: Undefined offset: 0 in F:\STAGE2_VACALIANS\model\GestionEntite.class.php on line 16

Ca serait pas un probleme dans mon controler :


    if(isset($_POST["choixOrdi"]))
    {
        $ordinateur = new Ordinateur("", $_POST["choixOrdi"], "");
        $entiteOrdinateur = GestionEntite::entiteOrdinateur($ordinateur);
    }

Ou dans ma vue :

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

c'est que ta requête ne retourne rien
pour un fetch, il faut toujours tester s'il y a un résultat


$req->execute(array(':ordinateur' =>$ordinateur));
if ($TableauEntite = $req->fetch()) {
       return $TableauEntite[0];
 } else {
   return -1;
}
Freezon
Auteur

Il est là le soucis, je pensais avoir récupérer le nom de l'ordinateur présent dans ma view. L'erreur venait donc bien du controler. Merci beaucoup ! ENORMEMENT même !

Je te conseille de renommer ta fonction getOrdinateurIdByName()
au moins on comprend

Freezon
Auteur

Non non, ca ne me permet pas de récupérer l'ordinateur. C'est assez complexe a comprendre.
L'interface que je dois réaliser est assez complexe, et en faite, avant cet étape j'ai du choisir un lieu et un ordinateur. Un ordinateur appartient à utilisateur, qui appartient à un lieu, et le lieu correspond à une entitée. Donc l'utilisateur et/ou l'ordinateur a l'entitée correspondante.