Saya memiliki halaman web dengan banyak baris yang memiliki dua input. Mungkin 10 baris, mungkin 100 baris, itu tergantung pada berapa kali tombol addP diklik. Nilai input ini harus dimasukkan ke dalam tabel IDC dengan idc_addDVC.php.

Saya ingin menggunakan while loop untuk banyak input data. Tapi sayangnya data ini tidak bisa dimasukkan ke tabel IDC dengan idc_addDVC.php saya.

Tabel ClOUDT dan IDC tidak menunjukkan apa-apa setelah dikirimkan. Berikut adalah kode JS saya:

<script>
var aDWI=1;
function addPf()
{
    newrow = '<tr><td style="width:25%" colspan="2"><input style="width:98%" name="enName'+aDWI+'"></td><td style="width:85%" colspan="2"><input style="width:98%" name="enID'+aDWI+'"></td></tr>'; 
    $(newrow).insertAfter($('#staTable tr:eq('+aDWI+')'));
     aDWI = aDWI + 1;   
    $('#engID').attr("value",aDWI);
}
</script>

Ini kode html saya:

<div>
  <form action="idc_addDVC.php?act=add&table=IDC" method="POST">
    <table>
      <tr>
          <input type="button" id="addP" onclick="addPf()" value="AP">
      </tr>
      <tr>
         <input type="text"  name="enName">
         <input type="text"  name="enID">
      </tr>
      <tr>
          newrow is added here
      </tr>
      <tr>
         <td>
           <input type="submit" value="submitBtn">
           <input type="hidden"  id="engID" value="1" name="engRow">
         </td>
     </tr>
    </table>
 </form>
</div>

Berikut kode idc_addDVC.php yang gagal:

<?php
 if($_GET["act"]=="add")
{
   $conn=new PDO('mysql:host=localhost;port=3306;dbname=xxx' , 'root' , 'xxx');

   $query="begin declare i int;
           set i=1;
           insert into ClOUDT (customer) values ('JOHN');
           while i < ".$_POST['engRow']."
           do
             insert into  IDC (name,id,cloudeid) values('".$_POST['enName'+i]."','".$_POST['enID'+i]."',LAST_INSERT_ID());
           set i=i+1;
           end while; 
           commit;";
   $stmt=$conn->query($query);
  echo "success";
  ......
 }
 else
 {
   echo "fail";
   ......
 }
}
?>

Berikut adalah kode idc_addDVC.php yang berhasil:

 <?php
 if($_GET["act"]=="add")
{
   $conn=new PDO('mysql:host=localhost;port=3306;dbname=xxx','root','xxx');

   $query="begin ;
           insert into ClOUDT (customer) values ('JOHN');
           insert into  IDC (name,id,cloudeid) values('".$_POST['enName']."','".$_POST['enID']."',LAST_INSERT_ID());
           commit;";
   $stmt=$conn->query($query);
  echo "success";
  ......
 }
 else
 {
   echo "fail";
   ......
 }
}
?>

Saya kira 'enName'+i di $query dari idc_addDVC.php salah. Tapi saya tidak tahu bagaimana cara mendapatkan nilai input dinamis. Ini rumit, siapa yang bisa membantu saya?

1
stack 8 Agustus 2017, 10:21

2 jawaban

Jawaban Terbaik

HTML

Hapus atribut onclick dan lampirkan onclick event handler menggunakan jQuery.

<input type="button" id="addP" value="AP">

JavaScript

Gunakan notasi array [] saat membuat nama input. Itu membuatnya lebih mudah untuk mengulang bidang POSTed sesudahnya. Dan menghindari Anda harus melacak baris terakhir Anda dengan engRow.

$('#addP').click(function () {
    $('#staTable tr:last-child').before('
        <tr><td colspan="2" style="width:25%"><input name="enName[]" style="width:98%"></td></tr>
    ');
});

PHP

Saya akan melakukan penyisipan massal dalam transaksi alih-alih prosedur tersimpan.

<?php
// turn on error reporting in case
error_reporting(E_ALL);
ini_set('display_errors', 1);

// wrong: == (comparaison), not = (assignment)
if ($_GET['act'] == 'add') {
    try {
        $conn=new PDO('mysql:host=localhost;port=3306;dbname=xxx' , 'root' , 'xxx');
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $conn->beginTransaction();

        // wrong: INSERT INTO, not INSET INTO
        $sth = $conn->prepare("INSERT INTO cloudt(customer) VALUES('JOHN')");             
        $sth->execute();
        $cloudeid = $conn->lastInsertId();

        // $_POST['enName'] should be an array

        foreach ($_POST['enName'] as $name) {
            $sth = $conn->prepare("INSERT INTO idc(name, cloudeid) VALUES(?, ?)");
            $sth->execute(array($name, $cloudeid));
        }
        $conn->commit();
        echo "success";
    } catch (PDOException $e) {
        echo $e->getMessage();
        $conn->rollBack();
        echo "fail";
    }
}
?>

Bacaan yang bermanfaat

1
Mikey 9 Agustus 2017, 13:01

Setelah $sth->closeCursor() dan array(PDO::ATTR_AUTOCOMMIT=>0) ditambahkan, itu berfungsi dengan baik.

if($_GET["act"]=="add")
{
  if($_POST['customerName']!= NULL)
  {
      try
      {
        $conn=new PDO('mysql:host=localhost;port=3306;dbname=xxx' , 'root' , 'xxx',array(PDO::ATTR_AUTOCOMMIT=>0));
      }
      catch(PDOException $e)
      {
        echo "connect failed!".$e->getMesage();
        exit;
      }  

      try
      {
      $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $conn->beginTransaction();
      $query="insert into cloudt (name) VALUES('JOHN');
              insert into  idc (name,id,phone,cloudtid) VALUES('".$_POST['engName3']."','".$_POST['engID3']."','".$_POST['engPhone3']."',LAST_INSERT_ID());               
              insert into  idc (name,id,phone,cloudtid) VALUES('".$_POST['engName4']."','".$_POST['engID4']."','".$_POST['engPhone4']."',LAST_INSERT_ID());";
      $stmt=$conn->query($query);
      $stmt->closeCursor();
      $conn->commit();
      echo "success";
     }
      catch (PDOException $e) {
              echo $e->getMessage();
              $conn->rollBack();
              echo "fail";
      }

   }
 }     
0
stack 10 Agustus 2017, 08:46