【问题标题】:Multiple insert in MySQL table from PHP table从 PHP 表中多次插入 MySQL 表
【发布时间】:2016-08-09 09:13:04
【问题描述】:

我被以下问题困住了。我有两个 php 文件:一个显示带有组合框的学生列表,以将每个学生标记为“在场”或“缺席”,另一个接收这些帖子并将值插入 MySql 表中。我在发布数组 attendance_status[] 的值时遇到问题,导致错误:“数组到字符串的转换”。我知道这可能是我缺少的一些基本的东西,但找不到我的出路。这是我的两个文件(我知道它已被弃用并将相应更新):

index.php

?php 
error_reporting( E_ALL );
ini_set('display_errors', 1);


require "config.php";
$con = mysql_connect ( DBSERVER, DBUSER, DBPASS );
mysql_select_db ( DBNAME, $con );


?>


<h1 align="center"><font color="black"><b>ATTENDANCE FOR GRADE1</font></b></h1>
<table id="attendance" border="1"  cellspacing="1" cellpadding="1" >
<tr >
<th>id</th>
<th>name</th>
<th>surname</th>
<th>attendance</th>

</tr>
<?php

   $query = ("SELECT * FROM `b10_18591250_JC`.`STUDENT`");
   $result = mysql_query($query);

while( $row = mysql_fetch_array($result))

{


  echo "<form action=insertattend.php method=POST>";
  echo "<tr>";
  echo "<td>" . "<input name=stid type=number value=" .$row['ID']." </td>";
  echo "<td>" . "<input name=stname type=text value=" .$row['NAME']." </td>";
  echo "<td>" . "<input name=stsurname type=text value=" .$row['SURNAME']." </td>";

echo "<td>";
echo "<select name=attendance_status[] id=attendance_status>";
echo "<option value=1>Present</option>";
echo "<option value=0>Absent</option>";
echo "</select>";
echo "</td>";
echo "</tr>"; 

}

  echo"<input type=submit value=Submit>";
?>
</table>

</form>

在这个名为 insertattend.php 的页面上发帖

<?php 
error_reporting( E_ALL );
ini_set('display_errors', 1);

require "config.php";
$con = mysql_connect ( DBSERVER, DBUSER, DBPASS );
mysql_select_db ( DBNAME, $con );

$stid = $_POST["stid"];
$attendance_status = $_POST["attendance_status"];


mysql_query("INSERT INTO ATTENDANCE (ID, STUDENT_ID, ATTENDANCE) VALUES
(NULL, '$stid', '$attendance_status')") or die (mysql_error());

?>

【问题讨论】:

  • attendance_status 是您尝试直接保存的数组
  • 认真的吗? mysql_*? ??????

标签: php mysql


【解决方案1】:

你发布了一系列的出席状态,你应该循环它。

<?php 
 while( $row = mysql_fetch_array($result))

{


  echo "<form action=insertattend.php method=POST>";
  echo "<tr>";
  echo "<td>" . "<input name=stid[] type=number value=" .$row['ID']." </td>";
  echo "<td>" . "<input name=stname type=text value=" .$row['NAME']." </td>";
  echo "<td>" . "<input name=stsurname type=text value=" .$row['SURNAME']." </td>";

echo "<td>";
echo "<select name=attendance_status[] id=attendance_status>";
echo "<option value=1>Present</option>";
echo "<option value=0>Absent</option>";
echo "</select>";
echo "</td>";
echo "</tr>"; 

}
?>

<?php 
error_reporting( E_ALL );
ini_set('display_errors', 1);

require "config.php";
$con = mysql_connect ( DBSERVER, DBUSER, DBPASS );
mysql_select_db ( DBNAME, $con );

$stid = $_POST["stid"];
$attendance_status = $_POST["attendance_status"];

for($i=0;$i<count($attendance_status);$i++){
   mysql_query("INSERT INTO ATTENDANCE (ID, STUDENT_ID, ATTENDANCE) VALUES
   (NULL, $stid[$i], $attendance_status[$i])") or die (mysql_error());
}

?>

【讨论】:

  • 在循环中执行插入语句不是一个好方法,它会降低性能并减慢系统速度。相反,您可以在循环中生成查询并在循环外插入,请参见此处 - stackoverflow.com/questions/18459515/…
【解决方案2】:

你需要循环到你的数组。

 <?php 
    error_reporting( E_ALL );
    ini_set('display_errors', 1);

    require "config.php";
    $con = mysql_connect ( DBSERVER, DBUSER, DBPASS );
    mysql_select_db ( DBNAME, $con );

    $stid = $_POST["stid"];
    $attendance_status = $_POST["attendance_status"];
    $size = sizeof($attendance_status);
    for ($i = 0 ; $i < $size ; $i++ ){
        $value = $attendance_status[$i]; 
        mysql_query("INSERT INTO ATTENDANCE (ID, STUDENT_ID, ATTENDANCE) VALUES
        (NULL, '$stid', '$value')") or die (mysql_error());
    }

    ?>

【讨论】:

    【解决方案3】:

    您可以通过为每个结果声明一个变量来解决问题。 例如, $id = $row['ID'] 并且他们将此值插入到您拥有的字符串中。

    【讨论】:

      【解决方案4】:

      就像其他人说的那样。您正试图在一个工作步骤中保存一组数据。我稍微重组了您的文件并将 stid 输入更改为数组。

      insertattend.php 做了什么:

      • 创建 sql 插入查询标头
      • 循环遍历每个 studentid,从每个 studentid 中获取 key 和 value
      • 将值连接到标题
      • 并修剪掉最后一个 concat 上的最后一个冒号

      之后,你会得到一个类似的 sql 字符串

      INSERT INTO ATTENDANCE (ID, STUDENT_ID, ATTENDANCE) VALUES
          (NULL, '1', '0'),
          (NULL, '2', '1'),
          ...
          (NULL, '26', '1')
      

      您可以使用 mysql_query() 执行。

      但请注意!

      您正在使用来自帖子的未转义输入,因此容易受到 sql 注入

      阅读本文以获取更多信息:

      SQL Injections

      How can I prevent SQL injection in PHP?


      <?php // index.php
          error_reporting(E_ALL);
          ini_set('display_errors', 1);
      
          require "config.php";
          $con = mysql_connect(DBSERVER, DBUSER, DBPASS);
          mysql_select_db(DBNAME, $con);
          $query  = ("SELECT * FROM `b10_18591250_JC`.`STUDENT`");
          $result = mysql_query($query);
      ?>
      
      <h1 align="center"><font color="black"><b>ATTENDANCE FOR GRADE1</font></b></h1>
      <form action=insertattend.php method=POST>
          <table id="attendance" border="1" cellspacing="1" cellpadding="1">
              <tr>
                  <th>id</th>
                  <th>name</th>
                  <th>surname</th>
                  <th>attendance</th>
              </tr>
      
              <?php while ($row = mysql_fetch_array($result)): ?>
                  <tr>
                      <td><input name=stid[] type=number value="<?= $row['ID'] ?>"</td>
                      <td><input name=stname type=text value="<?= $row['NAME'] ?>"</td>
                      <td><input name=stsurname type=text value="<?= $row['SURNAME'] ?>"</td>
                      <td>
                          <select name=attendance_status[] id=attendance_status>
                              <option value=1>Present</option>
                              <option value=0>Absent</option>
                          </select>
                      </td>
                  </tr>
              <?php endwhile; ?>
      
          </table>
          <input type=submit value=Submit>
      </form>
      
      <?php // insertattend.php
          error_reporting(E_ALL);
          ini_set('display_errors', 1);
      
          require "config.php";
          $con = mysql_connect(DBSERVER, DBUSER, DBPASS);
          mysql_select_db(DBNAME, $con);
      
          $ids    = $_POST["stid"];
          $status = $_POST["attendance_status"];
      
          $sql = "INSERT INTO ATTENDANCE (ID, STUDENT_ID, ATTENDANCE) VALUES";
      
          foreach ($ids as $key => $value) {
              $sql .= "(NULL, '$value', '$status[$key]'),";
          }
      
          $sql = rtrim($sql, ',');
      
          mysql_query($sql) or die (mysql_error());
      ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-31
        • 2013-07-30
        • 1970-01-01
        • 2017-10-26
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        • 2018-07-03
        相关资源
        最近更新 更多