J'ai une liste déroulante, après avoir sélectionné une valeur Il ajoute une nouvelle ligne avec certains champs, exemple illustré dans l'image ci-dessous:

drop-down list

J'ai insert.php pour insérer des valeurs dans la base de données MySQL . Mais il y a un problème, que seules les valeurs de la première ligne sont insérées dans la base de données.

PHP ressemble à:

foreach($_POST['CertificateType'] as $key => $val){ 

    $CertificateType = $val;

    $CertificateType = $_POST['CertificateType'][$key]; 
    $STCWCode        = $_POST['STCWCode'][$key];            
    $CertNo          = $_POST['CertNo'][$key];          
    $FromCert        = $_POST['FromCert'][$key];            
    $ToCert          = $_POST['ToCert'][$key];  

    $CertificateType = mysqli_real_escape_string($link, $CertificateType);  
    $STCWCode        = mysqli_real_escape_string($link, $STCWCode);                 
    $CertNo          = mysqli_real_escape_string($link, $CertNo);           
    $FromCert        = mysqli_real_escape_string($link, $FromCert);                 
    $ToCert          = mysqli_real_escape_string($link, $ToCert);      

    $sql3 = "INSERT INTO Tbl (
        CertificateType     
        ,UserId    
        ,STCWCode               
        ,CertNo                 
        ,FromCert               
        ,ToCert
        ,DateCreated
    ) VALUES (
        '$CertificateType',
        '$UserID',  
        '$STCWCode',            
        '$CertNo',          
        '$FromCert',            
        '$ToCert',
        now())";
    if(mysqli_query($link, $sql3)){
        echo "Resume created successfully.";
    } else{
        echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
    }
} 

HTML ressemble à:

<fieldset class="fieldset-borders">
    <legend>4. Licenses & Certificates</legend>
    <ul class="header"> 
      <li>
        <select id='options' name="CertificateType[]" class="field-style div-format align-left">
          <option selected disabled value="0">Select certificates</option>
          <option value="1">One</option>
          <option value="2">Two</option>
          <option value="3">Three</option>  
        </select>  
      </li>
    </ul>  
    <ul class="cert" id="cert">     
      <li>
        <ul class="column">         
          <li><p class="test-label11">Name</p></li>                     
        </ul>
      </li>
      <li>
        <ul class="column">         
          <li><p class="test-label11">STCW Code</p></li>                        
        </ul>
      </li>
      <li>
        <ul class="column">         
          <li><p class="test-label11">Cert. No</p></li>                     
        </ul>
      </li>
      <li>
        <ul class="column">         
          <li><p class="test-label11">Place of Issue</p></li>                       
        </ul>
      </li>
      <li>
        <ul class="column">         
          <li><p class="test-label11">Date of Issue</p></li>                        
        </ul>
      </li>
      <li>
        <ul class="column">         
          <li><p class="test-label11">Date of Expire</p></li>                       
        </ul>
      </li>
      </ul>
        <div class="action2" ></div>


</fieldset>

Code Javascript que vous pouvez vérifier sur JS FIDDLE

J'ai créé JS FIDDLE pour vérifier cette partie du formulaire. Avez-vous des idées pour y remédier?

16
Infinity 6 mars 2016 à 19:55

7 réponses

Meilleure réponse

Utilisez votre JavaScript fiddle et ajoutez le type de certificat dans un champ caché pour chaque ligne; et nommez-le RowCertificateType comme les autres champs de la ligne;

<input type="hidden" name="RowCertificateType[]" value="" />
<!-- set value of this field same as you are showing in li as label for this row; -->

Puis dans votre script php utilisez comme suit:

foreach($_POST['RowCertificateType'] as $key=> $val){

  $CertificateType = $val;

  $STCWCode = $_POST['STCWCode'][$key];
  $CertNo = $_POST['CertNo'][$key];
  $FromCert = $_POST['FromCert'][$key];
  $ToCert = $_POST['ToCert'][$key];

  $CertificateType = mysqli_real_escape_string($link, $CertificateType);
  $STCWCode = mysqli_real_escape_string($link, $STCWCode);
  $CertNo = mysqli_real_escape_string($link, $CertNo);
  $FromCert = mysqli_real_escape_string($link, $FromCert);
  $ToCert = mysqli_real_escape_string($link, $ToCert);

  $sql3 = "INSERT INTO Tbl (
        CertificateType     
        ,UserId    
        ,STCWCode               
        ,CertNo                 
        ,FromCert               
        ,ToCert
        ,DateCreated
    ) VALUES (
        '$CertificateType',
        '$UserID',  
        '$STCWCode',            
        '$CertNo',          
        '$FromCert',            
        '$ToCert',
        now())";
  if(mysqli_query($link, $sql3)){
    echo "Resume created successfully.";
  }else{
    echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
  }
}     

:)

5
itzmukeshy7 18 mars 2016 à 13:28

Vous essayez d'insérer un tableau entier dans un seul code. Prenez d'abord le compte. Et puis récupérer le contenu du tableau et en utilisant une boucle for l'insérer dans la base de données par exemple, si mon nom pour la zone de texte est cellname[]

Puis pour insérer cela doit être fait

 $itemCount = count($_POST['cellname']);
 $info=$_POST['cellname'];
 for($i=0;$i<$itemCount;$i++) {
   $query = "INSERT INTO item (item_name) VALUES('$info[$i]') ";
  //rest of the queries
 }

"

1
Remya R 17 mars 2016 à 12:32

Je n'ai pas encore tout regardé mais vos champs de saisie semblent tous avoir le même nom dans le violon.

La première entrée de toutes les lignes semble être "name =" STCWCode [] ". Avez-vous regardé votre $ _POST et vérifié que vous pouvez voir toutes vos entrées ou s'il n'y a que des entrées de la première ligne? Je pense que les noms pourrait être un problème.

1
drittponken 6 mars 2016 à 17:07

Vous utilisez une mauvaise boucle entière. Au lieu de cela, vous devez exécuter la boucle par exemple STCWCode variable POST.

Mais pourtant, je vous suggère de modifier le code javascript et de créer des noms d'entrée comme ceci row[0][STCWCode], row[0][CertNo] et ainsi de suite où row[0] est pour la première ligne et row[1] sera pour la deuxième ligne et ainsi de suite . Ensuite, vous pouvez exécuter la boucle avec $_POST['row']

2
Rohit Awasthi 10 mars 2016 à 15:02

Vous devez créer des formulaires avec ce format

<form action="insert.php" method="post">  
<ul>
    <li>
        <input name="CertificateType[0]" type="hidden">
        <input name="CertificateType[0]['STCWCode']" type="text">
        <input name="CertificateType[0]['CertNo']" type="text">
        <input name="CertificateType[0]['PlaceofIssueCert']" type="text">
        <input name="CertificateType[0]['FromCert']" type="date">
        <input name="CertificateType[0]['ToCert']" type="date">
    </li>
    <li>
        <input name="CertificateType[1]" type="hidden">
        <input name="CertificateType[1]['STCWCode']" type="text">
        <input name="CertificateType[1]['CertNo']" type="text">
        <input name="CertificateType[1]['PlaceofIssueCert']" type="text">
        <input name="CertificateType[1]['FromCert']" type="date">
        <input name="CertificateType[1]['ToCert']" type="date">
    </li>
    ...
</ul>
</form>

Lorsque vous soumettez un formulaire avec ce format, vous recevrez Tableau de clés numériques dans $_POST['CertificateType'] dans insert.php

array(
  "0" => array(
           "STCWCode" => "somevalue",
           "CertNo" => "somevalue",
           "PlaceofIssueCert" => "somevalue",
           "FromCert" => "somevalue",
           "ToCert" => "somevalue",  
         ),
  "1" => array(
           "STCWCode" => "somevalue",
           "CertNo" => "somevalue",
           "PlaceofIssueCert" => "somevalue",
           "FromCert" => "somevalue",
           "ToCert" => "somevalue",  
         ),
   . . .
)

Ici, chaque index représentera une ligne, ce qui peut être récupéré en utilisant la boucle foreach comme ci-dessous:

Mettez à jour votre code php comme

foreach($_POST['CertificateType'] as $val){ 

$CertificateType = $val;

$CertificateType = $val; 
$STCWCode        = $val['STCWCode'];            
$CertNo          = $val['CertNo'];          
$FromCert        = $val['FromCert'];            
$ToCert          = $val['ToCert'];  

$CertificateType = mysqli_real_escape_string($link, $CertificateType);  
$STCWCode        = mysqli_real_escape_string($link, $STCWCode);                 
$CertNo          = mysqli_real_escape_string($link, $CertNo);           
$FromCert        = mysqli_real_escape_string($link, $FromCert);                 
$ToCert          = mysqli_real_escape_string($link, $ToCert);      

$sql3 = "INSERT INTO Tbl (
    CertificateType     
    ,UserId    
    ,STCWCode               
    ,CertNo                 
    ,FromCert               
    ,ToCert
    ,DateCreated
) VALUES (
    '$CertificateType',
    '$UserID',  
    '$STCWCode',            
    '$CertNo',          
    '$FromCert',            
    '$ToCert',
    now())";
if(mysqli_query($link, $sql3)){
    echo "Resume created successfully.";
} else{
    echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
}
} 
6
Hiren patel 17 mars 2016 à 17:35

Vous devez créer une entrée masquée avec la valeur sélectionnée pour le certificat, la liste déroulante consiste uniquement à créer la nouvelle ligne, mais vous devez créer une nouvelle entrée avec le formulaire Array, peut-être modifier le nom de la liste déroulante, par exemple CertificateType [] => CertificateTypeList et la nouvelle entrée masquée nom avec CertificateType []

UL n'est pas envoyé avec les types d'entrée de formulaires uniquement.

<select id='options' name="CertificateList">
  <option selected disabled value="0">Select certificates</option>
  <option value="1">One</option>
  <option value="2">Two</option>
  <option value="3">Three</option>  
</select>

Créez la balise de formulaire une seule fois et les entrées pour chaque répétition

<form action="insert.php" method="post">  
<ul>
    <li>
        <input name="CertificateType[]" type="hidden">
        <input name="STCWCode[]" type="text">
        <input name="CertNo[]" type="text">
        <input name="PlaceofIssueCert[]" type="text">
        <input name="FromCert[]" type="date">
        <input name="ToCert[]" type="date">
    </li>
    <li>
        <input name="CertificateType[]" type="hidden">
        <input name="STCWCode[]" type="text">
        <input name="CertNo[]" type="text">
        <input name="PlaceofIssueCert[]" type="text">
        <input name="FromCert[]" type="date">
        <input name="ToCert[]" type="date">
    </li>
    ...
</ul>
</form>
2
Mauricio Florez 12 mars 2016 à 21:11

Vous bouclez sur $ _POST ['CertificateType'], qui (avec votre configuration) ne contiendra qu'une seule valeur (pas de sélection multiple dans le champ de sélection)

2
Christian Weber 10 mars 2016 à 14:38