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

PHP图片无法更新及联系人信息更新失败问题求助

问题描述

点击页面更新按钮后,无法从数据库读取带ID的联系人信息填充页面;修改信息后Update语句未执行,数据无任何变化;同时图片上传更新功能失效。


相关代码

数据库连接代码

<?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_NAME', 'project');
 
/* Attempt to connect to MySQL database */
$link = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
 
// Check connection
if($link === false){
    die("ERROR: Could not connect. " . mysqli_connect_error());
}
?>

表单代码

<form method="post" action="action/update-certificate.php?id=<?php echo $_GET['viewid']?>" class="main-right" id="mainbar" enctype="multipart/form-data">
<div class="grid-3">
    <div class="grid-item">
        <p class="grid-title">certificate of employment signature</p>
        <input type="file" name="coe_signature" class="cert-int">
    </div>
</div>
<button class="btn-add" type="submit" name="update_certificate"></button>
</form>

处理代码

<?php

include '../../../config.php';

if (isset($_POST['update_certificate'])) {

    if (isset($_POST['coe_signature'])) {
        $file = $_FILES['coe_signature'] ?? "";
        $filename = $_FILES['coe_signature']['name'] ?? "";
        $fileTmpName = $_FILES['coe_signature']['tmp_name'] ?? "";
        $fileSize = $_FILES['coe_signature']['size'] ?? "";
        $fileError = $_FILES['coe_signature']['error'] ?? "";
        $fileType = $_FILES['coe_signature']['type'] ?? "";

        $fileExt = explode('.', $filename);

        $fileActualExt = strtolower(end($fileExt));

        $allowed = array('jpg', 'jpeg', 'png');

        if (in_array($fileActualExt, $allowed)) {
            if ($fileError === 0) {
                if ($fileSize < 5000000000000000) {
                    $fileNameNew = uniqid('', true).".".$fileActualExt;
                    $fileDestination = 'uploads/'.$fileNameNew;
                    move_uploaded_file($fileTmpName, $fileDestination);

                    $coe_signature = $_POST['coe_signature'];

                    $coe_signature_sql = "UPDATE certficate SET coe_signature = '".$coe_signature."' WHERE viewid = ".$_GET['id']." ";
                    mysqli_query($link, $coe_signature_sql);
                }
                else{
                    echo "Your file is too big";
                }
            }
            else{
                echo "There was an error uploading your file";
            }
        }
        else{
            echo "Cannot upload this file type";
        }
    }
}
else{
    echo "ERROR contact the developer";
}

?>

错误分析与修复方案

1. 文件上传判断逻辑错误

  • 问题:用isset($_POST['coe_signature'])判断文件是否上传,但文件类型输入的内容仅存在$_FILES中,$_POST不会存储文件字段值,导致后续逻辑完全不执行。
  • 修复:改为判断文件上传状态:
    if ($_FILES['coe_signature']['error'] !== UPLOAD_ERR_NO_FILE)
    

2. 数据库更新变量错误

  • 问题:$coe_signature = $_POST['coe_signature'];错误获取值,文件上传后应存入数据库的是新生成的文件名$fileNameNew,而非$_POST中的空值。
  • 修复:替换为:
    $coe_signature = $fileNameNew;
    

3. SQL语法与安全问题

  • 问题:表名拼写错误(certficate少写一个i,应为certificate);直接拼接SQL存在注入风险,且未处理$_GET['id']的类型问题。
  • 修复:使用预处理语句执行SQL,同时修正表名:
    $stmt = mysqli_prepare($link, "UPDATE certificate SET coe_signature = ? WHERE viewid = ?");
    mysqli_stmt_bind_param($stmt, "si", $coe_signature, $_GET['id']);
    mysqli_stmt_execute($stmt);
    

4. 文件大小限制不合理

  • 问题:$fileSize < 5000000000000000设置的上限过大(约5PB),不符合实际场景。
  • 修复:改为合理上限(例如5MB):
    if ($fileSize < 5242880)
    

5. 缺少错误检测机制

  • 问题:未判断SQL执行是否成功,无法排查数据库错误;未检测文件移动是否成功。
  • 修复:添加错误检测:
    if (!move_uploaded_file($fileTmpName, $fileDestination)) {
        echo "文件存储失败,请检查uploads目录权限";
    }
    if (!mysqli_stmt_execute($stmt)) {
        echo "SQL错误: " . mysqli_error($link);
    }
    

6. 页面数据填充逻辑缺失

  • 问题:原代码无从数据库读取数据填充页面的逻辑,导致无法显示原有信息。
  • 修复:在表单页面顶部添加查询代码,填充现有数据:
    <?php
    include '../../../config.php';
    $viewid = $_GET['viewid'];
    $result = mysqli_query($link, "SELECT coe_signature FROM certificate WHERE viewid = $viewid");
    $row = mysqli_fetch_assoc($result);
    ?>
    
    然后在表单中添加现有图片展示:
    <?php if($row['coe_signature']): ?>
        <img src="action/uploads/<?php echo $row['coe_signature']; ?>" alt="现有签名" style="max-width:200px;">
    <?php endif; ?>
    

7. 文件存储目录问题

  • 问题:未确保uploads目录存在且有写入权限,导致move_uploaded_file失败。
  • 修复:添加目录检测与创建:
    if (!is_dir('uploads')) {
        mkdir('uploads', 0755, true);
    }
    

修复后的处理代码示例

<?php
include '../../../config.php';

if (isset($_POST['update_certificate'])) {
    // 判断是否有文件上传
    if ($_FILES['coe_signature']['error'] !== UPLOAD_ERR_NO_FILE) {
        $file = $_FILES['coe_signature'];
        $filename = $file['name'];
        $fileTmpName = $file['tmp_name'];
        $fileSize = $file['size'];
        $fileError = $file['error'];
        $fileType = $file['type'];

        $fileExt = explode('.', $filename);
        $fileActualExt = strtolower(end($fileExt));
        $allowed = array('jpg', 'jpeg', 'png');

        if (in_array($fileActualExt, $allowed)) {
            if ($fileError === 0) {
                // 设置5MB文件大小上限
                if ($fileSize < 5242880) {
                    $fileNameNew = uniqid('', true) . "." . $fileActualExt;
                    $fileDestination = 'uploads/' . $fileNameNew;
                    
                    // 确保uploads目录存在
                    if (!is_dir('uploads')) {
                        mkdir('uploads', 0755, true);
                    }
                    
                    if (move_uploaded_file($fileTmpName, $fileDestination)) {
                        // 使用预处理语句更新数据库
                        $coe_signature = $fileNameNew;
                        $viewid = $_GET['id'];
                        $stmt = mysqli_prepare($link, "UPDATE certificate SET coe_signature = ? WHERE viewid = ?");
                        mysqli_stmt_bind_param($stmt, "si", $coe_signature, $viewid);
                        
                        if (mysqli_stmt_execute($stmt)) {
                            echo "更新成功";
                            // 可跳转回表单页面
                            // header("Location: ../your-form-page.php?viewid=$viewid");
                            // exit;
                        } else {
                            echo "SQL执行失败: " . mysqli_error($link);
                        }
                    } else {
                        echo "文件存储失败,请检查uploads目录权限";
                    }
                } else {
                    echo "文件过大,最大允许5MB";
                }
            } else {
                echo "文件上传错误,错误码: " . $fileError;
            }
        } else {
            echo "仅允许上传jpg/jpeg/png格式的文件";
        }
    } else {
        echo "请选择要上传的文件";
    }
} else {
    echo "非法请求";
}
?>

内容的提问来源于stack exchange,提问作者Mark nicholas Razon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:51:18