【问题标题】:Update Database Form: leaves image fields blank when no file is selected更新数据库表单:未选择文件时将图像字段留空
【发布时间】:2013-07-22 07:42:40
【问题描述】:

我正在创建一个内容管理系统,以便可以轻松更新数据库。我创建了一个更新页面,允许用户编辑数据库中的条目,他们可以上传新图像并编辑任何字段而不会出现任何问题。 我遇到的问题是,如果您只想编辑,只说一个字段中的文本,但您不想更改图像,则在提交表单时,它会用空白条目覆盖图像字段。 如果没有选择其他文件,我想要做的是保留原始图像。 我知道我需要检查是否已选择文件,但我似乎找不到可行的方法。我敢肯定这可能很简单,但这是我上传的脚本:

     $editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
/* upload image script */

$thumb=basename($_FILES['thumb']['name']);
if(move_uploaded_file($_FILES['thumb']['tmp_name'],"../shopImages/".$thumb))

$image1=basename($_FILES['image_1']['name']);
if(move_uploaded_file($_FILES['image_1']['tmp_name'],"../shopImages/".$image1))

$image2=basename($_FILES['image_2']['name']);
if(move_uploaded_file($_FILES['image_2']['tmp_name'],"../shopImages/".$image2))

/*end of script*/
$editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}


