Bonjour,
Voila je rencontre un petit problème avec mon code.
PostsController.php
<?php
class PostsController extends Controller{
function index(){
$this->loadModel('Post');
$condition = array('online' => 1,'type'=>'post');
$d['posts'] = $this->Post->find(array(
'conditions' => $condition
));
$d['total'] = $this->Post->findCount($condition);
$this->set($d);
}
function view($id){
$this->loadModel('Post');
$condition = array('online'=>1,'id'=>$id,'type'=>'post');
$d['page'] = $this->Post->findFirst(array(
'conditions' =>$cond
));
if(empty($d['page'])){
$this->e404('Page temporairement indisponible ');
}
$this->set($d);
}
}
?>
Model.php
En<?php
class Model{
static $connections = array();
public $conf = 'default';
public $table = false;
public $db;
public $primarykey = 'id';
public function __construct(){
if($this->table === false){
$this->table = strtolower(get_class($this)).'s';
}
$conf = Conf::$databases[$this->conf];
if(isset(Model::$connections[$this->conf])){
$this->db = Model::$connections[$this->conf];
return true;
}
try{
$pdo = new PDO(
'mysql:host='.$conf['host'].';dbname='.$conf['databases'].';',
$conf['login'],
$conf['password'],
array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')
);
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
Model::$connections[$this->conf] = $pdo;
$this->db = $pdo;
}catch(PDOException $e){
if(Conf::$debug >= 1){
die($e->getmessage());
}else{
die('Impossible de se connecter à la base de donnée');
}
}
}
public function find($req){
$sql = 'SELECT ';
if(isset($req['fields'])){
if(is_array($req['fields'])){
$sql .= implode(', ', $req['fields']);
}else{
$sql .= $req['fields'];
}
}else{
$sql .='*';
}
$sql .= 'FROM '.$this->table.' as '.get_class($this).' ';
if(isset($req['conditions'])){
$sql .= ' WHERE ';
if(!is_array($req['conditions'])){
$sql .= $req['conditions'];
}else{
$cond = array();
foreach ($req['conditions'] as $k => $v) {
if(!is_numeric($v)){
$v = '"'.addslashes($v).'"';//mysql_real_escape_string(),$v = '"'.addslashes($v).'"';
}
$cond[] = "$k=$v";
}
$sql .= implode(' AND ', $cond);
}
}
//die($sql);
$pre = $this->db->prepare($sql);
$pre->execute();
return $pre->fetchAll(PDO::FETCH_OBJ);
}
public function findFirst($req){
return current($this->find($req));
}
public function findCount($conditions){
die (print_r($this->findFirst(array(
'fields' => 'COUNT('.$this->primarykey.') as count',
'conditions' => $conditions
))));
}
}
?>
je veux récupérer COUNT
j'obtiens cet erreur a la place
1
$pre->execute(); le code correspond à la ligne 74 de ma page
Bonjour.
Il y a trois problèmes dans ton code de la fonction index.
Le premier, c'est que tu veux récupérer un nombre d'enregistrement de ta table, alors que tu fais une requête pour ne récupérer qu'un seul enregistrement (c'est tout du moins ce qui le fait penser vu le nom de la méthode findFirst
).
Le second, c'est pourquoi est-ce que tu fais deux requêtes SQL, alors qu'à la base tu récupères les mêmes enregistrements ?
Ce ne serait pas plus simple et moins onéreux en ressources serveur de faire quelque chose comme :
$this->loadModel('Post');
$condition = array('online' => 1,'type'=>'post');
$d['posts'] = $this->Post->find(['conditions' => $condition]);
$d['total'] = count($d['posts']);
$this->set($d);
Le troisième, c'est que tu as du code qui est en dehors d'une fonction mais aussi des fonctions qui sont en dehors de ta classe.
Ce n'est donc pas étonnant que tu aies des problèmes.
Pour le code qui est en dehors d'une fonction _(_construct()):
$conf = Conf::$databases[$this->conf];
if (isset(Model::$connections[$this->conf])) {
$this->db = Model::$connections[$this->conf];
return true;
}
try {
$pdo = new PDO(
'mysql:host='.$conf['host'].';dbname='.$conf['databases'].';',
$conf['login'],
$conf['password'],
array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')
);
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
Model::$connections[$this->conf] = $pdo;
$this->db = $pdo;
} catch(PDOException $e) {
if (Conf::$debug >= 1) {
die($e->getmessage());
} else {
die('Impossible de se connecter à la base de donnée');
}
}
Et pour les fonctions qui sont en dehors de la classe, ce sont toutes les autres, soit : find, findFirst et findCount, sans compter le :
En
en début du fichier avant la balise <?php
, c'est une erreur de copie de ton code ou est-ce qu'il y est réellement dans le fichier de ta classe ?
Dernière chose, tu devrais éviter de faire des die()
ou du debug
dans les classes secondaires, tu devrais plutôt le faire par exemple dans les fonction qui appelles leurs méthodes, soit dans ton cas dans la fonction de ton controller.
Bonjour Lartak merci beaucoup pour votre reponse si rapide, EN en debut de mon code est une erreur de frappe
je voudrai récupérer le COUNT comme sur le tuto jour 4 à 18:05 de la video en utilisen ce code
public function findCount($conditions){
die(print_r($this->findFirst(array(
'fields' => 'COUNT('.$this->primarykey.') as count',
'conditions' => $conditions
))));
};
et pouvoir récupérer ceci dans la page
array( [0] =>stdClass Object( [count] => 2 ))1
merci encore
J'ai bien compris ce que tu veux faire, par contre, je me demande si tu as bien lu l'intégralité de mon post et si tu as fais les principales modifications nécessaires dans ton code.
Pour ce que tu veux faire exactement, au lieu de faire deux requêtes SQL juste pour récupérer le nombre d'enregistrements de ta première requête, il serait plus judicieux d'utiliser la fonction count
de PHP sur la variable dans laquelle sont stockées les enregistrements de ta première requête.
Je me répête donc :
// ceci :
$d['posts'] = $this->Post->find(['conditions' => $condition]);
$d['total'] = count($d['posts']);
// au lieu de :
$d['posts'] = $this->Post->find(['conditions' => $condition]);
$d['total'] = $this->Post->findCount($condition);
Car la fonction count
de PHP et ta seconde requête SQL te retournent la même chose, à la différence que la fonction count
de PHP t'évite dans ce cas là de faire une requête SQL, ce qui te permet d'alléger les ressources serveurs utilisées.
La deuxième partie aurait pu être utile si tu utilisais la méthode findCount
sur une requête SQL différente, je veux bien sûr dire, si la/les condition/conditions que tu passes à ta requête était différente.
Je ne vois pas comment je pourrais être plus explicite.
Lartak merci une fois de plus pour votre aide précieuse encore sans vous je aurais jamais pu merci