par
moogli » 26 déc. 2016, 13:31
salut,
pourquoi créer un tableau pour ensuite créer une chaîne de caractère avec les éléments séparés par des virgules ?
c'est anti performant, fait directement la concaténation dans la boucle, ou mieux demain au SGBD de le faire
pour ce qui est de cocher les cases tu compares une liste d'info (séparées par des virgules) à une seule information : cela ne peux fonctionner.
Les checkbox devrait être créées dynamiquement en fonction d'une liste en base.
tu devrais avoir une table qui contient seulement un id_membre et un id_type_resto (par exemple)
cela te permet d'avoir tout ce que le membre a sélectionné et ensuite de comparer lors de l'affichage pour check ou pas.
exemple rapide
<?php
// select id_type_resto from membre_type_resto where id_membre =xxxx
// le resultat la dedans
$typeRestoMembre = [];
// liste des types de resto
// select id_type_resto, nom_type_resto from type_resto
while($type = $stmt->ftech(PDO::FETCH_ASSOC)){
$checked = '';
if(in_array($type['id_type_resto'],$typeRestoMembre)){
$checked = ' checked="checked"';
}
echo '<label for="choix_',$type['id_type_resto'],'">',$type['nom_type_resto'],'</label>';
echo '<input type="checkbox" id="choix_',$type['id_type_resto'],'" name="choix[]" value="',$type['id_type_resto'],'"',$checked,' /><br />';
}
Pour ce qui est de ton code tu
- n'as pas compris comment utiliser une requête préparée
- fait pas mal de chose inutile
- la modèle de la base est mal fichue il y a une ligne dans membre_plus par "choix" tu dupliques le reste des données c'est une très mauvaise idée.
j'ai retoucher ton code pour virer ce qui est inutile et utiliser correctement les requêtes préparées (+ formatage un poil plus lisible : 5% de ligne de code en moins pour la même chose

)
<?php
require'header.php';
// pas fan de tous ce foutoir autant le faire un fois à l'utilisation
$nom_update = filter_input(INPUT_POST, 'nom_update');
$type = filter_input(INPUT_POST, 'type');
$sex = filter_input(INPUT_POST, 'sex');
$jour = filter_input(INPUT_POST, 'jour');
$mois = filter_input(INPUT_POST, 'mois');
$annee = filter_input(INPUT_POST, 'annee');
$tail = filter_input(INPUT_POST, 'tail');
$poid = filter_input(INPUT_POST, 'poid');
$signe = filter_input(INPUT_POST, 'signe');
$ethni = filter_input(INPUT_POST, 'ethni');
$yeux = filter_input(INPUT_POST, 'yeux');
$cheveux = filter_input(INPUT_POST, 'cheveux');
$sil = filter_input(INPUT_POST, 'sil');
$fum = filter_input(INPUT_POST, 'fum');
$detail_p = filter_input(INPUT_POST, 'detail_p');
$nom = filter_input(INPUT_GET, 'token');
$ID = filter_input(INPUT_GET, 'token_update');
if(isset($_POST['choix'])){
// le SGBD fait le taf et monte pas des données inutiles en mémoire
$requete = $connection->prepare('SELECT count(1) as nb FROM membre_plus WHERE ID=:ID');
$requete->execute(array(':ID'=> $ID));
$nb_result = 0;
if($requete !== false) {
$resultat = $requete->fetchAll();
$nbResult = $resultat['nb'];
}
if ($nbResult == 1){
$compte_plus = 'UPDATE membre_plus SET
type=:type,
jour=:jour,
mois=:mois,
annee=:annee,
sex=:sex,
tail=:tail,
poid=:poid,
signe=:signe,
ethni=:ethni,
yeux=:yeux,
cheveux=:cheveux,
sil=:sil,
fum=:fum,
choix=:choix,
detail_p=:detail-p
WHERE ID=:ID';
// La requête est préparée une seul fois et utilisée plusieurs (utilisté de la requête préparée)
$req_plus = $connection->prepare($compte_plus);
foreach($_POST['choix'] as $liste){
$req_plus->execute([
':ID' => $ID,
':type' => $type,
':sex' => $sex,
':jour' => $jour,
':mois' => $mois,
':annee' => $annee,
':tail' => $tail,
':poid' => $poid,
':signe' => $signe,
':ethni' => $ethni,
':yeux' => $yeux,
':cheveux' => $cheveux,
':sil' => $sil,
':fum' => $fum,
':choix' => $liste,
':detail_p'=> $detail_p
]);
}
$compte_online = ('UPDATE online_site SET type=:type WHERE pseudo_site=:nom');
$req = $connection->prepare($compte_online);
$req->execute(array(':nom'=> $nom_update, ':type'=>$type));
$compte_membre = ('UPDATE membres SET type=:type WHERE pseudo=:nom');
$req = $connection->prepare($compte_membre);
$req->execute(array(':nom'=> $nom_update, ':type'=>$type));
header("Location: http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/m_profil.php?token=".$_SESSION['login']."");
exit();
}
}else{ /* Le pseudo */
// ouch un peu rud comme message
$message_in = 'Soucis de connexion, contacter Webmaster.';
}
// ce ne serais pas la même chose que la première requête ça ???
$compte = $connection->prepare('SELECT * FROM membre_plus WHERE nom=:nom');
$compte->execute(array(':nom'=>$nom));
@+
salut,
pourquoi créer un tableau pour ensuite créer une chaîne de caractère avec les éléments séparés par des virgules ?
c'est anti performant, fait directement la concaténation dans la boucle, ou mieux demain au SGBD de le faire ;)
pour ce qui est de cocher les cases tu compares une liste d'info (séparées par des virgules) à une seule information : cela ne peux fonctionner.
Les checkbox devrait être créées dynamiquement en fonction d'une liste en base.
tu devrais avoir une table qui contient seulement un id_membre et un id_type_resto (par exemple)
cela te permet d'avoir tout ce que le membre a sélectionné et ensuite de comparer lors de l'affichage pour check ou pas.
exemple rapide
[php]<?php
// select id_type_resto from membre_type_resto where id_membre =xxxx
// le resultat la dedans
$typeRestoMembre = [];
// liste des types de resto
// select id_type_resto, nom_type_resto from type_resto
while($type = $stmt->ftech(PDO::FETCH_ASSOC)){
$checked = '';
if(in_array($type['id_type_resto'],$typeRestoMembre)){
$checked = ' checked="checked"';
}
echo '<label for="choix_',$type['id_type_resto'],'">',$type['nom_type_resto'],'</label>';
echo '<input type="checkbox" id="choix_',$type['id_type_resto'],'" name="choix[]" value="',$type['id_type_resto'],'"',$checked,' /><br />';
}[/php]
Pour ce qui est de ton code tu
- n'as pas compris comment utiliser une requête préparée
- fait pas mal de chose inutile
- la modèle de la base est mal fichue il y a une ligne dans membre_plus par "choix" tu dupliques le reste des données c'est une très mauvaise idée.
j'ai retoucher ton code pour virer ce qui est inutile et utiliser correctement les requêtes préparées (+ formatage un poil plus lisible : 5% de ligne de code en moins pour la même chose :) )
[php]<?php
require'header.php';
// pas fan de tous ce foutoir autant le faire un fois à l'utilisation
$nom_update = filter_input(INPUT_POST, 'nom_update');
$type = filter_input(INPUT_POST, 'type');
$sex = filter_input(INPUT_POST, 'sex');
$jour = filter_input(INPUT_POST, 'jour');
$mois = filter_input(INPUT_POST, 'mois');
$annee = filter_input(INPUT_POST, 'annee');
$tail = filter_input(INPUT_POST, 'tail');
$poid = filter_input(INPUT_POST, 'poid');
$signe = filter_input(INPUT_POST, 'signe');
$ethni = filter_input(INPUT_POST, 'ethni');
$yeux = filter_input(INPUT_POST, 'yeux');
$cheveux = filter_input(INPUT_POST, 'cheveux');
$sil = filter_input(INPUT_POST, 'sil');
$fum = filter_input(INPUT_POST, 'fum');
$detail_p = filter_input(INPUT_POST, 'detail_p');
$nom = filter_input(INPUT_GET, 'token');
$ID = filter_input(INPUT_GET, 'token_update');
if(isset($_POST['choix'])){
// le SGBD fait le taf et monte pas des données inutiles en mémoire
$requete = $connection->prepare('SELECT count(1) as nb FROM membre_plus WHERE ID=:ID');
$requete->execute(array(':ID'=> $ID));
$nb_result = 0;
if($requete !== false) {
$resultat = $requete->fetchAll();
$nbResult = $resultat['nb'];
}
if ($nbResult == 1){
$compte_plus = 'UPDATE membre_plus SET
type=:type,
jour=:jour,
mois=:mois,
annee=:annee,
sex=:sex,
tail=:tail,
poid=:poid,
signe=:signe,
ethni=:ethni,
yeux=:yeux,
cheveux=:cheveux,
sil=:sil,
fum=:fum,
choix=:choix,
detail_p=:detail-p
WHERE ID=:ID';
// La requête est préparée une seul fois et utilisée plusieurs (utilisté de la requête préparée)
$req_plus = $connection->prepare($compte_plus);
foreach($_POST['choix'] as $liste){
$req_plus->execute([
':ID' => $ID,
':type' => $type,
':sex' => $sex,
':jour' => $jour,
':mois' => $mois,
':annee' => $annee,
':tail' => $tail,
':poid' => $poid,
':signe' => $signe,
':ethni' => $ethni,
':yeux' => $yeux,
':cheveux' => $cheveux,
':sil' => $sil,
':fum' => $fum,
':choix' => $liste,
':detail_p'=> $detail_p
]);
}
$compte_online = ('UPDATE online_site SET type=:type WHERE pseudo_site=:nom');
$req = $connection->prepare($compte_online);
$req->execute(array(':nom'=> $nom_update, ':type'=>$type));
$compte_membre = ('UPDATE membres SET type=:type WHERE pseudo=:nom');
$req = $connection->prepare($compte_membre);
$req->execute(array(':nom'=> $nom_update, ':type'=>$type));
header("Location: http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/m_profil.php?token=".$_SESSION['login']."");
exit();
}
}else{ /* Le pseudo */
// ouch un peu rud comme message
$message_in = 'Soucis de connexion, contacter Webmaster.';
}
// ce ne serais pas la même chose que la première requête ça ???
$compte = $connection->prepare('SELECT * FROM membre_plus WHERE nom=:nom');
$compte->execute(array(':nom'=>$nom));[/php]
@+