Un query builder

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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 :) .

Staff

Étant donné que je suis sur de correctement sécuriser mes requêtes, est-il vraiment intéréssant de les préparer?

j'ai tendance à penser que oui car ton code ne me dit pas que tes requêtes sont sécurisées si tu te passes de prepare. A l'opposé, je suis sûr qu'elles le sont quand tu utilises prepare.

+0 -0
Staff

Question idiote : quel est l'apport de ton projet ? Quand je vois ton exemple je vois une requete SQL a pas grand chose pret. Pour un non-dev, un ORM n'est il pas plus simple ?

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte