通过文本框进行PHP更新

时间:2015-11-25 19:42:25

标签: php sql-update

现在更新仅在所有文本框都填写完毕后才有效,因此用户不能仅仅更新productName。没有错误,但如果其他文本框留空,则数据库将使用空白和0进行更新。我希望这可以更新接收输入的任何文本框,无论是一个还是全部,如果没有输入任何内容,则单独保留其余信息。

如果该行的productName是三星,则说明是'手机' wholesalePrice是179.99而我只更新productName文本框我仍然希望描述和wholesalePrice保持不变。现在,如果我只更新productName,那么wholesalePrice显示为0.00,描述为空。我尝试在查询中使用OR语句而不是逗号,而在输入信息的任何文本框中都返回了0。

if(isset($_POST['id'])) {
    try {
        $query = "UPDATE products SET productName = :productName, description = :description, wholesalePrice = :wholesalePrice,
    retailPrice = :retailPrice, category = :category, quantityOnHand = :quantityOnHand
    WHERE productID = :productID";
        $statement = $db->prepare($query);
        $statement->bindValue(':productID', $_POST['id']);
        $statement->bindValue(':productName', $productName);
        $statement->bindValue(':description', $description);
        $statement->bindValue(':wholesalePrice', $wholesalePrice);
        $statement->bindValue(':retailPrice', $retailPrice);
        $statement->bindValue(':category', $category);
        $statement->bindValue(':quantityOnHand', $quantityOnHand);
        $statement->execute();
        $statement->closeCursor();

//reload page after data is entered into the table and display a message if successful for 3 seconds before redirect
        $page = $_SERVER['PHP_SELF'];
        header('Location: ' . $_SERVER["HTTP_REFERER"] );
        exit;

2 个答案:

答案 0 :(得分:3)

如果设置了每个$_POST值,您可以使用列的辅助数组动态绑定值。然后,您可以仅为这些值创建更新查询。

$fields = array('productName', 'description', 'wholesalePrice', 'retailPrice', 'category', 'quantityOnHand');
$values = array();
$binds = array();

foreach($fields as $key => $value) {
    if (isset($_POST[$value])) {
        $values[] = $value.' = :'.$value;
        $binds[':'.$value] = $_POST[$value];
    }
}

if (!empty($values)) {
    $query = "UPDATE products SET ";
    $query .= implode(', ', $values);
    $query .= " WHERE productID = :productID";
    $binds[':productID'] = $_POST['id'];
    $statement = $db->prepare($query);
    $statement->execute($binds);
    $statement->closeCursor();
}

修改

如果您将值存储在变量中,则可以使用变量:

foreach($fields as $key => $value) {
    if (isset($$value)) {
        $values[] = $value.' = :'.$value;
        $binds[':'.$value] = $$value;
    }
}

答案 1 :(得分:0)

您需要将所有现有值传递给表单字段,以便在没有任何更改的情况下将现有数据传递给sql update。在提交时验证数据,然后进行更新。

<textarea name="description">'.$row['description'].'</textarea>

if(isset($_POST['id'])) {
  $productname = $_POST['productname'];
  $description = $_POST['description'];
  // etc ....
  try {
    // sql
  }catch{
    // error
  }
}