Bonjour,
Voila je rencontre un petit problème avec mon code.
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());
}
}
Je voudrai obtenir "entities_id" qui se situe dans ma BDD dans une table glpi_computers.
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.
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.
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
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
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']
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
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'];
Notice: Undefined index: entities_id in F:\STAGE2_VACALIANS\model\GestionEntite.class.php on line 16
Soit sur cette ligne : return $TableauEntite['entities_id'];
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;
}
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 !
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.