[PHP] problème de formulaire

Bonjour, voici mon problème.

J’ai un formulaire qui se compose de plusieurs champs:

  • 1 champ texte (name = titre)
  • n champs texte (name = nom)
  • n champs texte associé. (name = description)

C’est l’utilisateur qui determine le nombre de champs (n) par une page annexe. Pas de problème jusque là.

Un formulaire type se compose donc comme suit:

titre
* nom1: description1
* nom2: description2
* nom3: description3

(le nombre de couple nom/description est variable)

Lorsque l’utilisateur valide, on se retrouve donc avec:

  • $_POST[‘titre’]: chaine
  • $_POST[‘nom’]: tableau
  • $_POST[‘description’]: tableau.

Plusieurs oppérations doivent être effectuées:

  • insérer le titre dans une table A avec comme champ (id, titre), l’id étant en autoincrement.
  • vérifier que chacun des couples nom/description est rempli
    si oui: on continue
    si non: il faut éliminer les lignes incomplètes
  • récupérer l’id (autoincrement) de du titre venant d’être entré (select max(id) from tableA)
  • insérer dans une table B les couples nom/description (table sous forme id, id-titre, nom, description).

Le problème se situe au niveau de la suppression des lignes incomplete. J’ai trouvé une solution mais elle semble très lourde. Elle consiste à parcourir le tableau, à tester que les deux champs sont rempli, et si c’est le cas, les copier dans un nouveau tableau. Je ne sais pas si il existe une fonction permettant de supprimer une ligne d’un tableau… si oui, ce serait sans doute plus efficace)

$couple = array();
for($i = 1; $i < (count($description)+1); $i++)
{
	if(!empty($nom[$i]) && !empty($description[$i]))
	{
  $couple[] = array($nom[$i], $description[$i]);
	}
}

