【问题标题】:Update multiple MySQL table rows using one HTML form使用一个 HTML 表单更新多个 MySQL 表行
【发布时间】:2016-02-01 20:31:05
【问题描述】:

我在 PHP 中使用 HTML 表单来尝试同时更新我的​​ MySQL 表中的多行。 PHP 似乎在运行(有点),但在所有受影响的列中用“数组”更新了我的表。有人可以填补我的代码中的空白或解释我错过了什么吗?!

附:我知道我需要逃避我的 PHP 以防止注入攻击......稍后会出现:)

HTML 和 PHP 代码如下。

PHP echo 语句中的 HTML 表单

<form action='edit.php' method='POST' id='scheduler'>

<input type='hidden' id='identifier' name='identifier[]' value='".  $row['id'] . "'>
<input type='hidden' id='assoc_to_username' name='assoc_to_username' value='" .     $schedule['assoc_to_username'] . "'>

<input id='assoc_to_date' name='assoc_to_date[]' type='text' value='" .     $schedule['assoc_to_date'] . "'/>

<select name='assoc_to_start_time[]' id='assoc_to_start_time'>
<option selected disabled='disabled' value='" . $schedule['assoc_to_start_time'] . "'>" . $schedule['assoc_to_start_time'] . "</option>
<option disabled='disabled'>----------</option>
<option value='All day'>All day</option>
</select>

<select name='assoc_to_end_time[]' id='assoc_to_end_time'>
<option selected disabled='disabled' value='" . $schedule['assoc_to_end_time'] . "'>" . $schedule['assoc_to_end_time'] . "</option>
<option disabled='disabled'>----------</option>
<option value=''>No end time</option>
<option value=''>All day</option>
</select>

<input id='taskname' name='taskname[]' type='text' value='" . $schedule['taskname'] . "'/>

<input id='submit' name='submit' class='submit' type='submit' value='Edit' type='submit' />

</form>

PHP进程代码

require_once('../inc/database-config.php');

$id1 = $_POST['identifier'];

$assoc_to_username = $_POST['assoc_to_username'];

$assoc_to_date = $_POST['assoc_to_date'];
$assoc_to_start_time = $_POST['assoc_to_start_time'];
$assoc_to_end_time = $_POST['assoc_to_end_time'];
$taskname = $_POST['taskname'];

foreach ($_POST['identifier'] as $id1)

{
    $sql=mysql_query("UPDATE schedule SET assoc_to_date= $assoc_to_date, assoc_to_start_time= $assoc_to_start_time, assoc_to_end_time= $assoc_to_end_time, taskname=$taskname WHERE assoc_to_username=$assoc_to_username");

header("Location: ../admin.php?action=edited"); 
;}


if (!mysql_query($sql,$dbcon))

{   die (header("Location: ../error.php"));   }

mysql_close($dbcon);

请帮忙!

【问题讨论】:

  • 您要更新哪些多行或要保存哪些多个值。?
  • 从每个输入的名称属性中删除所有[]

标签: php html mysql sql arrays


【解决方案1】:

我认为问题出在 foreach 块中...其他 POST var 也是数组,您如何直接使用它们?像这样改变你的循环并尝试:

for($i =0;$i <count($_POST['identifier']);$i++)
{
    $sql=mysql_query("UPDATE schedule SET assoc_to_date= ".$assoc_to_date[$i].", assoc_to_start_time= ".$assoc_to_start_time[$i].", assoc_to_end_time= ".$assoc_to_end_time[$i].", taskname=".$taskname[$i]." WHERE assoc_to_username=".$assoc_to_username[$i].";");
    if (!mysql_query($sql,$dbcon)){
        die (header("Location: ../error.php")); 
    }
}

还将 [] 添加到 name='assoc_to_username[]' 输入字段。

【讨论】:

  • 它揭示了我在更新多列和多行时遇到的问题......比你 Adarsh
【解决方案2】:

通过在输入名称上使用方括号 [],PHP 会尝试获取具有相同名称的多个输入,即使您有一个具有该名称的字段(您这样做),PHP 仍会将该信息存储为一个元素的数组。从您的名称属性中删除方括号,您应该一切顺利。

【讨论】:

  • 我从我的名称属性中删除了方括号,现在收到错误消息“警告:在第 13 行的 /home/xxx/public_html/process/edit.php 中为 foreach() 提供的参数无效”。有什么想法吗?
  • 您不能对变量运行 foreach,该函数适用于您不再使用的数组。只需从代码中删除 foreach。
  • 在您的问题中您说您正在尝试升级数据库中的多个 ROWS?您的页面上是否有多个具有相同信息的表单?当您提交您提供的表单时,您只是提交该表单,该页面上的任何其他信息都不会通过 PHP 发布,我认为您正在尝试获取页面上的所有信息,而实际上您只是在表单中发布您提交的信息。
  • 您的最后一个 cmets 是正确的 - 删除 foreach 允许我成功更新数据库中的所有行,但其值与该表的第 1 行中输入的值相同。我需要确保使用第 1 行的表单数据更新第 1 行,使用第 2 行的表单数据更新第 2 行等。编辑:我还使用 PHP while 语句围绕 HTML 表单将数据库中的每一行显示为一行HTML 表格。
  • 那行不通,如果您想要页面上的所有信息可用,您需要提交一份表格,目前您有无数表格。 **当您提交表格时,您只提交了该表格中的信息。
【解决方案3】:

首先,尝试更正您的查询,以便传递变量:

$sql=mysql_query("UPDATE schedule SET assoc_to_date= ".$assoc_to_date.", assoc_to_start_time=".$assoc_to_start_time.", assoc_to_end_time= ".$assoc_to_end_time.", taskname=".$taskname." WHERE assoc_to_username=".$assoc_to_username."");

【讨论】:

  • 你可能被否决了,因为那不是答案。在 PHP 中,您不必从字符串中转义即可输出变量。尝试按照 OPs 帖子编写带有变量的字符串,您会看到行为。
猜你喜欢
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多