【问题标题】:Update MySQL-database with array values使用数组值更新 MySQL 数据库
【发布时间】:2014-11-09 02:32:59
【问题描述】:

如何使用数组中的值更新数据库?例如,假设我们有一个包含三个表的数据库:

膳食: mealnr(PK)、名称、排序

成分:成分(PK)、名称、库存

结构:mealnr(FK)、配料nr(FK)、量

我用一些食物和配料填充了数据库。每顿饭都由多种成分组成。厨师决定您只需要 75g 的成分 x 而不是 100g 的膳食 y,因此需要在数据库中进行更改。当然可以使用 SQL 命令来完成,但我想使用 PHP 中的表单来完成。

首先,我创建了一个显示所有餐点的页面。一顿饭可以使用旁边的编辑按钮进行编辑,并且根据餐食,您可以更改该特定餐食的一种或多种成分的数量。在编辑页面上,所有成分名称和数量都显示在表格中。金额字段是文本字段,可以编辑。

我编写了这个脚本,但我不知道如何使用数组的值更新我的数据库。我用foreach循环尝试过,但它不起作用..还没有。有人可以帮帮我吗?

<?php
$conn = mysql_connect('localhost',  'root', '');
mysql_select_db("eatit", $conn);

$id = $_REQUEST['mealnr'];

$result = mysql_query("SELECT meals.name AS mealname, structure.amount, ingredients.name AS     ingredientname
FROM Meals, Structure, Ingredients 
WHERE meals.mealnr = structure.mealnr
AND structure.ingredientnr = ingredients.ingredientnr
AND meals.mealnr = '$id'");

if(isset($_POST['save']))
{   
 $new_amount = $_POST['amount[]'];
 foreach ($new_amount as $value) {
 mysql_query("UPDATE structure SET amount ='$value', WHERE mealnr = '$id'")
            or die(mysql_error());
    }
 }
 mysql_close($conn);
 ?>

 <p><strong>Ingredients:</strong></p>
<?php
echo "<table>";
echo "<tr>";
echo "<th>Ingredient</th>";
echo "<th>Amount (gr)</th>";
echo "</tr>";
while($ingredient = mysql_fetch_array($result))
{
echo "<tr>";
echo "<td>";
echo $ingredient['ingredientname'];
echo "</td>";
echo "<td>";
echo '<input type="text" formmethod="post" name ="amount[]" value="' . $ingredient['amount'] . '"    />';
echo "</td>";
echo "</tr>";
}
?>

<input type="submit" name="save" value="save" />

【问题讨论】:

  • 嗯,你应该做的第一件事就是停止尝试使用 mysql_ 作为它的弃用...你应该切换到 mysqli_ 或 PDO 并查看参数化它们,因为选择/更新带有变量的表(将来可能是用户输入)会使您容易受到 sql 注入(它总是最好在生产环境中练习正确的方法。
  • html 表单名称 name="amount[]"!=$_POST['amount[]']。应该只是$_POST['amount']

标签: php mysql arrays


【解决方案1】:

在您的 HTML 标记中,您已使用 amount[] 将名称为 amount 的元素声明为数组。

因此,在您接收数据的 php 代码中,仅以这种方式引用金额就足够了:

$new_amount = $_POST['amount'];

代替:

$new_amount = $_POST['amount[]']; // in fact, this is wrong

您的 foreach 没问题,您应该添加一些检查,以便 $value 实际上包含您期望的值,例如 int、float 或不小于零(或任何您认为必要的检查)。

foreach($new_amount as $value){
    if($value != '' && $value >= 1){
        //sql statements goes here.
        }
    }

以这种方式接收表单数据,然后直接将结果注入到您的 SQL 语句中总是很危险的:

$id = $_REQUEST['mealnr'];

如果您在将代码直接注入 SQL 语句之前声明您期望一个整数(作为 id 的 应该是),那么您已经编写了更安全的代码。

$id = (int)$_REQUEST['mealnr'];

另外,仅作记录 - 不推荐使用 mysql_* 库。正如 cmets 中所指出的,请尝试改用 PDO 或 mysqli - 真的!

【讨论】:

    猜你喜欢
    • 2012-07-22
    • 2018-08-20
    • 2014-10-21
    • 2014-04-04
    • 1970-01-01
    • 2012-03-22
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多