PHP/MySQL 插入数组时出现问题

PHP/MySQL issue inserting array

我正在尝试将数据插入到 MySQL table 中,其中一列正在插入 'Array' 而不是数组值。请问我错过了什么?谢谢。

 id         studentname     title   academicdiscipline  priority 
 012345678  TEST, NAME      Array   Civil                  3
 012345678  TEST, NAME      Array   Civil                  1
 012345678  TEST, NAME      Array   Civil                  4
 012345678  TEST, NAME      Array   Civil                  5
 012345678  TEST, NAME      Array   Civil                  2 

以下是我将数据插入数据库的方法 - 除了 'title' 列外,它工作得很好:

if(isset($_POST['submit'])) { 

$id = $_POST["id"]; 
$studentname = $_POST["studentname"]; 
$title = $_POST["title"]; 
$academicdiscipline = $_POST["academicdiscipline"];
$priority = $_POST["priority"];  

$array = array(); 
foreach ($priority as $priority)  {
    if ($priority >=1) {
        $array[] = "('$id', '$studentname', '$title', '$academicdiscipline', '$priority')"; } 

        $query = "INSERT INTO flux_project_selection (id, studentname, title, academicdiscipline, priority) VALUES" .implode(',', $array); }  
        $retval = mysql_query($query) or die(mysql_error()); } 

编辑:这是表单的 HTML:

        <table width="890" cellspacing="0"> 
        <thead><tr>
            <th></th>

            <th width="250"> Title </th>
            <th width="550"> Description </th>
            <th width"90"> Field </th>
            <th width="50"> Select </th>
           </tr></thead>   
    <?php
            $color1 = "#E9E9E9";    
            $color2 = "#FFFFFF"; 
            $row_count = 0; 

            echo "<tr>
            <td valign = \"top\" bgcolor=\"$row_color\">
                <input type=\"hidden\" name=\"id[]\" value=\"$id\">
                <input type=\"hidden\" name=\"studentname[]\" value=\"$studentname\"></td> 

            <td valign = \"top\" bgcolor=\"$row_color\">
                <input type=\"hidden\" name=\"title[]\" value=\"$title\"> $title </td>  

            <td valign = \"top\" bgcolor=\"$row_color\">
                <input type=\"hidden\" name=\"description[]\" value=\"$description\"> $description </td> 

            <td valign = \"top\" bgcolor=\"$row_color\"> 
                <input type=\"hidden\" name=\"academicdiscipline[]\" value=\"$academicdiscipline\"> $academicdiscipline </td>

            <td valign = \"top\" bgcolor=\"$row_color\"> 
            <select name=\"priority[]\" class=\"priority\">
                          <option>  </option>
                          <option value=\"1\"> 1 </option>
                          <option value=\"2\"> 2 </option>
                          <option value=\"3\"> 3 </option> 
                          <option value=\"4\"> 4 </option>
                          <option value=\"5\"> 5 </option>
                          <option value=\"6\"> 6 </option>
                          <option value=\"7\"> 7 </option>
                          <option value=\"8\"> 8 </option>
                          <option value=\"9\"> 9 </option>
                          <option value=\"10\"> 10 </option>
                        </select>   

         </td></tr>
         <tr bgcolor=\"#ffffff\"> </tr>
         <tr bgcolor=\"#902C2E\"> </tr>"; 

      $row_count++;  

 echo"<tr>
  <td>&nbsp;</td>
  <td>&nbsp;</td>
</tr>
<tr>
  <td>&nbsp;</td>
  <td ><input name=\"reset\" type=\"reset\" value=\"Clear selection\"/> 
       <input name=\"submit\" type=\"submit\" value=\"Submit selection\"/>  
</tr></table>";  
?>

编辑:先试试这个。

我不确定为什么你的大部分值都有效,但我会从除优先级之外的所有输入名称中删除 []。

这些也是一些有用的想法

您的 if ($priority >=1) { 似乎也应该包装查询,否则如果选择了第一个空选项,这可能会产生错误,因为 $array 中没有任何内容。

我不太确定 $array[] 的目的是什么,如果您尝试将 "('$id', '$studentname', '$title', '$academicdiscipline', '$priority')" 包装在 mysql_real_escape_string 中,这绝对不会给您想要的结果。

首先,我什至不确定 foreach ($priority as $priority) 是否有效。我 运行 进行了测试,结果确实如此,但这会让您或将来查看代码的任何其他人感到困惑。我鼓励您以不同的方式命名您的变量,例如 foreach ($priorities as $priority)

通常我会尽量回答你的问题,但我觉得你应该看看这个方法。

编辑:如果优先级是唯一具有多个值的输入,则使用此选项

priorities = $_POST['priority'];
foreach($priorities as $priority){
    if($priority > 0)
    {
       $query = "
          INSERT INTO flux_project_selection 
          (
              id, studentname, title, academicdiscipline, priority
          ) 
          VALUES
          (
               " . mysql_real_escape_string($id) . ",
               '" . mysql_real_escape_string($studentname) . "',
               '" . mysql_real_escape_string($title) . "',
               '" . mysql_real_escape_string($academicdiscipline) . "',
               " . mysql_real_escape_string($priority) . "
          )";
       $retval = mysql_query($query) or die(mysql_error());
    }
}

编辑:已编辑下面是一个示例,说明如果每个输入都有多个,如输入名称后包含的 [] 所示,您将如何循环输入。 <input type=\"hidden\" name=\"id[]\" value=\"$id\">

for($i = 0; $i < count($_POST['id']); $i++) {
    if($priority > 0)
    {
       $query = "
          INSERT INTO flux_project_selection 
          (
              id, studentname, title, academicdiscipline, priority
          ) 
          VALUES
          (
               " . mysql_real_escape_string($_POST['id'][i]) . ",
               '" . mysql_real_escape_string($_POST['studentname'][i]) . "',
               '" . mysql_real_escape_string($_POST['title'][i]) . "',
               '" . mysql_real_escape_string($_POST['academicdiscipline'][i]) . "',
               " . mysql_real_escape_string($_POST['priority'][i]) . "
          )";
       $retval = mysql_query($query) or die(mysql_error());
    }
}

您还应该考虑使用 mysqli 而不是 mysql。更安全。

MySQL vs MySQLi when using PHP

此方法将最大限度地减少对代码的更改。更好的技术是使用准备好的语句来防止注入,但这需要 mysqli 或 PDO

mysql我: http://php.net/manual/en/mysqli.prepare.php

PDO:http://php.net/manual/en/pdo.prepare.php

一大堆这样的东西根本没有意义。请正确格式化您的代码,这将有助于调试。另外,请使用像PDO这样的库。它将使对这些类型的事物进行编程变得更容易、更快和更安全。

我会尽力挽救这段代码的一部分。 请注意代码不安全,不能防止 MYSQL 注入。

这里是实现,稍后我会解释我的推理...

if (isset($_POST['submit'])) { 
    $id = $_POST["id"]; 
    $studentname = $_POST["studentname"]; 
    $title = $_POST["title"]; 
    $academicdiscipline = $_POST["academicdiscipline"];
    $priority = $_POST["priority"];  

    foreach ($priority as $single)  {
        if ($single >=1) {
            $values = "('$id', '$studentname', '$title', '$academicdiscipline', '$single')";

            $query = "INSERT INTO flux_project_selection (id, studentname, title, academicdiscipline, priority) VALUES " . $values;
            $retval = mysql_query($query) or die(mysql_error());
        }
    }
}

更正...

  1. 修复了 foreach 循环变量名称,不要让您的值和数组名称相同。
  2. 删除了数组变量,它什么也没做
  3. 将所有内容都嵌套在 if 中,因此现在对于每个选定的优先级,脚本将向具有该优先级的数据库中插入一行。

我不确定这是否是您希望程序执行的操作,请告诉我。

终于明白了:

if(isset($_POST['submit']) && !empty($_POST['submit'])) {
$ids = $_POST['id']; 
$names = $_POST['studentname']; 
$titles = $_POST['title'];  
$disciplines = $_POST['academicdiscipline']; 
$priorities = $_POST['priority']; 

                foreach($priorities as $key => $priority) { 
                    if ($priority > 0) { 

                    $query = "INSERT INTO flux_project_selection (id, studentname, title, academicdiscipline, priority) 
                                VALUES ( " . mysql_real_escape_string($ids[$key]) . ",
                                        '" . mysql_real_escape_string($names[$key]) . "',
                                        '" . mysql_real_escape_string($titles[$key]) . "',
                                        '" . mysql_real_escape_string($disciplines[$key]) . "',
                                        " . mysql_real_escape_string($priority) . "  )";

                    $retval = mysql_query($query) or die(mysql_error()); 
                        } 
                    } 

                    echo "Worked. <br />"; 
        } 

谢谢大家。