OVH Cloud OVH Cloud

Comment optimiser l'insertion dans un formulaire

5 réponses
Avatar
geo75
Bonjour,
Apres avoir essayer de comprendre la fonctionnement d'un CRUD
(create,read,update,delete) et vu la complexité, j'ai commencé un
script dont je n'arrive pas a le faire fonctionner de maniere assez
belle.

Les données viennent d'un formulaire avec POST et les champs Nom,
Prenom, Adresse.

...
foreach ($_POST as $champ => $valeur)
{
$a .= $champ . ",";
$b .= $valeur . ",";
}

echo $a . '<br>';
echo $b . '<br>';
$query = 'INSERT INTO ma_table_mysql ($a) VALUES ($b)';
...

Le probleme est ce "," qui reste a la fin, qui me gene.
en effet,
$a contient à la fin de la boucle Nom,Prenom,Adresse,
$b contient à la fin de chaine Jean, Dupont, 10 rue des etc ,

J'ai penser a faire une expressions reguliere pour les retirer mais ne
suis pas certains que c'est la meilleur solutions.

Avez vous une idée plus simple ?
Merci de votre aide.

5 réponses

Avatar
Olivier Miakinen

Le probleme est ce "," qui reste a la fin, qui me gene.
en effet,
$a contient à la fin de la boucle Nom,Prenom,Adresse,
$b contient à la fin de chaine Jean, Dupont, 10 rue des etc ,

J'ai penser a faire une expressions reguliere pour les retirer mais ne
suis pas certains que c'est la meilleur solutions.

Avez vous une idée plus simple ?


Le plus simple :

http://fr.php.net/rtrim

$str = rtrim($str, ",");

Une autre possibilité consiste à mettre chaque virgule avant plutôt
qu'après, et ensuite :

$str = substr($str, 1);

Enfin, tu peux aussi tester dans ta boucle si la chaîne est vide ou pas
avant d'insérer une éventuelle virgule, par exemple :

foreach ($_POST as $champ => $valeur)
{
if ($a != "") {
$a .= ",";
$b .= ",";
}
$a .= $champ;
$b .= $valeur;
}

Ah, et puis j'ai oublié le plus simple (pas besoin de foreach) :

http://fr.php.net/implode
http://fr.php.net/array_keys

$a = implode(",", array_keys($_POST));
$b = implode(",", $_POST);

Mais tu devrais quand même faire gaffe à ce qui peut se trouver dans
$_POST avant de l'insérer dans ta base de données...

Avatar
Jean-Marc Molina
Olivier Miakinen wrote:
Mais tu devrais quand même faire gaffe à ce qui peut se trouver dans
$_POST avant de l'insérer dans ta base de données...


Clairement il faut toujours valider et contrôler les données saisies par
l'utilisateur avant d'exécuter une requête.

Avatar
John GALLET
Bonjour,

(create,read,update,delete) et vu la complexité, j'ai commencé un
script dont je n'arrive pas a le faire fonctionner de maniere assez
belle.


Attention au piège de "l'esthète du code". On demande à du code d'être
avant tout fonctionnel, sécurisé et facile à maintenir.

Le probleme est ce "," qui reste a la fin, qui me gene.


Non, se débarasser de la virgule finale, c'est deux lignes de code avec un
appel à strrpos pour trouver son emplacement ou un substring avec un
strlen avant : on sait que c'est nécessairement le DERNIER caractère ET
qu'il existe, par constuction, donc c'est "trivial et laissé au lecteur
comme exercice d'application immédiate" (ça me fait toujours marrer de
lire ce genre de conneries dans les bouquins un peu conceptuels/hype).

Ou comme me l'apprend Olivier (je viens de voir que c'est depuis la 4.1,
eh oui, je suis pas à jour de mon manuel) le paramètre optionnel de rtrim
est encore plus élégant en php.