if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "form1")) {
 $updateSQL = sprintf("UPDATE tbl_products SET thumb=%s, image_1=%s, image_2=%s, title=%s, `desc`=%s, category_id=%s, status=%s, shipping_band=%s, price=%s WHERE product_id=%s",
                   GetSQLValueString($thumb, "text"),
                   GetSQLValueString($image1, "text"),
                   GetSQLValueString($image2, "text"),
                   GetSQLValueString($_POST['title'], "text"),
                   GetSQLValueString($_POST['desc'], "text"),
                   GetSQLValueString($_POST['category_id'], "int"),
                   GetSQLValueString($_POST['status'], "int"),
                   GetSQLValueString($_POST['shipping_band'], "text"),
                   GetSQLValueString($_POST['price'], "double"),
                   GetSQLValueString($_POST['product_id'], "int"));

这是表单的代码:

<form method="post" name="form1" action="<?php echo $editFormAction; ?>" enctype="multipart/form-data">
  <table align="center">
    <tr valign="baseline">
       <td nowrap align="right">Product ID:</td>
      <td>

    <?php echo $row_RS_updateProducts['product_id']?>

  </td>
<tr>
<tr valign="baseline">
  <td nowrap align="right">Thumb:</td>
  <td><?php echo $row_RS_updateProducts['thumb']?><input type="file" name="thumb" value="<?php echo $row_RS_updateProducts['thumb']?>" size="32"></td>

</tr>
<tr valign="baseline">
  <td nowrap align="right">Image 1:</td>
  <td><?php echo $row_RS_updateProducts['image_1']?><input type="file" name="image_1" value="<?php echo $row_RS_updateProducts['image_1']?>" size="32"></td>
</tr>
<tr valign="baseline">
  <td nowrap align="right">Image 2:</td>
  <td><?php echo $row_RS_updateProducts['image_2']?><input type="file" name="image_2" value="<?php echo $row_RS_updateProducts['image_2']?>" size="32"></td>
</tr>
<tr valign="baseline">
  <td nowrap align="right">Title:</td>
  <td><input type="text" name="title" value="<?php echo htmlentities($row_RS_updateProducts['title'], ENT_COMPAT, 'UTF-8'); ?>" size="32"></td>
</tr>
<tr valign="baseline">
  <td nowrap align="right">Description:</td>
  <td><input type="text" name="desc" value="<?php echo htmlentities($row_RS_updateProducts['desc'], ENT_COMPAT, 'UTF-8'); ?>" size="32"></td>
</tr>
<tr valign="baseline">
  <td nowrap align="right">Category:</td>
  <td><select name="category_id">
    <?php 
do {  
?>
    <option value="<?php echo $row_RS_Category['category_id']?>" <?php if (!(strcmp($row_RS_Category['category_id'], htmlentities($row_RS_updateProducts['category_id'], ENT_COMPAT, 'UTF-8')))) {echo "SELECTED";} ?>><?php echo $row_RS_Category['category_name']?></option>
    <?php
} while ($row_RS_Category = mysql_fetch_assoc($RS_Category));
?>
  </select></td>
<tr>
<tr valign="baseline">
  <td nowrap align="right">Status:</td>
  <td><select name="status">
    <option value="1" <?php if (!(strcmp(1, htmlentities($row_RS_updateProducts['status'], ENT_COMPAT, 'UTF-8')))) {echo "SELECTED";} ?>>Available</option>
    <option value="2" <?php if (!(strcmp(2, htmlentities($row_RS_updateProducts['status'], ENT_COMPAT, 'UTF-8')))) {echo "SELECTED";} ?>>Pending</option>
    <option value="3" <?php if (!(strcmp(3, htmlentities($row_RS_updateProducts['status'], ENT_COMPAT, 'UTF-8')))) {echo "SELECTED";} ?>>Unavailable</option>
  </select></td>
</tr>
<tr valign="baseline">
  <td nowrap align="right">Shipping Band:</td>
  <td><select name="shipping_band">
    <option value="a" <?php if (!(strcmp("a", htmlentities($row_RS_updateProducts['shipping_band'], ENT_COMPAT, 'UTF-8')))) {echo "SELECTED";} ?>>A</option>
    <option value="b" <?php if (!(strcmp("b", htmlentities($row_RS_updateProducts['shipping_band'], ENT_COMPAT, 'UTF-8')))) {echo "SELECTED";} ?>>B</option>
    <option value="c" <?php if (!(strcmp("c", htmlentities($row_RS_updateProducts['shipping_band'], ENT_COMPAT, 'UTF-8')))) {echo "SELECTED";} ?>>C</option>
    <option value="d" <?php if (!(strcmp("d", htmlentities($row_RS_updateProducts['shipping_band'], ENT_COMPAT, 'UTF-8')))) {echo "SELECTED";} ?>>D</option>
  </select></td>
</tr>
<tr valign="baseline">
  <td nowrap align="right">Price:</td>
  <td><input type="text" name="price" value="<?php echo htmlentities($row_RS_updateProducts['price'], ENT_COMPAT, 'UTF-8'); ?>" size="32"></td>
</tr>
<tr valign="baseline">
  <td nowrap align="right">&nbsp;</td>
  <td><input type="submit" value="Update record"></td>
</tr>
  </table>
  <input type="hidden" name="MM_update" value="form1">
  <input type="hidden" name="product_id" value="<?php echo $row_RS_updateProducts['product_id']; ?>">
</form>

我是 php 新手,因此我将不胜感激任何帮助,因为我已经坚持了好几天了。

【问题讨论】:

  • 谁能帮我解决这个问题?我是 php 新手,真的坚持下去。我已经尝试了 cmets 中的所有建议,但似乎没有任何效果。

标签: php mysql database file upload


【解决方案1】:

在执行移动文件逻辑之前检查 $_FILES 组件

像这样:

if(!empty($_FILES['thumb']['name'])){
   $thumb = basename( $_FILES['thumb']['name'] );
   move_uploaded_file($_FILES['thumb']['tmp_name'],"../shopImages/".$thumb);
}
if(!empty($_FILES['image_1']['name'])){
   $image1 = basename( $_FILES['image_1']['name'] );
   move_uploaded_file($_FILES['image_1']['tmp_name'],"../shopImages/".$image1);
}
if(!empty($_FILES['image_2']['name'])){
   $image2 = basename( $_FILES['image_2']['name'] );
   move_uploaded_file($_FILES['image_2']['tmp_name'],"../shopImages/".$image2);
}

并将您的查询更改为如下所示:

$updateSQL = sprintf("UPDATE tbl_products SET title=%s, `desc`=%s, category_id=%s, status=%s, shipping_band=%s, price=%s ",
               GetSQLValueString($_POST['title'], "text"),
               GetSQLValueString($_POST['desc'], "text"),
               GetSQLValueString($_POST['category_id'], "int"),
               GetSQLValueString($_POST['status'], "int"),
               GetSQLValueString($_POST['shipping_band'], "text"),
               GetSQLValueString($_POST['price'], "double"));

if(isset($thumb)){
  $updateSql .= sprintf(" thumb=%s", GetSQLValueString($thumb, "text"));
}

if(isset($image1)){
  $updateSql .= sprintf(" image_1=%s", GetSQLValueString($image1, "text"));
}

if(isset($image2)){
  $updateSql .= sprintf(" image_2=%s", GetSQLValueString($image2, "text"));
}

$updateSql .= sprintf(" WHERE product_id=%s", GetSQLValueString($_POST['product_id'], "int"));

【讨论】:

  • 嗨。谢谢回复。我以前尝试过这种方法并且可以让它工作。我刚刚按照你的建议又试了一次,但还是不开心。
  • 这会返回什么? GetSQLValueString($thumb, "text"), 这可能是用 sprintf 在查询中插入 void 空白
  • 如果我上传图片,则会将缩略图的路径插入数据库字段并将图片文件上传到正确的文件夹。如果我在简单地更新数据库时不浏览文件,那么它将用空白条目覆盖以前上传的图像。
  • 因此您可以将查询更改为仅在有值时才更新,或者如果没有新值,则将 $thumb、$image1 和 $image2 设为当前值。
  • 我可以更改图像,但如果不更改它,它将是空白的。如果我不更改图像文件,我希望它能够保持当前值。
【解决方案2】:

你在表单中提到过

<form name="form_name" action="actionpage.php" enctype="multipart/form-data" method="post">

如果你没有写 enctype="multipart/form-data" 你的文件不会被上传。

【讨论】:

  • 是的,我有。文件上传工作正常。当我不想更新图像时,这就是问题所在。就表格而言,每次我想更新任何其他字段时,我都必须再次上传图像。
猜你喜欢
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 2013-07-16
相关资源
最近更新 更多