[PHP/MySQL]Plusieurs champs textes - [Résolu]

Bonjour bonjour.

Pour planter le décor : Je suis plus que débutant…

Voici mon problème…

J’ai sur ma page, affiché un nombre X de champs textes par rapport au nombres de chansons qu’il y a dans un album (jusque là ok)

Ensuite j’aimerais, après remplissage des champs textes et au moment d’envoyer, qu’il insère dans ma BDD toutes les valeurs des champs.

Je n’y arrive pas :smiley:

Voici la partie de code :


if (isset($_POST["go"])){
    	$titre = $_POST["titre_txt"];
    	$id_album = $_POST["album_slct"];
        $sql = "INSERT INTO chansons (id_album,titre_chanson) values ($id_album,'$titre')";
    	
    	while(isset($titre)){    	
    	
    	mysql_query($sql) or die ("Erreur de requête: $sql");
    	
    	}
}

N’hésitez pas à critiquer, ça ne peut que me faire du bien.

Je ne sais même pas si while est la bonne solution.

Merci d’avance.

En effet, cela ne risque pas de fonctionner.

Qu’est titre? un tableau? Idem pour id_album.

titre est la valeur à récupèrer dans les champs textes, id_album est la valeur à récupèrer d’après le select.

par rapport à ton formulaire.

(qu’on a pas)

Bon voici tout le code…

En fait j’arrive à insèrer dans la bdd mais il m’insère seulement le dernier champ texte.

(ça doit être le bordel et doit y avoir pas mal d’erreurs mais comme on dit “c’est en faisant des erreurs qu’on progresse” hum…)

C’est parti :

<?php
  
  	include "../includes/connexion.php";
  	function listeAlbums(){
    
    $sql = "select * from album order by id_album";
    $rs = mysql_query($sql);
    print "<ul>";
    
    while($row = mysql_fetch_array($rs)){
    	
    	print "\n\t\t\t\t\t\t<li><a href=\"". $_SERVER['PHP_SELF'] . "?id_album=". $row['id_album'] ."\">" . $row['titre'] . "</a></li>";
    
    }
    
    print "\n\t\t\t\t\t</ul>";
    
    }
  	
    function chargeInputs(){
    
    
    	if(!isset($_GET['id_album'])){
    	
      print "<p>Choisissez un album ci dessus</p>";
    	
    	}elseif(isset($_GET['id_album'])){
    	
    	$sql = "select nbre_titres from album where id_album = ". $_GET['id_album'] ."";
    	$rs = mysql_query($sql) or die("Erreur : $sql");
    	$fetch = mysql_fetch_array($rs);
    	
    	for($i = 1; $i <= $fetch['nbre_titres']; $i++ ){
    	
      print "\n\t\t\t\t\t\t<label>Titre " . $i . "</label><input type=\"text\" name=\"titre_txt\" />\n<br />";
    	
    	}

    }
    }
    
    if(isset($_POST['go'])){
    
    $titre = addslashes($_POST['titre_txt']);
    $album = addslashes($_GET['id_album']);
    $sql = "insert into chansons (id_album, titre_chanson) values ('$album', '$titre')";
    mysql_query($sql) or die("erreur sql : " . "$sql");
    
    echo "<div class=\"confirm\">\n<p>Donn&eacute;es bien re&ccedil;ues</p>\n<button onclick=\"history.go(-1)\" value=\"retour\">Retour</button>\n</div>";
    
    }
    
	?>
  <div class="formulaire">
  	<fieldset><legend>Ajout des titres</legend>
  	<p>Dans quel album faut - il ins&egrave;rer les titres ?</p>
    	<label for="album_slct">Album : </label>
    	<?php listeAlbums() ?>
    	<br />
    	
    <?php 
    
    if(isset($_GET['id_album'])){
    
    ?>
    
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
    
    	<?php chargeInputs() ?>
    	<input class="ligne" type="submit" value="Envoyer" name="go" /><input class="ligne" type="reset" value="Annuler" />
    	
    </form>
    <?php }else{ ?>
    <p><a href="../admin/">Retourner &agrave; l'administration</a></p>
  	</fieldset>
  	
  	<?php } ?>

Tu n’aurais pas donné le même nom à tout tes champs texte par hasard :heink:

c’est à dire <input type=“text” name=“titre_txt” … pour chacun des champs de ta page formulaire.

Edit: après avoir lu ton code: ah ben si :paf:
Forcément, si tout tes champs texte s’appele “titre_txt”, tu n’aura que le dernier enregistrement vu que la valeur s’écrase l’une sur l’autre au fur et à mesure des enregistrement :slight_smile:

PS: je serais toi je mettrais les fonctions en fin de page, ou encore mieux, dans un fichier à part en include :oui:

Merci bien pour ces conseils.

J’ai donc mis les fonctions en include et adapté le code pour que le nom du champs s’appelle titre_txt1 titre_txt2 etc…

Comment récupèrer tous les champs ?

Sans bien sûr faire un truc bien lourd du genre :


 if(isset($_POST['go'])){
     
    	$sql = "select nbre_titres from album where id_album = ". $_GET['album'] ."";
    	$rs = mysql_query($sql) or die("Erreur : $sql");
    	$fetch = mysql_fetch_array($rs);
     
    for($i = 1; $i <= $fetch['nbre_titres']; $i++ ){
     
    	$titre.$i = addslashes($_POST['titre_txt' . $i . '']);
    	$album = addslashes($_GET['album']);
    	$sql = "insert into chansons (id_album, titre_chanson) values ('$album', '$titre". $i ."')";
    	mysql_query($sql) or die("Erreur : $sql");
     
    }

  	}

(qui en plus ne fonctionne pas :paf: )

Merci encore.

tu peux faire des tableaux dans tes formulaires :

<input type="text" name="machin[]" value="x" />
<input type="text" name="machin[45]" value="y" />

var_dump($_POST[‘machin’]);

Affiche: array(0 => string(1) ‘x’, ‘45’ => string(1) ‘y’);

J’ai pas tout à fait utilisé ta manière de faire Sans-nom mais j’ai réussi grâce à un foreach();

Merci bien :slight_smile:

Donc après avoir fait le tableau (titre_txt[]) etc j’ai fait ceci :


if(isset($_POST['go'])){
     
     $titre = addslashes($_POST['titre_txt']);
     $album = addslashes($_GET['album']);
     $titres = $_POST['titre_txt'];
     
     foreach($titres as $titre){     
     
     $sql = "insert into chansons (id_album, titre_chanson) values ('$album', '$titre')";
     mysql_query($sql) or die("erreur sql : " . "$sql");
     
     
     }
     }

Et ça passe nickel.

Merci encore.

Par contre, vive les injections SQL.

(si ce forum avait un moteur de recherche, je te retrouverai bien mon vieux topic sur tout ça)

Ya bien ca d’après google :

http://www.clubic.com/forum/php-securiser-…re-t316246.html

:ane:

Je ne connais que les bases de php et mysql, c’est pour du local.

Mais merci quand même pour cette remarque. (Pertinente en plus)