- #VK,
Bonjour à tous,
je travail depuis quelques jours sur un projet avec un ami et j'avais envie de faire une sorte de database framework (je sais pas si le terme est correct) qui sera bien utile pour le projet.
L'objectif est de pouvoir construire des requêtes très simplement sans avoir à connaitre forcément le SQL (pratique pour les créateurs de thème (rapport au projet)).
Actuellement j'ai trois class: Mysql, Softbb_Db (factory), Softbb_Db_Select. La troisième classe permet de créer un objet de type select (SELECT * FROM).
Cette classe (Softbb_Db_Select) contient 7 fonctions :
- public function from($table)
- public function where($condition, $var = null)
- public function order($column = 'id')
- public function limit($foo, $bar)
- public function query()
- private function constructQuery()
- public function __toString()
Et c'est la que je rencontre un problème bien familier que j'ai avec php, je me perd tout seul dans mon code sans savoir ou aller.
Voici un exemple d'utilisation :
1 2 3 4 5 6 7 | <?php $bdd->select() ->from(['users', 'u']) ->order('id ASC') ->limit(0, 10) ->query(); |
La requête généré ici est :
1 | SELECT u.* FROM users AS u ORDER BY id ASC LIMIT 0, 10 |
Le seul problème est que dans ma classe, je sais pas trop comment m'organiser pour la construction de la requête. Voici par exemple la fonction from
et son utilisation dans dans constructQuery()
1 2 3 4 5 6 7 | <?php public function from($table) { $this->table = $table; return $this; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?php private function constructQuery() { $sql = ""; if(is_array($this->table)) { list($table, $as) = $this->table; $sql.= "SELECT $as.* FROM $table AS $as "; } else { $sql.= "SELECT * FROM $this->table "; } return $sql; } |
Pour moi ce code n'a rien de logique donc je me pose plusieurs questions, faut-il que je construise ma requête au fur et a mesure ou seulement à la fin lors de l'appel de query()
. Si je dois la construire au fur et à mesure comment gérer les requêtes préparées ?
Voici la fonction where et son utilisation dans une requête préparé :
1 2 3 4 5 6 7 | <?php public function where($condition, $var = null) { $this->where = [$condition, $var]; return $this; } |
1 2 3 4 5 6 7 8 9 10 11 12 | <?php public function query() { $stmt = $this->mysql->prepare($this->constructQuery()); if ($this->where) $stmt->bind_param('s', $this->where[1]); $stmt->execute(); $ressource = $stmt->get_result(); return $ressource; } |
Étant donné que je suis sur de correctement sécuriser mes requêtes, est-il vraiment intéréssant de les préparer? Je pourrais pas me contenter de les lancer de manière sécurisé avec un petit str_replace (utilisation du where : where('username = ?', $_GET['user']);
).
Bref je me pose plein de question que je me suis jamais posé avec Ruby donc un coup de main serait le bienvenu .