Le *vrai* problème c'est de savoir si ce genre de constructions
automatiques a un sens ou pas. Et pour moi il n'en a pas. Par exemple,
qu'est-ce qui va se passer s'il manque une variable ? Et le jour où on a
besoin d'ajouter un champ hidden dans le formulaire ? Ou si on ajoute un
champ NULLable dans la table, ou un timestamp de modification/insertion
qui prendra typiquement l'heure système comme valeur ? Ca va être un beau
bordel. Et je ne parle même pas d'écrire du SQL correct (i.e. les
numériques ne sont *PAS* entre ', et actuellement ça m'étonnerait que ça
marche pour insérer des strings, manque des ' autour des champs string
SQL).

Avez vous une idée plus simple ?


Ecrire un générateur de code (personnellement je fais ça en awk) qui
analyse le create table pour générer automatiquement du code PHP faisant
la construction de requêtes SQL a un sens. Poussé en méthode de
développement générique, ça donne un ORM (on en a parlé en septembre
dernier : http://propel.phpdb.org/trac/ par exemple).

Donc un bon vieil INSERT codé 'en dur' en ayant auparavant fait tout le
nécessaire de filtrage de variables c'est une idée "plus simple".

a++;
JG

Avatar
geo75
Le *vrai* problème c'est de savoir si ce genre de constructions
automatiques a un sens ou pas. Et pour moi il n'en a pas. Par exemple,
qu'est-ce qui va se passer s'il manque une variable ? Et le jour où on a
besoin d'ajouter un champ hidden dans le formulaire ? Ou si on ajoute un
champ NULLable dans la table, ou un timestamp de modification/insertion
qui prendra typiquement l'heure système comme valeur ? Ca va être un beau
bordel. Et je ne parle même pas d'écrire du SQL correct (i.e. les
numériques ne sont *PAS* entre ', et actuellement ça m'étonnerait que ça
marche pour insérer des strings, manque des ' autour des champs string
SQL).


Bonjour,

Merci pour votre intervention, je me pose des questions en effet.

Mon idée de départ est que j'ai 9 formulaire a mettre à jour, alors
je me suis dit autant faire une fonction qui mouline et injecte dans la
base de donnée, bien sur en prenant le soin de verifier avant
l'insert. Il est vrai que le CRUD est teriblement compliqué à mettre
en oeuvre(enfin pour moi)

Dans le cas présent, je pense que si le formulaire contient un champs
hidden, il sera aussi inseré.

Donc un bon vieil INSERT codé 'en dur' en ayant auparavant fait tout le
nécessaire de filtrage de variables c'est une idée "plus simple".


C'est assez trivial, mais en cas d'erreur il faudrat certainement
changer dans tous les formulaires. Pour 9 ca ira, mais ca va augmenter
rapidement.

Avatar
John GALLET
Il est vrai que le CRUD est teriblement compliqué à mettre
en oeuvre(enfin pour moi)


1) si cette méthode vous cause plus de mots de tête qu'elle ne vous résoud
de problèmes, changez en.

2) je doute fort qu'une quelconque méthode de développement, CRUD ou une
autre, conseille de construire à la volée les requêtes SQL en balayant
bestialement les données reçues sans même se demander à quelles
informations fonctionnelles elles peuvent bien correspondre. Si
d'aventure vous lisiez ce genre d'abberation, changez vite de crêmerie.

A l'inverse, on peut en revanche lire le schéma de données des tables
(ou tout descripteur à un quelconque format, xml pour faire hype si on
veut) pour en extraire une liste de variables obligatoires et
facultatives, et rechercher ces variables parmi les données reçues.
Exemple de fonctionnement de ce genre : phpMyAdmin qui travaille sur
n'importe quelle table. Mais attention, c'est bien une logique TOTALEMENT
INVERSE de ce que vous êtes en train de faire.

Dans le cas présent, je pense que si le formulaire contient un champs
hidden, il sera aussi inseré.
Ce qui est loin d'être ce que vous voulez.


C'est assez trivial, mais en cas d'erreur il faudrat certainement
changer dans tous les formulaires.
Oui et ?


Vous pouvez le tourner comme vous voulez : sur chaque écran de saisie de
données, si vous avez besoin d'autoriser à la fois l'ajout, la
modification, la consultation et la suppression, il faudra coder 4
requêtes SQL. Eh oui, l'informatique c'est chiant et le métier de
développeur, c'est pas rigolo tous les jours, il faudrait que certains
"décideurs" s'en rendent compte.

a++;
JG