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 ?
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é
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.
Avec require, tu n’aurais même pas besoin de copier le code de la fonction, juste l’instruction qui inclurait le fichier où se trouverait ladite fonction.
D’accord mais, je comprends pas trop ce que je devrais faire en faite. Je dois écrire un code au début de chaque page de code ? Faire une page de code pour les 5 pages différentes ?
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.
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.
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 ?
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 ?
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.
$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 :
<?phpfunctiontable($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:
returnfalse;
}
$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 :
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:
returnfalse;
}
$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'[]';
}
Parfait, merci pour l’idée, dernière question, avec le $_GET, je ne risque rien niveau injection ? Il faudra faire quelque chose pour sécurisé le code ? C’est mon plus gros Default, et ma plus grande peur
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