SQL数据库图片存储与HTML调用方案及报错解决请求
解决图片存入SQL数据库并在HTML中调用的问题
首先,你的报错根源很明确:mysql_connect()这类旧的mysql扩展函数在PHP 7及以上版本已经被完全移除了,所以必须改用mysqli(面向过程或面向对象)或者PDO来操作数据库。下面是一套完整的、基于mysqli的可行方案:
一、HTML上传表单(优化版)
<!DOCTYPE html> <html lang="it"> <head> <meta charset="UTF-8"> <title>Carica immagine nel DB</title> </head> <body> <form name="upload" action="write_db.php" method="POST" enctype="multipart/form-data"> <input type="file" name="file_inviato" accept="image/*" required> <button type="submit" name="invia">Invia immagine</button> </form> </body> </html>
这里做了几个实用优化:
- 采用HTML5标准文档结构与编码设置
- 添加
accept="image/*"限制仅能上传图片文件 - 用
required确保用户选择文件后才能提交 - 替换重复的提交按钮为语义化的
<button>标签
二、PHP写入数据库代码(write_db.php)
<?php // 检查文件上传状态 if (!isset($_FILES["file_inviato"]) || $_FILES["file_inviato"]["error"] !== UPLOAD_ERR_OK) { die("Errore nell'invio del file. Riprova!"); } // 替换为你的真实数据库凭据 $host = "localhost"; $user = "MYUSER"; $password = "TUAPASSWORD"; $dbname = "MY_DB"; // 建立mysqli数据库连接 $conn = mysqli_connect($host, $user, $password, $dbname); if (!$conn) { die("Connessione non riuscita: " . mysqli_connect_error()); } // 获取上传文件的基础信息 $temp_file = $_FILES["file_inviato"]["tmp_name"]; $real_name = $_FILES["file_inviato"]["name"]; $file_type = $_FILES["file_inviato"]["type"]; // 读取文件二进制内容 $file_data = file_get_contents($temp_file); // 安全转义内容,避免SQL注入风险 $escaped_name = mysqli_real_escape_string($conn, $real_name); $escaped_type = mysqli_real_escape_string($conn, $file_type); $escaped_data = mysqli_real_escape_string($conn, $file_data); // 执行插入数据库操作 $query = "INSERT INTO tabella_file (nome, tipo, dati) VALUES ('$escaped_name', '$escaped_type', '$escaped_data')"; if (mysqli_query($conn, $query)) { echo "Memorizzazione dell'immagine <b>$real_name</b> nel database eseguita correttamente!<br>"; echo '<a href="show_image.php">Visualizza l\'immagine caricata</a>'; } else { die("Query non valida: " . mysqli_error($conn)); } // 关闭数据库连接 mysqli_close($conn); ?>
关键注意事项:
- 务必替换
$user、$password、$dbname为你的真实数据库信息 - 使用
mysqli_real_escape_string替代旧的addslashes,更安全地防范SQL注入 - 连接数据库时直接指定目标库,无需单独调用选择数据库的方法
三、PHP读取图片并在HTML中显示(show_image.php)
要在HTML中调用存储在数据库的图片,需要一个单独的PHP文件输出图片内容,再通过HTML的<img>标签引用:
<?php // 数据库连接信息(与上方保持一致) $host = "localhost"; $user = "MYUSER"; $password = "TUAPASSWORD"; $dbname = "MY_DB"; $conn = mysqli_connect($host, $user, $password, $dbname); if (!$conn) { die("Connessione non riuscita: " . mysqli_connect_error()); } // 示例:读取ID为1的图片,可根据需求修改查询条件 $id = 1; $query = "SELECT tipo, dati FROM tabella_file WHERE id = $id"; $result = mysqli_query($conn, $query); if ($row = mysqli_fetch_assoc($result)) { // 设置响应头为图片对应的MIME类型 header("Content-Type: " . $row['tipo']); // 输出图片二进制内容 echo $row['dati']; } else { echo "Immagine non trovata!"; } mysqli_close($conn); ?>
在HTML中调用示例:
<!DOCTYPE html> <html lang="it"> <head> <meta charset="UTF-8"> <title>Visualizza Immagine</title> </head> <body> <h2>Immagine dal Database</h2> <img src="show_image.php" alt="Immagine caricata nel DB"> </body> </html>
四、数据库表结构参考
确保你的tabella_file表有正确的字段结构:
CREATE TABLE tabella_file ( id INT AUTO_INCREMENT PRIMARY KEY, nome VARCHAR(255) NOT NULL, tipo VARCHAR(100) NOT NULL, dati LONGBLOB NOT NULL );
dati字段必须设置为LONGBLOB类型,用于存储大体积的图片二进制内容id作为自增主键,方便后续精准查询指定图片
内容的提问来源于stack exchange,提问作者Automaction Program
相关产品推荐
相关产品推荐

