【问题标题】:Updating multiple rows in mysql/php from a form从表单更新 mysql/php 中的多行
【发布时间】:2014-02-07 02:29:10
【问题描述】:

我正在尝试从 HTML 表单更新 mysqli 表中的多行。数据似乎是从表单到我的“更新数据库”页面。但它不会进入数据库。

这是表单的相关部分:

for($i=0;$i<$rowcount;$i++)
{
$row = mysqli_fetch_array($result);
echo "<tr>
<td> $row[SubFirstName]  $row[SubLastName] </td>
<td> $row[PerfFirstName]  $row[PerfLastName] </td>
<td style='display:none'><input type='text' class='input' name='PerformerID[]' value=  '$row[PerformerID]' /> Years</td>
<td><input type='text' class='input' size= '5' name='GKYears[]' value= '$row[GKYears]' /> Years</td>
</tr>";
}

以下是将值插入数据库的代码:

for($i=0;$i<$count;$i++)
{
mysqli_query($con, "UPDATE Performers SET
GKYears = '$_POST[GKYears][$i]'
WHERE PerformerID = '$_POST[PerformerID][$i]'");
}

当我对POST 数据执行var_dump 时,一切似乎都在那里。有人可以解释如何解决这个问题,为什么会出错?对于其他页面,我有相同问题的其他更复杂的变体。

【问题讨论】:

  • echo mysqli_error($con); 你会看到语法错误。那些复杂的变量需要像'{$_POST['GKYears'][$i]}' 一样包装成{} 才能在该字符串中正常工作。 但是,备份并read this thoroughly - 您的代码极易受到 SQL 注入的攻击。您需要使用prepared statements in MySQLi 来保护您的代码免受篡改。

标签: php html forms mysqli


【解决方案1】:

结构不好。不要用 CSS 来模拟隐藏的表单域,你甚至不需要隐藏域:

echo <<<EOL
<tr>
   <td>... name stuff ...</td>
   <td>... perf stuff ...</td>
   <td><input type="text" name="GKYears[{$row['PerformerID']}]" value="{$row['GKYears']}" /></td>
</tr>
EOL;

注意 ID 值是如何嵌入到字段名称中的,因此您最终会得到

<input ... name="GKYears[42]" ... />
<input ... name="GKYears[103]" ... />

那么你的 PHP 端的东西就变得简单了:

foreach($_POST['GKYears'] as $rowID => $value) {
    ... update db for record Id $rowID with value $value 
}

除此之外,您的代码很宽泛,只是乞求SQL injection attack

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2014-01-15
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    相关资源
    最近更新 更多