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
相关产品推荐
相关产品推荐

