Comment utiliser SELECT * FROM ORDER BY pour plusieurs pages

Le problème exposé dans ce sujet a été résolu.

J’ai 5 pages PHP qui utilise exactement le même code, mais seulement un MOT qui change, c’est le nom de la table $query = "SELECT * FROM MOT ORDER BY id"; Comment faire pour utiliser un seul code avec les 5 tables pour les utiliser sur différentes pages ?

+0 -0

Salut !

Tu peux imaginer un code générique inclus dans chacune des pages et auquel tu passes le nom de ladite table.
Je souhaite rappeler pour ceux qui n’y penseraient plus : il n’est pas possible de passer un nom de table (ni quoi que ce soit qui représente un élément de structure de base de données) en paramètre dans une requête préparée.

Un petit "Bonjour !" au début de ton message n’aurait pas été dédaigné  ;)

+0 -0

Bien le bonjour à toi et merci pour ta réponse rapide ! Désolé pour cette impolitesse, ce n’est pas de mon habitude de ne pas saluer les gens. ^^ Donc imaginer un code générique ? Une fonction peut-être dans le début de chaque codes, pour la réutiliser dans le même code ? Je vais essayer ça je te redis.

D’accord, je comprends maintenant, mais du coup dans la fonction comment écrire mon code avec toutes les tables dans une même fonction ? Je rappel que mon but c’est d’éviter d’écrire 5 fois la même chose avec juste la table qui changerai à chaque fois.

Tu pourrais passer la table en paramètre de la fonction, non ?

Après, pour savoir quoi passer en paramètre, étant donné que tu vas bien devoir appeler cette fonction (il manque ce point à ma liste précédente, s’il faut faire ça de manière très académique), l’endroit où tu l’appelles implique que tu sais quelle table utiliser.

+0 -0

Ce qui donnerai ça pour la fonction ? Et je devrais ensuite l’appeler dans les différentes pages avec à la place de $name le nom de la table ?

function table($name){

include('database_connection.php');

$query = "SELECT * FROM $name ORDER BY id";
$statement = $connect->prepare($query);
if($statement->execute())
{
  while($row = $statement->fetch(PDO::FETCH_ASSOC))
  {
    $data[] = $row;
  }

  echo json_encode($data);
}
}

Oui, c’est l’idée. J’imagine volontiers ce script dans un fichier nommé un peu comme select_all.php à inclure avec require dans ta page.

Vu que tu inclus database_connection.php dans ta fonction, je te conseille d’y remplacer include par require_once, pour une question de confort :

  • si le fichier, pour une raison quelconque, n’est pas trouvé, le script s’arrêtera là plutôt que de tenter de continuer alors que la connexion à la base n’a pas été effectuée ;
  • si tu as déjà inclus database_connection.php dans le script qui inclus select_all.php, cela t’évite des soucis parce que database_connection.php serait exécuté deux fois.

A ce dernier propos, je conseillerais plutôt de ne pas inclure la connexion à la base de donnée dans la fonction, mais au même endroit que là où tu inclurais select_all.php.

+0 -0

J’ai un fichier function.php pour toutes mes fonctions, que j’inclus évidemment dans mes pages. j’ai changé include par require_once, et je l’ai mis en dehors de la fonction, mais cette fois la page ne trouve pas les tables… J’ai oublié de préciser, que j’utilise la fonction dans du javascript, c’est peut-être là le soucis ?

MON CODE

$scope.fetchData = function(){
        $http.get(table("user")).success(function(data){
            $scope.namesData = data;
        });
    };

Mmm, attention, ne mélange pas JavaScript et PHP. Le PHP va générer ce que le serveur envoie, et le client va interpréter ce que le serveur a envoyé.
Le client ne devrait jamais voir de PHP, et le serveur de JavaScript — du moins avec cet environnement.

Qu’avais-tu à la place de table("user") à la ligne 2 du code ?

+0 -0

