You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅在值非空时更新mysqli字段,实现图片字段可选更新

你当前修改的实现逻辑方向是对的,但存在几个需要修复的问题:

  1. 变量未初始化风险:你只在上传成功和$file_name为空的时候给$text1赋值,如果上传触发了格式错误、大小超限、上传错误这几个分支,$text1变量不会被定义,拼接SQL的时候会抛出PHP Notice,同时SQL语句会出现语法错误。
  2. 你最开始的代码写错了判断逻辑,用了if (empty($file_name))才执行上传校验,完全搞反了触发上传的条件,你后来改成!empty($file_name)是正确的调整。

更稳妥的优化写法如下,避免手动拼接字符串带来的逗号语法问题:

//image upload + validation
$file          = $_FILES['image'];
$file_name     = $_FILES['image']['name'];//file name
var_dump($file_name);
$file_location = $_FILES['image']['tmp_name']; //temporary location
$file_size     = $_FILES['image']['size'];// size
$file_error    = $_FILES['image']['error'];// error 0 if no error or 1 if there is an error

$temp_extension = explode('.',$file_name);//explode from . file extension, we have file name and extension
$file_extension = strtolower(end($temp_extension)); // extension name (end return the last element of the array)
$allowed_extensions = array('jpg', 'jpeg', 'png', 'pdf');

// 先初始化要更新的字段数组,把不需要条件判断的固定更新字段先加进去
$update_fields = [
    "`name` = '{$_POST['name']}'",
    "`description` = '{$_POST['description']}'",
    "`adress` = '{$_POST['adress']}'",
    "`link` = '{$_POST['link']}'"
];

if (!empty($file_name)) {
    if (in_array($file_extension, $allowed_extensions)) {
        if ($file_error === 0) {
            if ($file_size < 15728640) { //15728640b(bytes binary)  15mb mediumblob
                $new_file_name = uniqid('',true).".".$file_extension;
                // var_dump($new_file_name);
                $file_destination = dirname(__FILE__, 2)."/images/".$new_file_name;
                move_uploaded_file($file_location, $file_destination);
                // 只有上传完全成功,才把image字段加入更新列表
                $update_fields[] = "`image` = '$new_file_name'";
            }else {
                echo "Sorry your file size it's too big!";
            }
        }else {
            echo "Sorry, there was an error, try again";
        }
    }else {
        echo "Sorry, your file type is not accepted";
    }
}

if(is_array($row)) {
    // 用implode拼接字段,自动处理逗号,不会出现语法错误
    $fields_str = implode(', ', $update_fields);
    $sql = "UPDATE `accommodation` SET {$fields_str} WHERE `id` = '{$_POST['id']}'";
    mysqli_query(get_connection(), $sql);
    var_dump($sql);
    // header("Location: admin.php?page=accommodation_list");
}

后续优化注意事项:

  • 功能跑通后一定要把直接拼接外部参数到SQL的写法改成预处理语句,避免SQL注入风险。
  • 记得修正表字段adress为正确的address拼写,避免后续维护混乱。

内容的提问来源于stack exchange,提问作者Alexandru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:36:03