Requête sql avec un CASE ou IF
Bonjour, quelqu'un peut m'aider à mettre une condition pour les langues dans ma requête, merci :)
Voici mon code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| function getSouscategories(){
global $bdd;
$sql="SELECT C.id ,
case $_SESSION['lang']
when 'FR' then C.nom_FR
when 'EN' then C.nom_EN
when 'ES' then C.nom_ES
end as C.nom
, case $_SESSION['lang']
when 'FR' then DESC_C.nom_FR
when 'EN' then DESC_C.nom_EN
when 'ES' then DESC_C.nom_ES
end as DESC_C.nom
FROM categories C ";
try{
$req = $bdd->prepare($sql);
$req->execute();
$res = $req->fetchAll(PDO::FETCH_ASSOC);
}catch(Exception $e){
echo "Erreur dans la requête " . $sql;
$res = false;
}
return $res;
} |
Le but est que $C.nom soit égale à toutes les autres en terme de langues selon celle choisie depuis le début
Code:
1 2 3 4 5 6 7 8 9
|
$categories=getSouscategories();
<select name="categorie">
<?php
foreach($categories as $C){
echo "<option value='".$C['id']."'>".$C['nom']."</option>";
}
?>
</select> |
Requête sql pour un site multilingues
Bonjour jreaux62, merci pour ta réponse. J'ai opté pour la seconde option car elle m'est nécessaire dans d'autres requêtes. Néanmoins ayant essayé les 3 options, j'obtiens l'erreur suivante: Erreur dans la requête SELECT C.id , C.nom_FR as C.nom, DESC_C.nom_FR as DESC_C.nom FROM categories C
Est-ce à cause des intitulés de la table catégories. Ses champs sont les suivants: id, id_categoriep, nom_FR, nom_EN, nom_ES. Ou à cause de leur interclassement, qui est en latin swedish?
Ou est-ce à cause du fichier langues? Voici la page fb.php qui se trouve dans le fichier langues:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <?php
if(!isset($_SESSION))
{
session_start();
}
if(!isset($_SESSION['lang']))
$_SESSION['lang']="fr";
elseif (isset($_GET['lang'])&& $_SESSION['lang'] != $_GET['lang'] && !empty($_GET['lang'])){
if($_GET['lang']=="fr")
$_SESSION['lang']="fr";
elseif($_GET['lang']=="en")
$_SESSION['lang']="en";
elseif ($_GET['lang']=="es")
$_SESSION['lang']= 'es';
}
require_once ($_SESSION['lang'] . ".php");
?> |
En gros voilà ce que j'ai fait:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| function getSouscategories(){
global $bdd;
$sql_lang =(!empty($_SESSION['lang']) && in_array($_SESSION['lang'], ['FR','EN','ES']) )? $_SESSION['lang'] : 'FR'; // on s'assure que la langue est correcte
$sql="SELECT
C.id ,
C.nom_".$sql_lang." as C.nom,
DESC_C.nom_".$sql_lang." as DESC_C.nom
FROM categories C ";
try{
$req = $bdd->prepare($sql);
$req->execute();
$res = $req->fetchAll(PDO::FETCH_ASSOC);
}catch(Exception $e){
echo "Erreur dans la requête " . $sql;
$res = false;
}
return $res;
}
if(isset($_POST['formannonce'])) {
$id_categorie= isset($_GET['categorie'])? trim($_GET['categorie']) : null;
//une autre suite de code qui concerne d'autres fonctions. |
Et dans la page des formulaires en incluant le dossiers des langues, et la page des fonctions. :
Code:
1 2 3 4 5 6 7 8 9 10
| $categories=getSouscategories();
<?php
foreach($categories as $C){
echo "<option value='".$C['id']."'>".$C['nom']."</option>";
}
?>
</select> |
requête sql pour un site multilingues
Je n'ai pas bien saisi, veux-tu dire qu'il faut modifier la page fb.php dans le dossier langues? Ou faut-il remplacer cette ligne
Citation:
Code:
$sql_lang = ( !empty(($_SESSION['lang']) && in_array(mb_strtoupper($_SESSION['lang'], 'UTF-8'), ['FR','EN','ES']) )? mb_strtoupper($_SESSION['lang'], 'UTF-8') : 'FR'; // on s'assure que la langue est correcte
par tout ce qui se trouve dans fb.php? Je pense qu'il y a une parenthèse de plus, j'ai donc modifié pour que ça affiche la page du formulaire, et j'ai la même erreur:
J'ai mis les langues en majuscule comme tu l'as sugéré, mais j'ai toujours la même erreur: Erreur dans la requête SELECT C.id , C.nom_FR as C.nom FROM categories C ORDER BY C.nom_FR ASC
page des fonctions:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| function getSouscategories(){
global $bdd;
$sql_lang = ( !empty(($_SESSION['lang']) && in_array(mb_strtoupper($_SESSION['lang'], 'UTF-8'), ['FR','EN','ES']) ))? mb_strtoupper($_SESSION['lang'], 'UTF-8') : 'FR';
$sql="SELECT
C.id ,
C.nom_".$sql_lang." as C.nom
FROM categories C
ORDER BY C.nom_".$sql_lang." ASC
";
try{
$req = $bdd->prepare($sql);
$req->execute();
$res = $req->fetchAll(PDO::FETCH_ASSOC);
}catch(Exception $e){
echo "Erreur dans la requête " . $sql;
$res = false;
}
return $res;
} |
page fb.php se trouvant dans le dossier langues:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?php
if(!isset($_SESSION))
{
session_start();
}
if(!isset($_SESSION['lang']))
$_SESSION['lang']="FR";
elseif (isset($_GET['lang'])&& $_SESSION['lang'] != $_GET['lang'] && !empty($_GET['lang'])){
if($_GET['lang']=="FR")
$_SESSION['lang']="FR";
elseif($_GET['lang']=="EN")
$_SESSION['lang']="EN";
elseif ($_GET['lang']=="ES")
$_SESSION['lang']= 'ES';
}
require_once ($_SESSION['lang'] . ".php");
?> |
Liste déroulante ne se remplit pas
C'était l'erreur dans la requête. Mais rien ne s'ajoute dans le formulaire quand on clique sur les catégories.
La requête corrigée:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| function getSouscategories(){
global $bdd;
$sql_lang = (!empty(($_SESSION['lang']) && in_array($_SESSION['lang'], ['fr','en','es']) ))? $_SESSION['lang'] : 'fr'; // on s'assure que la langue est correcte
$sql= "SELECT
C.id,
C.nom_".$sql_lang." AS nom
FROM categories C
ORDER BY nom ASC
";
try{
$req = $bdd->prepare($sql);
$req->execute();
$res = $req->fetchAll(PDO::FETCH_ASSOC);
}catch(Exception $e){
echo "Erreur dans la requête " . $sql;
$res = false;
}
} |
Pourtant la boucle est bien dans le select:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
$categories= getSouscategories();
<label for="categorieannonce"><?php echo $lang['ca'];?></label>
<select name="categorie">
<?php
foreach($categories as $C){
echo "<option value='".$C['id']."'>".$C['nom']."</option>";
}
?>
</select>
}
?> |