【问题标题】:php update certain fields to databasephp 将某些字段更新到数据库
【发布时间】:2014-11-04 12:48:09
【问题描述】:

我正在尝试开发一个库存系统,用户可以在该系统中查看他们的库存并使用仅由用户输入的值更新数量,其余部分从数据库中保持不变。但它不起作用,请帮我找出我做错的地方。它将回显成功消息,但数据库未更新。

<form name="form" method="post">
<table width="70%" border="5" align="center"><tr>
<th scope="row">SKU</th>
<th scope="row">Item Description</th>
<th scope="row">Current Qunatity</th>
<th scope="row">Update Quantity</th>
<th scope="row">Unit Price</th>
</tr>
<tr>
<th scope="row">
<?php
include('connect.php');
$result = mysqli_query("SELECT * FROM products") 
        or die(mysqli_error());

while($row = mysqli_fetch_array( $result )) {
    echo "<tr>";
    echo '<td><a name="sku[]">'.$row['sku_id'].'</a></td>';
    echo '<td>'.$row['description'].'</td>';
    echo '<td>'.$row['quantity'].'</td>';
    echo '<td><input name="qty[]" /></td>';
    echo '<td>'.$row['unit_price'].'</td>';
    echo "</tr>"; 
    }
?>
</table>
<input style="float:right" name="update" type="submit" id="update" value="Update"/>
</form>
<?php

if(isset($_POST['update']))
{
    $qty = $_POST['qty'];
    $sku = $_POST['sku'];
    foreach($qty as $key => $value) 
    {
        if(empty($value))
        {
            continue;
        }
        else
        {
            $sql = "UPDATE products SET quantity ='".$value."' WHERE sku_id = '".$sku[$key]."'";
            mysql_query($sql);
        }
    }   
    $retval = mysqli_query($sql);
    if(! $retval)
    {
        die('Could not update data: '. mysql_error());
    }
    echo 'Update data successfully!';
}
?>

【问题讨论】:

  • 这样的事情很容易通过简单的错误输出来避免
  • @Joseph 与您的问题无关,但您为什么不使用 PDO - 建议不要使用 sql 注入。 mysql_query 已弃用
  • 感谢推荐!我会找出 PDO 究竟是如何工作的!

标签: php html mysql


【解决方案1】:

你在这里使用mysql_query

$sql = "UPDATE products SET quantity ='".$value."' WHERE sku_id = '".$sku[$key]."'";
mysql_query($sql);

而不是mysqli_query

$sql = "UPDATE products SET quantity ='".$value."' WHERE sku_id = '".$sku[$key]."'";
mysqli_query($sql);

此外,您在这里也使用了mysql_error

die('Could not update data: '. mysql_error());

附:不要忘记转义您在数据库查询中使用的任何用户输入!虽然理想情况下你应该使用类似 PDO 或 MySQLi 的预处理语句

【讨论】:

  • 嗯,它仍然无法正常工作。实际上我之前确实有这种错字,页面甚至不会显示并且有 500 错误消息。这可能不是主要问题?
【解决方案2】:

这应该是你的完整答案(使用 mysqli 更新):

<form name="form" method="post">
<table width="70%" border="5" align="center">
<tr>
<th scope="row">SKU</th>
<th scope="row">Item Description</th>
<th scope="row">Quantity</th>
<th scope="row">Unit Price</th>
</tr>
<?php
include('connect.php');
$result = mysqli_query("SELECT * FROM products") 
        or die(mysqli_error());

while($row = mysqli_fetch_array( $result )) {
    echo "<tr>";
    echo '<td>'.htmlspecialchars($row['sku_id']).'</td>';
    echo '<td>'.htmlspecialchars($row['description']).'</td>';
    echo '<td><input name="qty['.htmlspecialchars($row['sku_id']).']" value="'.htmlspecialchars($row['quantity']).'"/></td>';
    echo '<td><input name="price['.htmlspecialchars($row['sku_id']).']" value="'.htmlspecialchars($row['unit_price']).'"/></td>';
    echo "</tr>"; 
    }
?>
</table>
<input style="float:right" name="update" type="submit" id="update" value="Update"/>
</form>
<?php

if(isset($_POST['update']))
{
    $qty = $_POST['qty'];
    $price = $_POST['price'];
    $stmt =  $mysqli->stmt_init(); // <- mysqli class way of doing this
    $stmt->prepare("UPDATE products SET quantity = ?, unit_price = ? WHERE sku_id = ?");
    foreach($qty as $key => $value) 
    {
        $data = array($qty[$key], $price[$key], $key);
        $stmt->execute($sql, $data);
    }
    echo 'Update data successfully!';
}
?>

出于测试目的,post 的处理可以更改为:

if(isset($_POST['update']))
{
    $qty = $_POST['qty'];
    $price = $_POST['price'];
    //$stmt =  $mysqli->stmt_init(); // <- mysqli class way of doing this
    //$stmt->prepare("UPDATE products SET quantity = ?, unit_price = ? WHERE sku_id = ?");
    foreach($qty as $key => $value) 
    {
        echo "UPDATE products SET quantity = ".$qty[$key].", unit_price = ".$price[$key]." WHERE sku_id = " . $key . "<br/>\n";
        //$data = array($qty[$key], $price[$key], $key);
        //$stmt->execute($sql, $data);
    }
    echo 'Update data successfully!';
}

【讨论】:

  • 我只是把它放在服务器上但它显示500内部错误..它与$sql = "UPDATE products SET quantity = ?, unit_price = ? WHERE sku_id = ?";有关吗?
  • 我在 htmlspecialchars() 中添加以避免代码注入。如果您的产品有如下描述: 也可以查看stackoverflow.com/questions/14011899/…
  • 这可能与我修改的新mysqli代码有关
  • 好的 500 错误部分已修复,但在我点击更新后它显示内部服务器错误...
  • 好的...我已经尝试过测试,它实际上返回了我想要的确切查询。这很奇怪。如果我能修复它,我会尝试
【解决方案3】:

如果您执行 var_dump($_POST);你会看到你的输入没有值。

您需要在表单上指定值。

不过,我更愿意这样做:

echo '<input name="sku['.$row['sku_id'].']" value="'.$row['quantity'].'" />';

然后就可以循环$_POST['sku'],将Key作为sku_id,Value作为新的值(数量),进行更新

【讨论】:

  • 所以修改我的代码的方法是更改​​为echo '&lt;td&gt;&lt;input name="sku['.$row['sku_id'].']" value="'.$row['quantity'].'" /&gt;&lt;/td&gt;'; 而不是echo '&lt;td&gt;&lt;input name="qty[]" /&gt;&lt;/td&gt;'; 并从echo '&lt;td&gt;&lt;a name="sku[]"&gt;'.$row['sku_id'].'&lt;/a&gt;&lt;/td&gt;'; 中删除a 标签对吗?只是确保
  • 是的。如果您执行 $_POST 的 var_dump,您将看到表单中的数据并更好地了解需要什么。例如$_POST['sku']['prod12']=12 这种方式也默认为当前数量,否则你的数量全部为0,清空你的库存。
  • 只是另一个简单的问题。我是否还必须在更新后修改 php that action?我只删除了$qty = $_POST['qty']; 并尝试了,但似乎仍然没有获得价值,所以我想知道。抱歉,如果我问的是愚蠢的问题,但我仍在学习。谢谢!!
猜你喜欢
  • 2014-08-09
  • 1970-01-01
  • 2016-03-07
  • 2014-08-19
  • 1970-01-01
  • 2012-04-29
  • 2023-04-09
  • 2016-12-19
  • 2015-12-26
相关资源
最近更新 更多