public static function editQuestion(&$param, $id_question) { $resCheck = self::check($param); $res = $resCheck; if ($resCheck->success === true) { $questionDAO = new QuestionDAO(BDD::getInstancePDO()); $question = new Question(array('id_question' => $id_question, 'titre' => $param['titre'], 'question' => $param['question'], 'id_modificateur' => $_SESSION['user']->id_membre, 'resolu' => $param['resolu'])); if (($resSaveQuestion = $questionDAO->save($question)) !== false) { $clarifierDAO = new ClarifierDAO(BDD::getInstancePDO()); if (!empty($param['id_mot_cle'])) { foreach ($param['id_mot_cle'] as $id_mot_cle) { $clarifier = new Clarifier(array('id_question' => $id_question, 'id_mot_cle' => $id_mot_cle)); $clarifierDAO->save($clarifier); } } $actionDAO = new ActionDAO(BDD::getInstancePDO()); $action = new Action(array('id_action' => DAO::UNKNOWN_ID, 'libelle' => "Modification d\\'une question (question n°{$id_question})", 'id_membre' => $_SESSION['user']->id_membre)); $actionDAO->save($action); $res->success = true; $res->msg[] = 'Modification de la question réussie'; } else { $res->success = false; $res->msg[] = 'Erreur BDD'; } } return $res; }
/** * Effectue une recherche de Question, ou compte le nombre de résultats pour cette recherche * @param $max Le nombre de question par page * @param $conditions Le tableau contenant les parametres de recherche * @param bool $count True si c'est pour avoir le nombre de résultat (pagination), false si c'est pour avoir les questions * @param int $debut La première question à récupérer * @return array|mixed Les questions correspondant à la recherche */ public function getQuestionsWithSearch($max, $conditions, $count = false, $debut = 0) { $res = array(); $where = ''; $join = ''; $param = array(); // Partie titre technote if (!empty($conditions['titre'])) { $param['titre'] = '%' . $conditions['titre'] . '%'; $where .= " AND q.titre LIKE :titre"; } // Partie date if (!empty($conditions['date_debut']) && !empty($conditions['date_fin'])) { $conditions['date_debut'] .= ' 00:00:00'; $conditions['date_fin'] .= ' 23:59:59'; $param['date_debut'] = $conditions['date_debut']; $param['date_fin'] = $conditions['date_fin']; $where .= " AND date_question BETWEEN :date_debut AND :date_fin"; } elseif (!empty($conditions['date_debut'])) { $conditions['date_debut'] .= ' 00:00:00'; $param['date_debut'] = $conditions['date_debut']; $where .= " AND date_question BETWEEN :date_debut AND NOW()"; } elseif (!empty($conditions['date_fin'])) { $conditions['date_fin'] .= ' 23:59:59'; $param['date_fin'] = $conditions['date_fin']; $where .= " AND date_question < :date_fin"; } // Partie auteur if (!empty($conditions['resolu'])) { $param['resolu'] = $conditions['resolu'] == 'oui' ? '1' : '0'; $where .= " AND resolu = :resolu"; } // Partie mots clés if (!empty($conditions['mots_cles'])) { $sqlMCObligatoire = ''; $sqlMCNonObligatoire = ''; foreach ($conditions['mots_cles'] as $mc) { if ($mc[0] == '+') { $sqlMCObligatoire .= '\'' . substr($mc, 1) . '\', '; // On enleve le + pour la requete } else { $sqlMCNonObligatoire .= '\'' . $mc . '\', '; } } $sqlMCObligatoire = substr($sqlMCObligatoire, 0, -2); $sqlMCNonObligatoire = substr($sqlMCNonObligatoire, 0, -2); if (!empty($sqlMCObligatoire)) { $where .= " AND NOT EXISTS(SELECT id_mot_cle FROM mot_cle mc WHERE label IN ({$sqlMCObligatoire}) AND NOT EXISTS(SELECT * FROM clarifier c WHERE mc.id_mot_cle=c.id_mot_cle AND c.id_question=q.id_question))"; } else { $join .= ' LEFT JOIN clarifier c ON c.id_question=q.id_question'; $where .= " AND c.id_mot_cle IN(SELECT id_mot_cle FROM mot_cle WHERE label IN({$sqlMCNonObligatoire}))"; } } // Si c'est pour savoir le nombre de résultats (pagination) if ($count) { $sql = 'SELECT COUNT(DISTINCT q.id_question) nbRes FROM question q INNER JOIN membre ma ON ma.id_membre=q.id_auteur LEFT JOIN membre mm ON mm.id_membre=q.id_modificateur ' . $join . ' WHERE visible = 1 ' . $where; $req = $this->pdo->prepare($sql); $req->execute($param); $res = $req->fetch(); return $res->nbRes; } $sql = 'SELECT DISTINCT q.*, ma.pseudo auteur, mm.pseudo modificateur FROM question q INNER JOIN membre ma ON ma.id_membre=q.id_auteur LEFT JOIN membre mm ON mm.id_membre=q.id_modificateur ' . $join . ' WHERE visible = 1 ' . $where . ' ORDER BY date_question DESC LIMIT ' . $debut . ', ' . $max; // Ne peut pas etre preparé car échapé (LIMIT '10', '0' => FAIL) $req = $this->pdo->prepare($sql); $req->execute($param); foreach ($req->fetchAll() as $ligne) { // On recupere le nombre de réponses $reponseDAO = new ReponseDAO(BDD::getInstancePDO()); $ligne->nbReponses = $reponseDAO->getCountForOneQuestion($ligne->id_question); $ligne->lastReponse = $reponseDAO->getLastForOneQuestion($ligne->id_question); // Recuperation des mot-cles correspondant a la question $clarifierDAO = new ClarifierDAO(BDD::getInstancePDO()); $ligne->motsCles = $clarifierDAO->getAllForOneQuestion($ligne->id_question); $res[] = new Question(get_object_vars($ligne)); } return $res; }