【问题标题】:Updating multiple columns - SQL & PHP更新多列 - SQL 和 PHP
【发布时间】:2018-11-29 20:05:44
【问题描述】:

假设我有 1 个名为 tblrooms 的表,列是

id roomnamecapacity

并且有 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}");
}

【问题讨论】:

  • 使用准备好的语句来防止 SQL 注入。
  • 如果它在核心 php 中,创建一个函数并调用要更新它的函数。
  • 有什么问题?您将返回三个记录,每个记录包含三个字段。您打算如何处理每三个记录的这三个字段?现在,您只需为id 创建三个文本框,一个接一个。
  • @VamsiKrishna 我不明白你的意思 :( 我是新手顺便说一句 huhu
  • @GordonM 但它是用户输入,可以很容易地更改。

标签: php html mysql sql loops


【解决方案1】:

阅读 MySQL 的 UPDATE 命令的语法。 https://dev.mysql.com/doc/refman/8.0/en/update.html

您可以使用 UPDATE 在一个语句中更新任意数量的列。

【讨论】:

  • 是的,但我认为 OP 将“列”的术语误认为“行” - 如果您更仔细地查看问题,问题在于循环 POST 变量并多次运行 UPDATE不同的行有不同的值
  • 是的,真的很难知道他在想什么。将他指向文档永远不会伤害...
  • 我认为你应该尽你所能去学习。了解 PHP 如何处理输入。了解 PHP 中的数据库驱动程序如何将查询和参数传递给数据库。学习基本的 SQL。一旦你掌握了这些技能,这项任务对你来说就不是问题了。
【解决方案2】:

这个有几个问题:

1) for 中的代码 $i &lt; isset($_POST['text_id']) 完全没有意义。 isset 返回真或假,而不是数字(要知道这一点,您只需查看文档:http://php.net/manual/en/function.isset.php)。所以你的循环永远不会工作 - 比较例如1falsetrue 看哪个更小或更大是没有意义的。

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(数组键函数)

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 = 1id = 2 等。挑战在于编写将构建该查询的 PHP,并根据表单中提交的内容绑定正确数量的参数!仔细想想也不算难。而且您的代码会更有效率,因为它总是只运行一个 UPDATE 查询,而不是几个。

【讨论】:

  • 这个答案更适合,因为它实际上概述了问题并提供可行的建议,并包含使用准备好的语句的示例代码。
猜你喜欢
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
相关资源
最近更新 更多