Insert sur plusieurs lignes SQL

Eléphanteau du PHP | 21 Messages

07 févr. 2012, 14:26

Bonjour cher internautes,

Voici mon problème, je suis en train de créer un planning a enregistrer sur une base de données, sauf que je me complique la vie et a ce rythme la base de données va exploser :p

Je m'explique, j'utilise un " for " pour afficher mon formulaire (Dans cette example il n'y a que 10 entrées, en vrai j'en ai 200 ;) )
<?php
$nb=10;
for( $i = 0 ; $i < $nb ; $i++) 
{
echo '<input type="text" name="jour[]" value="" />';
}
?>
Ensuite j'ai créer une base de données avec 11 champs #-o

Nom de la table -> test
Champs 1 -> ID (A.I.(PRIMARY))
Champs 2 -> jour1
Champs 3 -> jour2
Champs 4 -> jour3
...
Champs 11 -> jour10

J'utilise ce code pour récupérer chaque valeur du formulaire et les insérer :
<?php

$cxn=mysql_connect('localhost','MON_USER', 'MON_PASS') or die("echec 1.");
mysql_select_db('MA_BASE',$cxn) or die('Erreur de selection '.mysql_error());
	
$sql='INSERT INTO test(jour1, jour2, jour3, jour4, jour5, jour6, jour7, jour8, jour9, jour10) VALUES (';

foreach($_GET['jour'] as $key=>$value)
{
   $sql.= '"'.$value.'",';
}
$sql= substr($sql,0,strlen($sql)-1);
$sql.=');';

$result=mysql_query($sql) or die(mysql_error());

header('Location: planning.php');
exit()

?>
Mon problème est le suivant, l'insertion fonctionne parfaitement, mais c'est pas propre, je sais qu'il existe une possibilité d'ajouter plusieurs ligne afin d'optimiser son contenu,
avec plusieurs requête en meme temps, mais comment y attribuer les valeurs ? Quel syntaxe utiliser ? Je suis perdu ;)

Merci d'avance pour ce qui porteront un intérêt a ma requête !
Pourquoi faire simple quand on peut faire compliquer ?

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

07 févr. 2012, 14:34

salut,


tu a un gros problème de modélisation la !

chaque jours doit être un tuple (une ligne) d'une table et non une colonne.

en clair
un table "manifestation"
idmanif clef primaire
nom varchar(20)
etc etc

une table planning
id clef primaire
idmanif : clef étrangère, fait référence à l'idmanif de la première table.
datemanif date
heuredebut int
heurefin int
commentaire

Avec ça tu insère autant de "jour" (voir heure etc etc) par "manif" que tu souhaite dans la table planning et ceci quelque soit le planning.
tu n'est pas limité par le nombre de jour possible, tu n'a pas de champ inutile dans la table, c'est maintenable bref c'est ce qu'il te faut :)

pour plus d'info demande à google le modéle entité - association (c'est un bout de la méthode merise).

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

Eléphanteau du PHP | 21 Messages

07 févr. 2012, 16:24

Merci pour cette orientation, je n'aurai pas imaginer ça de cette manière, je vais me renseigner a ce sujet :D
Pourquoi faire simple quand on peut faire compliquer ?

Eléphanteau du PHP | 21 Messages

07 févr. 2012, 16:38

Je viens de consulter notre ami commun google ;) sur les modéle entité - association,
je comprend la structure que mes tables doit avoir, un progret considérable,
mais je vois toujours pas comment écrire la syntaxe du code pour y ajouter les valeurs avec cette fonction foreach que j'utilise :D

Merci en tout cas pour l'orientation, je progresse !
Pourquoi faire simple quand on peut faire compliquer ?

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

07 févr. 2012, 16:41

==> PDO + requête préparée

tu fait une requête qui insère une ligne à la fois.

sinon insert into table (champs1, champ2) values (couple,1),(couple,2), (couple,3) etc etc

ceci dit ce n'est pas "portable", la solution de la requête préparée l'est :)

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

Eléphanteau du PHP | 21 Messages

08 févr. 2012, 22:57

Ton type de requête fonctionne bien si tu attribue directement les valeurs,

j'ai essayer tant bien que mal de l'adapter mais c'est trop compliquer, je trouve pas la bonne syntaxe pour y ajouter les valeurs avec le code que j'utilise, faut peut être que je recommence tout :(

ma requête sql :
$matricule=$_POST['matricule']; /// Je recupere une valeur avec un sélect pour la jointure des tables

$sql="INSERT INTO planning_3_24(matricule, jour1, jour2, jour3, jour4, jour5, jour6, jour7, jour8, jour9, jour10, jour11, jour12, jour13, jour14, jour15, jour16, jour17, jour18, jour19, jour20, jour21, jour22, jour23, jour24, jour25, jour26, jour27, jour28, jour29, jour30, jour31) VALUES ('$matricule',"; // j'affiche ma valeur ici suivi du foreach pour le reste du coup je trouve pas d'autre solution que de créer 31 champs !

foreach($_POST['jour'] as $key=>$value)
{
   $sql.= '"'.$value.'",';
}
$sql= substr($sql,0,strlen($sql)-1);
$sql.=');';   /// ça créer tout simplement les valeur automatiquement -> jour1, jour2, jour3, jour4, etc, etc ......
Ze devient fou !!!! ;)
Pourquoi faire simple quand on peut faire compliquer ?

Eléphanteau du PHP | 21 Messages

09 févr. 2012, 00:54

Bon j'ai tout repris a zéro, on va voir ce que ça donne, merci pour vos orientation ;)
Pourquoi faire simple quand on peut faire compliquer ?

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

09 févr. 2012, 14:30

de rien, et surtout oublie les 400 champs identiques les jours c'est une table !


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

Eléphanteau du PHP | 21 Messages

09 févr. 2012, 21:53

XD c'est sure, maintenant que je sais comment m'y prendre, il y vrai que c'était totalement ridicule ;)

Mais seul ceux qui font rien ne se trompe jamais !
Pourquoi faire simple quand on peut faire compliquer ?