如何仅在值非空时更新mysqli字段,实现图片字段可选更新
你当前修改的实现逻辑方向是对的,但存在几个需要修复的问题:
- 变量未初始化风险:你只在上传成功和
$file_name为空的时候给$text1赋值,如果上传触发了格式错误、大小超限、上传错误这几个分支,$text1变量不会被定义,拼接SQL的时候会抛出PHP Notice,同时SQL语句会出现语法错误。 - 你最开始的代码写错了判断逻辑,用了
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
相关产品推荐
相关产品推荐

