假设我有1个以tblrooms
命名的表,并且这些列是
id
roomname
capacity
有3个数据,在我的html代码中,有一个while循环来获取3个数据。然后,文本框将成为while循环的三次原因。但是我正在尝试在我的PHP代码中使用for循环更新多个数据,请帮助我解决这个问题。我想使用for循环更新文本框内的ID。并且请让我知道如何使用数组声明变量。
代码如下:
<form action="sample_server.php" method="post">
<?php
$db = mysqli_connect("localhost", "root", "", "psbr");
$rooms = mysqly_query($db, "SELECT * FROM tblrooms");
while($row = mysqli_fetch_array($rooms)) { ?>
<input type="text" name="text_id<?php echo $row['id']; ?>" value = "<?php echo $row['id'];" ?>
<?php } ?>
<input type="submit" name="submit">
</form>
sample_server.php
for ($i=1; $i < isset($_POST['text_id']); $i++) {
$sql = mysqli_query($db, "UPDATE tblrooms SET capacity = capacity - 1 where id = {$i}");
}
答案 0 :(得分:1)
阅读MySQL的UPDATE命令的语法。 https://dev.mysql.com/doc/refman/8.0/en/update.html
您可以使用UPDATE在一条语句中更新任意多的列。
答案 1 :(得分:1)
与此相关的几个问题:
1)$i < isset($_POST['text_id'])
中的代码for
毫无意义。 isset返回true或false,而不是数字(要知道,您只需查看文档http://php.net/manual/en/function.isset.php)。因此,您的循环永远无法正常工作-例如1
至false
或true
来查看哪个值更大或更小是没有意义的。
2)您没有任何名为“ text_id”的$_POST
变量,因此$_POST['text_id']
将为空。您有“ text_id1”,“ text_id2”等,但没有一个叫做“ text_id”。您需要获取所有以 “ text_id”开头的$ _POST变量,并循环遍历它们,以从中获取值。
3)在for循环中使用$i
作为查询的参数是不正确的。不能保证您提交的文本框以ID 1开始,甚至不能以相同的顺序排列。您需要改用文本框中的实际值。
这里应该起作用:
//loop through all the names of the POST variables
foreach (array_keys($_POST) as $key)
{
//use a Regular Expression to check whether the current field is one of the "text_id" fields
if (preg_match("/text_id(\d+)/", $key, $matches)
{
//here we will use prepared statements and parameters to write the query safely, without being vulnerable to SQL injection attacks.
//first prepare the statement. ? indicates a space to be filled with a bound parameter
$stmt = mysqli_prepare($db, "UPDATE tblrooms SET capacity = capacity - 1 where id = ?");
//bind the parameter safely. $_POST[$key] will refer to the _value_ of the POST field we're currently looping over. In other words this will be the content of the textbox.
mysqli_stmt_bind_param($stmt, "i", $_POST[$key]);
//now execute the prepared query
mysqli_stmt_execute($stmt);
}
}
这里有一些有关我上面使用过的功能和代码结构的文档,以防您以前没有遇到过:
http://php.net/manual/en/control-structures.foreach.php(foreach循环)
http://php.net/manual/en/function.array-keys.php(array_keys函数)
http://php.net/manual/en/function.preg-match.php(正则表达式匹配功能)
https://www.regular-expressions.info/quickstart.html(正则表达式通用指南)
http://bobby-tables.com/php(使用准备好的语句和参数在PHP中安全编写SQL查询的指南)
掌握了这一点之后,面临一个额外的挑战,请找出如何仅执行一个查询就可以执行相同操作的方法-由于您对每个ID都执行相同的操作,因此可以使用SQL IN
子句来命名同一查询中的所有ID,即在不同查询中使用id IN (1,2,3)
代替id = 1
,id = 2
等。挑战在于编写将构建查询的PHP,并根据表单中提交的内容绑定正确数量的参数!如果仔细考虑,这并不难。您的代码将更加高效,因为它将始终只运行一个UPDATE查询,而不是多个。