我几天来一直在努力解决这个问题。我已经搜索了如何更新表,并设法获得更新行,但只有表中的最后一行。所以现在我想要一个循环遍历所有输入并用输入的值更新数据库。我认为需要纠正的代码位于代码末尾附近
我想做什么:
以下是网页视图中表格的图片:
<?php
//Connect to database
include '../db/connect.php';
?>
<form action='test7.php' method="post">
<table border='1'>
<?php
$result = $MySQLi_CON->query("SELECT * FROM users");
echo "<tr>";
echo "<td colspan='3'>CLASS 1</td>";
echo "</tr>";
//All table rows in database presented in html table
while($row = $result->fetch_array()){
echo "<tr>";
echo "<td><input type='hidden' name='user_id[]' value='".$row['user_id']."' /></td>";
echo "<td>username :<input type='text' name='username[]' value='".$row['username']."' /></td>";
echo "<td>email :<input type='text' name='email[]' value='".$row['email']."' /></td>";
echo "<td>rank :<input type='number' name='rank[]' value='".$row['rank']."' /></td>";
echo "</tr>";
}
echo "<input type='submit' name='update' value='UPDATE' />";
?>
<table>
</form>
<?php
if(isset($_POST['update'])){
$total = count($_POST['rank']);
$user_id_arr = $_POST['user_id'];
$rank_arr = $_POST['rank'];
for($i = 0; $i < $total; $i++){
$user_id = $user_id_arr[$i];
$rank = $rank_arr[$i];
$query = "UPDATE users SET `rank`= '".$rank."' WHERE `user_id`= '".$user_id."'";
$MySQLi_CON->query($query);
header('Location: test7.php');
}
}
?>
当我按下UPDATE按钮时,我得到PHP Notice: Array to string conversion in...
。
它指的是这一行的第30行:
$query = "UPDATE user SET rank=$_POST[rank][$row] WHERE user_id=$value ";
编辑:编辑上面的代码到工作代码。谢谢@Frayne Konok的帮助。
答案 0 :(得分:3)
你非常接近。
问题是在此代码中$_POST[rank][$row]
- rank是未定义的常量。你需要它是一个字符串,就像$_POST['rank'][$row]
一样。另外,直接从查询中提取$POST
变量以允许类型转换 - 当您看到直接有$_POST
数据的查询时,您应该总是非常不舒服:
if(isset($_POST['update'])){
foreach ($result as $row => $value) {
// typecast to a number with decimals below. If you only need integers, than use (int)
$rank = (float)$_POST['rank'][$row];
$query = "UPDATE user SET rank={$rank} WHERE user_id={$value}";
$MySQLi_CON->query($query);
}
}
但是,最好使用mysqli预处理语句而不是直接插入变量 - 因为它代表上述代码容易受到SQL注入攻击。
您的代码应该被修改为看起来像这样以防止SQL注入攻击:
if(isset($_POST['update'])) {
$stmt = $MySQLi_CON->prepare("UPDATE user SET rank= ? WHERE user_id= ?");
foreach ($result as $row => $value){
$stmt->bind_param('di', $_POST['rank'][$row], $value);
$stmt->execute();
}
$stmt->close();
}
答案 1 :(得分:1)
你在这里犯了一个很大的错误,为什么你在foreach中使用
$result
环?? FRom$result
来了吗?$result
是资源sql
查询。
试试这个:
if(isset($_POST['update'])){
$total = count($_POST['rank']);
$user_id_arr = $_POST['user_id'];
$rank_arr = $_POST['rank'];
for($i = 0; $i < $total; $i++){
$user_id = $user_id_arr[$i];
$rank = $rank_arr[$i];
$query = "UPDATE users SET `rank`= '".$rank."' WHERE `user_id`= '".$user_id."'";
$MySQLi_CON->query($query);
}
}
试试这个并告诉我是否有任何问题。