Bonjour a tous,

Voulant me facilité un peut la vie, je cherche a faire une requete select dans une fonction.

Donc je prend le code de base :

select CHAMPS from TABLE where CONDITIONS

Maintenant je crée ma fonction :

public static function select($fields = [],$condition = []){
            $fields = implode(',', $fields);
}

Pour la table aucun soucis, ma classe étant la classe mére, je définis une variable en protected dans chaque pour lui indiquer quelle table utiliser. pour les champs, je pense que un simple implode peut faire l'affaire mais la ou je bloque c'est au niveau des conditions.

Quand j'appelle la fonction je fais comme cela :

Database::select(['champ1','champ2'],['username' => 'bidule','pseudo' => 'truc']);

Comment je peux faire pour transformer un tableau en conditions, donc passer de username=>'truc' a username='truc'.

Merci a tous d'avance de votre aide et bonne aprés midi a tous.

4 réponses


Bonjour,
Si tu le fais en poo, tu peux te faire une petite fonction privée ou protégée qui te fait ca, c'est juste une boucle genre

$conditions = ['username' => 'bidule','pseudo' => 'truc'];//En paramètres
$str = '';
foreach($conditions as $k => $v){
    $str .= '';//La tu mets ce que tu veux rajouter à la chaine
}
$str = substr($str, 0, -x);//En fonction des caractères en trop que tu auras à la fin

Par contre, je sais pas si tu comptes faire des fonctionnalités un peu poussées, mais je te conseillerai plus d'utiliser des requêtes préparées si tu as des choses qui proviennent de l'utilisateur ! :)

DylanVsn
Auteur

Merci de ta réponse, pour la requete préparé je ne les pas encore pris en compte mais je vais le faire.
Mais je ne comprend pas ta réponse, A aucun moment tu ne fais de modifications sur le tableau.

DylanVsn
Auteur

public function select($fields = [],$condition = false,$one = false){
$fields = implode(',', $fields);

        foreach($condition as $k=>$v){
            $v = "'".$v."'";
            $cond[] = $k.'='.$v;
        }
        $conditions = implode(' AND ', $cond);

        $req = $this->getPDO()->prepare('SELECT '.$fields.' FROM '.$this->table.' WHERE '. $conditions);
        $req->execute();

        if(isset($one)){
            $datas = $req->fetch();
        }else{
            $datas = $req->fetchAll();
        }

        var_dump($datas);

    }

Je pense que j'ai trouvé, qu'en pense tu ?

Personnellement, ce n'est pas comme ca que je ferais, tu n'as pas besoin de modifier le tableau.
De plus, bien que dans ce cas ce soit un petit tableau, il fera deux fois le foreach : une fois pour le modifier et une fois dans le implode.
Dans la solution que je t'ai proposé (j'espère que tu as compris sinon je peux revenir dessus), ton implode est fait par le foreach.

J'ai un peu relu ton message et j'ai vu que tu n'avais pas bien compris, alors ce que je te propose en faite c'est de recréer une fonction implode qui saura gérer ton tableau :)

Dans un cas plus poussé, tu pourrais même faire une fonction implode du type :
function implode($glue, $array, $func)
Ou func est le callback qui permet de gérer chaque index de ton array, mais je pense pas que tu doives aller jusque là dans ton exemple
Et tu pourrais l'utiliser ainsi
implode(' AND ', $cond, function($k, $v){ return $k . "='" . $v . "'"});

J'espère que tu vois où je veux en venir :)