Ah… J’avais 'fetch_data.php' à la place de table("user") et à l’intérieur de fetch_data.php j’avais ce code

<?php
//fetch_data.php

include('database_connection.php');

$query = "SELECT * FROM user ORDER BY id";
$statement = $connect->prepare($query);
if($statement->execute())
{
    while($row = $statement->fetch(PDO::FETCH_ASSOC))
    {
        $data[] = $row;
    }

    echo json_encode($data);
}

?>

En fait, j’ai 5 pages qui commence chacune par fetch_data….php (ex:fetchdata_user.php, fetch_data_room.php etc…) Et dans chacune de ces pages j’ai le nom d’une table qui correspond à la page, donc pour fetch_datauser.php j’ai "SELECT FROM user ORDER BY id" pour room "SELECT FROM room ORDER BY id" etc… Et ensuite j’utilise cette page fetchdata….php dans mes différentes pages user.php, room.php etc… Du coup, oui c’est une page par table.

HS sur la sécurité :

Ce qui donnerai ça pour la fonction ? Et je devrais ensuite l’appeler dans les différentes pages avec à la place de $name le nom de la table ?

$query = "SELECT * FROM $name ORDER BY id";
$statement = $connect->prepare($query);

Smada

$name ne doit pas être une entrée utilisateur directe (obtenu via GET ou POST) si tu l’ajoutes à la variable $query ! On utilise la PDO pour sa sécurité, en écrivant cette requête on fait un bon en arrière si tu n’as pas pris de précaution.

Préfère :

<?php
function table($name){

include('database_connection.php');

switch ($name) {
    case "user";
        $query = "SELECT * FROM user ORDER BY id";
        break;
    case "admin";
        $query = "SELECT * FROM admin ORDER BY id";
        break;
    case "book";
        $query = "SELECT * FROM book ORDER BY id";
        break;
    default:
        return false;
}
$statement = $connect->prepare($query);

?>

C’est plus long mais je te conseille d’utiliser ce code pour plus de sécurité si tu n’es pas bien expérimenté sur la sécurité.

Ce que @A-312 t’a fourni comme code est en remplacement des lignes 1 à 5 du code fourni plus haut

A noter que du coup, on va même se passer de la fonction, et il va nous falloir adapter un peu.

Première chose, il faut que fetch_data.php sache quelle table doit être utilisée. Cela veut dire que c’est le JavaScript qui doit donner l’information.
Je propose de transmettre ça "en paramètre GET". Un paramètre nommé name fera l’affaire.
Dans ton JavaScript, tu aurais ceci :

// …
$http.get('fetch_data.php?name=user').success(function(data){
// …
Bien noter user qui apparaît dans les premières parenthèses, c’est ce qu’il faudra modifier sur les autres pages pour avoir les autres tables. Mais attention : il faudra remplacer par une des valeurs présentes aux lignes 4, 7 ou 10 du code ci-dessous !

Maintenant, il nous faut faire en sorte que fetch_data.php tienne compte de ce nouveau paramètre. Rien de vraiment sorcier, on va remplacer $name par $_GET['name']. donc au final fetch_data.php ressemblerait à cela :

include('database_connection.php');

switch ($_GET['name']) {
    case "user";
        $query = "SELECT * FROM user ORDER BY id";
        break;
    case "admin";
        $query = "SELECT * FROM admin ORDER BY id";
        break;
    case "book";
        $query = "SELECT * FROM book ORDER BY id";
        break;
    default:
        return false;
}
$statement = $connect->prepare($query);
if($statement->execute())
{
    // Simplification ici, pas besoin d'une boucle
    $data = $statement->fetchAll();
    echo json_encode($data);
} else {
    /* Attention, il faut penser à retourner quelque chose
     * quand l'exécution de la requête n'a pas fonctionné.
     * Je mets un tableau vide, à voir si c'est pertinent */
    echo '[]';
}
+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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