使用 PHP 和 JavaScript 分隔 SQL 插入的变量


Separating variables for SQL insert using PHP and JavaScript

通过

PHP/MySQL 显示一个网格表,其中包含用户将选中的复选框列。名称为"checkMr[]",如下所示:

 echo "<tr><td>
 <input type='"checkbox'" id='"{$Row[CONTAINER_NUMBER]}'" 
 data-info='"{$Row[BOL_NUMBER]}'" data-to='"{$Row[TO_NUMBER]}'" 
 name='"checkMr[]'" />
 </td>";

正如您将注意到的,id、数据信息和数据到的属性被发送到模式窗口。下面是将属性发送到模态窗口的 JavaScript:

 <script type="text/javascript">
   $(function()
   {
     $('a').click(function()
     {
       var selectedID = [];
       var selectedBL = [];
       var selectedTO = [];
       $(':checkbox[name="checkMr[]"]:checked').each(function()
       {
         selectedID.push($(this).attr('id'))
         selectedBL.push($(this).attr('data-info'))
         selectedTO.push($(this).attr('data-to'))
       });
       $(".modal-body .containerNumber").val( selectedID );
       $(".modal-body .bolNumber").val( selectedBL );
       $(".modal-body .toNumber").val( selectedTO );
     });
   });
 </script>

目前为止,一切都好。模态通过 javascript 检索属性。我可以选择显示或不显示它们。以下是模态检索属性的方式:

 <div id="myModal">
   <div class="modal-body">
   <form action="" method="POST" name="modalForm">
     <input type="hidden" name="containerNumber" class="containerNumber" id="containerNumber" />
     <input type="hidden" name="bolNumber" class="bolNumber" id="bolNumber" />
     <input type="hidden" name="toNumber" class="toNumber" id="toNumber" />
   </form>
   </div>
 </div>

表单中还有其他字段,用户将输入数据,我只是选择不显示代码。但到目前为止,一切正常。有一个提交按钮,然后将表单数据发送到PHP变量。有一个 mysql INSERT 语句,然后更新必要的表。

这是PHP代码(在模态窗口中):

 <?php
 $bol = $_POST['bolNumber'];    
 $container = $_POST['containerNumber']; 
 $to = $_POST['toNumber'];  
 if(isset($_POST['submit'])){
 $bol = mysql_real_escape_string(stripslashes($bol));
 $container = mysql_real_escape_string(stripslashes($container));
 $to = mysql_real_escape_string(stripslashes($to));
 $sql_query_string = 
   "INSERT INTO myTable (bol, container_num, to_num)
   VALUES ('$bol', '$container', '$to')
 }
    if(mysql_query($sql_query_string)){
      echo ("<script language='javascript'>
             window.alert('Saved')
             </script>");
    }
    else{
      echo ("<script language='javascript'>
             window.alert('Not Saved')
             </script>");
   }
 ?>

所有这些都有效。用户选中一个复选框,模式窗口打开,用户填写其他表单字段,点击保存,只要没有问题,相应的窗口就会弹出并说"已保存"。

问题是:当用户选中多个复选框时,模态确实会检索多个容器编号,我可以显示它。它们似乎已经用逗号分隔。

当 PHP 变量包含多个容器编号(或 bol 编号)时,问题就出现了。容器号需要分开,我想 PHP 必须有一种方法可以自动为每个容器号创建多个 INSERT 语句。

我知道变量需要以某种方式放置在数组中。然后必须有一个 FOR 循环,它将读取每个容器并在有逗号时将它们分开。

我只是不知道该怎么做。

当你像[]一样通过HTTP发送数组值时,它们已经是PHP中的数组,所以你已经可以迭代它们了:

foreach ($_POST['bol'] as $bol) {
    "INSERT INTO bol VALUES ('$bol')";
}

您的查询容易受到注入。 您应该将正确的参数化查询与 PDO/mysqli 一起使用

假设正

下方作为键的*_NUMBER变量是整数,请使用:

echo '<tr><td><input type="checkbox" value="'.json_encode(array('CONTAINER_NUMBER' => $Row[CONTAINER_NUMBER], 'BOL_NUMBER' => $Row[BOL_NUMBER], 'TO_NUMBER' => $Row[TO_NUMBER])).'" name="checkMr[]" /></td>';

然后。。。

$('a#specifyAnchor').click(function() {
  var selectedCollection = [];
  $(':checkbox[name="checkMr[]"]:checked').each(function() {
    selectedCollection.push($(this).val());
  });
  $(".modal-body #checkboxCollections").val( selectedCollection );
});

然后。。。

<form action="" method="POST" name="modalForm">
  <input type="hidden" name="checkboxCollections" id="checkboxCollections" />

然后。。。

<?php
$cc = $_POST['checkboxCollections'];    
if (isset($_POST['submit'])) {
  foreach ($cc as $v) {
    $arr = json_decode($v);
    $query = sprintf("INSERT INTO myTable (bol, container_num, to_num) VALUES ('%s', '%s', '%s')", $arr['BOL_NUMBER'], $arr['CONTAINER_NUMBER'], $arr['TO_NUMBER']);
    // If query fails, do this...
    // Else...
  }
}
?>

一些注意事项:

  • 请注意我用于您之前的$('a').click()函数的选择器。这样做,以便您的表单仅在单击特定链接时更新。
  • 由于懒惰,我删除了您的mysql_real_escape_string功能。 确保您的数据可以正确插入到表中。
  • 确保保护自己免受 SQL 注入漏洞的影响。
  • 请务必测试我的代码。你可能不得不改变一些事情,但要了解这里的大局。