Après, pour insérer les valeurs dans la table B, je ne sais pas très bien cmt faire (sans faire une boucle for et faire n requete, ce qui serait une vrai folie!

Merci d’avance pour votre aide,

titib

Tu devrais éviter de nommer tes champs descriptionN et nomN : essaye plutôt

data[N][description]
data[N][nom]

Ca te permet d’avoir un tableau plus facile à manipuler.

Sinon, en général on fait déjà les opérations de validations, puis ensuite les opérations d’insertions. (mais j’ai pas trop saisi le final de ton idée).

mais $nom et $description je ne les nommes pas, c’est ce que je retire dans mon formulaire.

j’ai donc, pour exemple:

<input type="text" name="nom[]"><input type="text" name="description[]"><br />
<input type="text" name="nom[]"><input type="text" name="description[]"><br />
<input type="text" name="nom[]"><input type="text" name="description[]">

Ca me retourne donc deux tableaux: $_POST[‘nom’] et $_POST[‘description’], que je stocke dans les variable $nom et $description

Euh question ???
Pourquoi ne fais tu pas un contrôle en javascript (onblur par exemple) sur les champs input du genre afficher un pop-up si l’un des 2 champs n’est pas rempli ??

comme ça tu limites en amont les erreurs de saisies incomplètes !

ou j’ai rien compris ??!!

l’idée dans l’absolu n’est pas mauvaise, mais pour rappel, le javascript peu etre désactivé coté client, donc si c’est le cas, je me retrouve avec des blanc dans ma db…
c’est pas assez sécurisé

C’est pour cela que si tu nommais sagement tes champs

for ( $i = 0; $i < ...; $i++ )
  echo '<input type="text" name="data[', $i, '][nom]">',
          '<input type="text" name="data[', $i, '][description]"><br />';

Tu n’aurais plus qu’à vérifier simplement :


$error = 0;
foreach ( $_GET['data'] as $key => $field )
{
  if ( !isset($field['nom']) ||
       ( $field['nom'] = trim($field['nom']) ) == '')
  {
    $error++;
    break;
  }
  if ( !isset($field['description']) ||
       ( $field['description'] = trim($field['description']) ) == '')
  {
    $error++;
    break;
  }
  $_GET['data'][$key] = $field;
}

Si $error est positif => erreur, ne rien faire. Sinon faire tes insertions…

pas bête :wink:

et pour les insertions, tu me conseil de parcourir le tableau (for/foreach) et de faire un simple INSERT à chaque passage, ou tu as une idée pour optimiser la requete (le faire en une seule requete?

edit: j’ai une question. Y a un truc bizarre.
En effet, si je rempli le tableau comme suit:
0 - “nom1” - “description1”
1 - “nom2” - “description2”
2 - “nom3” - “description3”
pas de problème.
Mais si je laisse un espace, comme ca par exemple (ou avec le 0 vide)
0 - “nom1” - “description1”
1 - “” - “”
2 - “nom3” - “description3”
lorsque je parcour le tableau pour l’afficher, il s’arrete avant le premier espace (dans l’exemple ci-dessus, il n’affiche que la ligne 0, dans le cas ou le 0 est vide, il n’affiche rien)…

Pourquoi?

Parce que si un des couples (nom, description) est vide (partiellement ou non), tu vas dire qu’il y a une erreur directement. Et tu vas pas faire les autres couples : c’est le rôle de l’instruction break.

zut, tu as déja répondu (j’ai compri entre tps :p)
mais en l’occurence, ce que je veux, c’est simplement passer au suivant en ignorant le partiellement vide…
donc
0 - “nom1” - “description1”
1 - “” - “”
2 - “nom3” - “description3”

doit soit me remplir un nouveau tableau avec la ligne 0 et 2,soit supprimer la ligne 1.

Comme ca, après, à l’insertion, j’inserrais la ligne 0 et 2 et la ligne 1 sera oubliée…

dès lors, si je supprime les breack et que je fais une structure type
if(…)
elseif(…)
else(…)
à l’interieur de ma boucle foreach, ca fonctionne…
ca te parait bien?

et sinon, pour l’instruction sql, tu as une idée?

Tu vire le break c’est tout.

pour le sql, j’ai déjà répondu. Maintenant, si tu n’es pas capable d’insérer après avoir vérifié qu’il n’y avait pas d’erreurs, je ne peux absolulement rien pour toi. Et sinon, mysql_insert_id existe (pas SELECT MAX…) pour ce qui est auto_increment.

Deux choses…

  1. j’avais lu qu’il était préférable d’utiliser des if, elsif, else pltot que des if, if if,… D’autant que dans ce cas précis, ca fonctionne bien.
    Le pb est tjs le meme, et ca je n’ai pas trouvé la réponse dans tes répliques: dois-je faire un nouveau tableau où je copie les valeurs, excepté les vides, ou y a-t-il une commande pour effacer une ligne d’un tableau…

  2. mais pour le sql, je pense que t’as pas compris… (ou alors je suis stupide).
    La seule question est:
    est-ce que je fais une 2e boucle qui parcour mon nouveau tableau et qui insère à chaque passage la ligne du tableau concernée (ce qui me fera n requete insert avec n = le nb de couple nom/description) ou y a-t-il un moyen de le faire en une seule requete (en utilisant implode?)…

  1. ça change rien.
if ( ... )
{
  break; <-- fin de la boucle à ce point, n'éxécute pas plus de code, va après la boucle
}
...

(tout dépend au juste de ce que tu veux faire)

Ensuite, tu peux soit recréer le tableau ce qui te permettra oui d’avoir toute les lignes non vides (mais bref, je vais pas non plus deviner tes intentions hein…)

Tu peux même être plus futé, et faire juste un tableau de clef du tableau data que tu parcours: dans ce tableau, si un couple (n, d) est non vide, alors la clef (key => (n, d)) est placée dedans.

Moralité?

foreach ( $data_key as $key )
  print_r( $_GET['data'][$key] );

TU peux faire ton insertion en une requête (encore faut il connaître SQL)

INSERT INTO table (n,d) VALUES(X,Y), …, (X’, Y’);

Sachant que c’est pas forcément mieux niveau performance.

si c’est pas mieux niveau perf je vais pas m’acharner alors.

Merci bcp en tk (comme d’hab :p)

une chose: dans ton code, tu utilises la méthode GET pour ton formulaire. Je pensais que la méthode GET passait par l’url à l’inverse du POST qui n’affiche pas dans l’url (permet d’envoyer plus que la longueur d’une url)… Je me trompe?

Sinon, ton idée de faire un tableau avec uniquement les id des couples non vide me semble pas mal, j’y avais pas pensé du tout :slight_smile:

tiens, question à la rien à voir: t’as appri où à coder en fait?

GET parce que je me suis trompé.

(et pas la peine de double poster)

Pour l’insert multiple c’est pas que c’est mieux au niveau perf ou non, c’est que mySQL a du mal avec des grosses insertions (des grosses requêtes)…

J’ai appris à coder sur www.php.net

Sur php.net? c’est à dire? tu ne connaissais rien du tout en programmation et tu as été sur php.net, tu as lu tout le site, et puis tu connais ce que tu connais now… pardon mais j’ai du mal à le croire :stuck_out_tongue:

(désolé puor le double post, c’est réparré)

Pour php oui. Pour le reste, je suis en Licence d’info donc bon…

à oki. Ca aide un peu :wink: tricheur…

Moi j’avais imprimé le manuel PHP officiel et je l’avais emmené en vacances de ski. Le soir je le lisais et en 15 jours je comprenais le PHP. Ensuite j’ai appris beaucoup plus vite et j’ai fait une école d’info.

faut donc que je parte en ski pour apprendre? à non, c pas ca :stuck_out_tongue: