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> </td>
<td> </td>
</tr>
<tr>
<td> </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
一大堆这样的东西根本没有意义。请正确格式化您的代码,这将有助于调试。另外,请使用像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());
}
}
}
更正...
- 修复了 foreach 循环变量名称,不要让您的值和数组名称相同。
- 删除了数组变量,它什么也没做
- 将所有内容都嵌套在 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 />";
}
谢谢大家。
我正在尝试将数据插入到 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> </td>
<td> </td>
</tr>
<tr>
<td> </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
一大堆这样的东西根本没有意义。请正确格式化您的代码,这将有助于调试。另外,请使用像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());
}
}
}
更正...
- 修复了 foreach 循环变量名称,不要让您的值和数组名称相同。
- 删除了数组变量,它什么也没做
- 将所有内容都嵌套在 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 />";
}
谢谢大家。