8768 sujets

Développement web côté serveur, CMS

Bonsoir,

J'ai une question de gros noob.

Mettons que je crée un formulaire avec une série de champs input respectivement nommés :
- nom
- prenom
- mail
- sexe
- profession

Supposons que les deux derniers soient facultatifs, et que l'utilisateur ne les remplisse pas :
au traitement du fichier php, je vais recupérer :
$_POST['nom']   ($nom)
$_POST['prenom']   ($prenom)
$_POST['mail']   ($mail)

mais les deux derniers seront inexistants.
Dès lors si je fais une insertion des données dans la DB comme ceci :
$query = ("INSERT INTO users (nom, prenom, mail, sexe, profession) VALUES('','$nom','$prenom','$mail','$sexe','$profession')");
$result_user = mysqli_query($link, $query);

J'ai forcément une erreur puisque $sexe et $profession ne sont pas connus.

La question est :
comment faites-vous pour contourner le problème ?
annoncez-vous au sommet de votre fichier de traitement ceci :
$nom : "";
$prenom = "";
$mail = "";
$sexe = "";
$profession = "";

... ou avez-vous des alternatives nettement moins dégueu à me proposer? Smiley confused

Merci d'avance.
Modifié par Reka (02 Jun 2016 - 00:33)
Bonsoir,

Peut-être :
$nom = isset($_POST['nom']) ? $_POST['nom'] : "";
$prenom = isset($_POST['prenom']) ? $_POST['prenom'] : "";
$mail = isset($_POST['mail']) ? $_POST['mail'] : "";
$sexe = isset($_POST['sexe']) ? $_POST['sexe'] : "";
$profession = isset($_POST['profession']) ? $_POST['profession'] : "";
Cela revient sensiblement au même, en concaténant un peu les traitements !

Cordialement
Merci pour la réponse rapide Nizalify.

Je viens de pondre ce code rapidos sur mn smartphone (non testé et erreurs d'écriture possibles, Sorry)


if(isset($_POST) {
foreach ($_POST as $key => $value) {
$$key => $value;
}
}

$tab = array('nom', 'prenom', 'mail' 'sexe', 'profession');
foreach($tab as $value) {
if (!isset($$value)) {
$$value = '';
}

insert into users ('nom', 'prenom', 'mail' 'sexe', 'profession')
values ($nom, $prenom, $mail, $sexe, $profession)



Ca vous semble bon ou c'est inutilement complexe ? Smiley smile
Sans équivoque, un foreach comparé à un opérateur ternaire va demander plus de calcul et prendre plus de temps. Ce n'est à mon avis pas du tout adapté pour ce cas. Finalement le :
$nom : "";
$prenom = "";
$mail = "";
$sexe = "";
$profession = "";

N'est en soit pas faux, le code que je t'ai proposé ne fait qu'améliorer sensiblement la place qu'occupe cette simple opération... Pas besoin d'utiliser un bazooka pour flinguer une mouche, si tes besoins sont de récupérer des données en POST et que certaines sont facultatives, mais que le processus d'ajout en BDD nécessite au moins un "vide", alors pas besoin de réfléchir plus loin.

Maintenant je t'ai proposé une façon de le faire, celle qui me semble la plus propre, compte tenu de ce qu'il y a derrière, au niveau de ton traitement. Chacun fais sa cuisine comme il le souhaite, je ne me suis d'ailleurs pas permis de commenter le reste de ton code. Libre à toi de développer de la façon que tu préfère, mais je t'aurais au moins donné une autre façon de répondre à ta question Smiley smile
Ta facon de faire me convient tout à fait. J'explorais juste les moult possibilités de la programmation.

C'est vrai que les tableaux et boucles réduisent les perfs, chose que je n'avais pas prise en considération.

Ton avis ne tombe pas dans l'oreille d'une sourde, je me questionnais juste.
J'étais ds une logique de réduction du code maximale, ce qui n'est pas un mieux compte tenu du maigre nombre d'inputs que contiennent mes formulaires, tu as raison !

Merci encore Smiley cligne
Modifié par Reka (02 Jun 2016 - 10:26)
L'initialisation des variables à partir d'opérateurs ternaires est la solution la plus performante et lisible lorsque les champs dont identifiés et constituent un ensemble fini (ex. colonnes d'une base de données).
Le recours à une itération se justifie plutôt lorsqu'on veut effectuer un traitement générique sur un objet (ex. parcours des propriétés d'un objet par "réfection" en Java, C# ou autre langage). La structure d'un objet peut en effet ne constituer un ensemble fini qu'à un instant T si le langage autorise l'ajout / suppression d'attributs (ex. javascript) ou si on recourt à la compilation dynamique.
Tout est donc une question de contexte.
Juste pour tester les perfs :

avec opérateurs ternaires : https://3v4l.org/01e3q/perf#tabs
upload/51817-ternaire.PNG


avec valeurs dynamiques : https://3v4l.org/a6aI5/perf#tabs
upload/51817-valeur.PNG

6 verts (ternaires) vs 4 (valeurs dynamiques) : ternaires win.
(les valeurs temps et mémoire sont fort similaires qd mm.)

PS : vous avez une idée de la raison pour laquelle il me tape des éléments en verts ou en jaune pour des valeurs égales?
Modifié par Reka (02 Jun 2016 - 12:19)
Aucune idée, je ne connais pas ce site. Concernant les performances, sur un petit traitement comme celui ci, honnêtement la différence ne se ressentira pas en terme de vitesse, c'est plus une question de style de codage. Après prendre l'habitude d'appliquer de bonnes pratiques sera toujours plus utile que la façon maison Smiley langue