foreach et base de données

Eléphanteau du PHP | 17 Messages

30 janv. 2013, 12:36

bonjour,

je voudrais entrer les données récupérées d'un formulaire dynamique dans une table

voici mon code:
foreach($_POST as $name => $value)
{
	$req_insert = "INSERT INTO Nom_de_la_table($name) values ('$value');";
	$req2 = mysql_query($req_insert) or die(mysql_error());
}
je récupére bien toutes les valeurs de mon formulaire, le souci c'est que chaque valeur s'enregistre sur une nouvelle ligne dans la table et pas sur une seule et même ligne

quelqu'un peut il m'aiguiller pour enregistrer sur une seule ligne?

merci de votre aide

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

30 janv. 2013, 13:15

salut,

ton code fait bien ce que tu décris c'est normal ;)

il faut simplement que tu utilise la concaténation pour réaliser une requête du style :
insert into latable (les,champs,que,tu,veux) values(les,valeurs,que,tu,veux);
.

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 120 Messages

30 janv. 2013, 13:34

Ce que tu fais est extrêmement dangereux et permet de faire des injections SQL. De plus, tu utilises l'extensions MySQL qui est dépréciée à partir de PHP5.5 et ne va sans doute plus exister dans PHP5.6 ou PHP6. Tu devrais donc changer pour PDO ou mysqli.


Pour ce qui est de ton problème, il faut tout d'abord que tu mettes une liste de blanche de champs qui doivent être définis :
$allowed_fields = array("username", "email", "autre_champ");
Ensuite, tu dois récupérer les champs que le formulaire envoie :
$added = array();
foreach ($allowed_fields as $field) {
    if (!isset($_POST[$field])) {
        throw new \Exception(sprintf("Il manque le champ %s", $field));
    }
    $added[$field] = $_POST[$field];
}
Une fois que tu as récupéré ces champs, tu dois construire la requête et de l'envoyer à la base de données :
$sql = "insert into NOM_de_la_table (%s) values (%s)";
foreach ($added as $field => $value) {
    $input[":" . $field] = $value;
}
$PDO->prepare(sprintf($sql, "`" . implode("`,`", array_keys($added)) . "`", implode(",", array_keys($input))));
$PDO->execute($input);

Eléphanteau du PHP | 17 Messages

30 janv. 2013, 16:11

Re,

@ Perine,

j'ai l'intention de protéger des injections sql une fois que je serais sur que ce que je veut faire fonctionne, et je l'utilise en local,pour ce qui est de mysqli et PDO, malheureusement je n'en ai jamais entendu parler lors de la "formation" que j'ai suivi récemment :(.
Je vais me renseigner pour l'utiliser et faire autrement qu'en dynamique pour l'instant,

merci pour ton aide

Eléphant du PHP | 120 Messages

30 janv. 2013, 16:21

Se protéger contre des injections SQL n'est pas une chose à faire par la suite. Il suffit d'une requête non protégée pour que tout le système soit potentiellement compromis (à cause d'un oubli par exemple).
PDO (ou mysqli) avec des Prepared Statements te protège automatiquement contre les injections SQL. Je te conseille donc vivement de t'intéresser à ce sujet aussi vite que possible :)

ViPHP
xTG
ViPHP | 7331 Messages

30 janv. 2013, 16:39

Je rajouterai que la protection des données ne doit pas être une tâche mais un réflexe. ;)