افزودن عکس در پایگاه داده با PHP
ذخیره و نمایش تصاویر و مدیا در پایگاه داده یکی از نیازهای رایج در پروژههای وب است. در این مقاله به شما نشان میدهیم که چگونه تصاویر را به پایگاه داده MySQL اضافه و بازیابی کنید. همچنین به بررسی کد نمونهای که در بالا ارائه شده است، میپردازیم.
فهرست مطالب
- ایجاد جدول برای ذخیره تصاویر
- آپلود و ذخیره تصاویر در پایگاه داده
- بازیابی و نمایش تصاویر
- توضیح توابع مهم استفادهشده
- IF NOT EXISTS
- LONGBLOB
- addslashes
- mysqli_query
- mysqli_num_rows
- mysqli_fetch_assoc
- base64_encode
- لینکهای مطالعه پیشنهادی
آموزش افزودن مدیا و عکس در پایگاه داده با PHP
مثال کامل در مورد افزودن عکس در پایگاه داده
در اینجا ابتدا یک مثال کامل در مورد افزودن عکس در پایگاه داده آورده ایم سپس قسمتهای مهم آن را در ادامه توضیح داده ایم .
این مثال در یک فرم :
- id نام و عکس یک شخص را دریافت میکند
- در مرحله بعد در پایگاه داده ذخیره میکند
- در مرحله آخر آن را نمایش می دهد
<!doctype html>
<html lang="fa" dir="rtl">
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ذخیره و نمایش تصاویر</title>
<style>
body {
font-family: Arial, sans-serif;
direction: rtl;
text-align: right;
background-color: #f9f9f9;
}
.form-container {
width: 400px;
margin: 20px auto;
padding: 20px;
background-color: #fff;
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
h1 {
text-align: center;
color: #333;
}
label {
display: block;
margin-bottom: 5px;
font-weight: bold;
}
input[type="number"],
input[type="text"],
input[type="file"] {
width: calc(100% - 20px);
padding: 10px;
margin-bottom: 15px;
border: 1px solid #ccc;
border-radius: 5px;
}
button {
width: 100%;
padding: 10px;
background-color: #007bff;
color: #fff;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
}
button:hover {
background-color: #0056b3;
}
table {
width: 90%;
margin: 20px auto;
border-collapse: collapse;
background-color: #fff;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
table th, table td {
border: 1px solid #ddd;
padding: 10px;
text-align: center;
}
table th {
background-color: #007bff;
color: white;
}
img {
max-width: 100px;
max-height: 100px;
}
</style>
</head>
<body>
<?php
// اتصال به پایگاه داده
$host = "localhost";
$user = "root";
$password = "";
$dbname = "itvisit";
$conn = mysqli_connect($host, $user, $password, $dbname);
if (!$conn) {
die("اتصال به پایگاه داده ناموفق بود: " . mysqli_connect_error());
}
// ایجاد جدول در صورت عدم وجود
$createTableQuery = "
CREATE TABLE IF NOT EXISTS media (
id INT PRIMARY KEY,
name VARCHAR(100),
picture LONGBLOB
)
";
mysqli_query($conn, $createTableQuery);
// پردازش فرم
if (isset($_POST['submit'])) {
$id = $_POST['id'];
$name = $_POST['name'];
$picture = addslashes(file_get_contents($_FILES['picture']['tmp_name']));
$insertQuery = "INSERT INTO media (id, name, picture) VALUES ('$id', '$name', '$picture')";
if (mysqli_query($conn, $insertQuery)) {
echo "<p style='text-align:center; color:green;'>اطلاعات با موفقیت ذخیره شد.</p>";
} else {
echo "<p style='text-align:center; color:red;'>خطا در ذخیره اطلاعات: " . mysqli_error($conn) . "</p>";
}
}
// بازیابی دادهها
$selectQuery = "SELECT id, name, picture FROM media";
$result = mysqli_query($conn, $selectQuery);
?>
<body>
<div class="form-container">
<h1>اضافه کردن اطلاعات</h1>
<br>
<p> سایز عکس کوچک باشد </p>
<br>
<p> مطمئن شوید که اندازه فایل آپلود شده در تنظیمات PHP محدود نباشد</p>
<form action="" method="POST" enctype="multipart/form-data">
<label for="id">کد (ID):</label>
<input type="number" name="id" id="id" required>
<label for="name">نام:</label>
<input type="text" name="name" id="name" required>
<label for="picture">تصویر:</label>
<input type="file" name="picture" id="picture" required>
<button type="submit" name="submit">اضافه کردن</button>
</form>
</div>
<?php if (mysqli_num_rows($result) > 0): ?>
<h2 style="text-align:center;">اطلاعات ذخیرهشده</h2>
<table>
<tr>
<th>کد</th>
<th>نام</th>
<th>تصویر</th>
</tr>
<?php while ($row = mysqli_fetch_assoc($result)): ?>
<tr>
<td><?php echo $row['id']; ?></td>
<td><?php echo $row['name']; ?></td>
<td><img src="data:image/jpeg;base64,<?php echo base64_encode($row['picture']); ?>" alt="تصویر"></td>
</tr>
<?php endwhile; ?>
</table>
<?php else: ?>
<p style="text-align:center;">هیچ دادهای برای نمایش موجود نیست.</p>
<?php endif; ?>
</body>
</body>
</html>
نکته :
در قسمت ابتدایی این کدها استایل میباشد که در درسهای css به آنها اشاره شده است .
توضیحات کد به صورت مرحله به مرحله
1-ایجاد جدول برای ذخیره تصاویر
ابتدا، یک جدول با استفاده از دستور CREATE TABLE
ایجاد میکنیم. این جدول شامل سه ستون است:
- id: شناسه منحصربهفرد برای هر رکورد.
- name: نام تصویر.
- picture: دادهی باینری مربوط به تصویر که از نوع
LONGBLOB
است.
$createTableQuery = "
CREATE TABLE IF NOT EXISTS media (
id INT PRIMARY KEY,
name VARCHAR(100),
picture LONGBLOB
)
";
mysqli_query($conn, $createTableQuery);
در اینجا از شرط IF NOT EXISTS
استفاده میشود تا از ایجاد مجدد جدول در صورت وجود جلوگیری کنیم.
2- آپلود و ذخیره تصاویر در پایگاه داده
برای ذخیره تصاویر در پایگاه داده:
- تصویر انتخابشده توسط کاربر از طریق فرم HTML دریافت میشود.
- دادهی تصویر بهصورت باینری خوانده و با استفاده از تابع
addslashes
آمادهی ذخیرهسازی میشود. - اطلاعات واردشده در جدول ذخیره میشود.
$picture = addslashes(file_get_contents($_FILES['picture']['tmp_name']));
$insertQuery = "INSERT INTO media (id, name, picture) VALUES ('$id', '$name', '$picture')";
if (mysqli_query($conn, $insertQuery)) {
echo "<p style='text-align:center; color:green;'>اطلاعات با موفقیت ذخیره شد.</p>";
}
کاربرد کد زیر در این برنامه :
$picture = addslashes(file_get_contents($_FILES['picture']['tmp_name']));
توضیحات :
$_FILES['picture']['tmp_name']
:
- این بخش از کد نام موقت فایلی را که توسط کاربر آپلود شده است، دریافت میکند.
$_FILES
یک آرایهی ابر جهانی در PHP است که اطلاعات فایلهای آپلود شده را نگهداری میکند.picture
نام فیلد ورودی فایل در فرم HTML است وtmp_name
مسیر موقتی است که فایل در سرور ذخیره شده است.
file_get_contents()
:
- این تابع محتوای فایل را به صورت یک رشته میخواند. در اینجا، محتوای فایل آپلود شده خوانده میشود.
addslashes()
:
- این تابع به هر علامت نقل قول (
'
یا"
) و بکاسلش (\
) در رشته اضافه میکند تا از فرار کردن کاراکترها جلوگیری کند. این کار معمولاً برای جلوگیری از حملات SQL Injection و هنگام ذخیرهسازی دادهها در پایگاه داده انجام میشود.
نکته :
- مقدار
$picture
شامل محتوای فایل آپلود شده با اسلشهای اضافی برای کاراکترهای خاص است. این معمولاً قبل از ذخیرهسازی دادهها در پایگاه داده استفاده میشود تا از صحت دادهها و امنیت اطمینان حاصل شود.
3- بازیابی و نمایش تصاویر
برای نمایش تصاویر ذخیرهشده در پایگاه داده:
- تمام رکوردهای جدول با استفاده از کوئری
SELECT
بازیابی میشوند. - هر تصویر با استفاده از تابع
base64_encode
کدگذاری شده و در HTML نمایش داده میشود.
while ($row = mysqli_fetch_assoc($result)) {
echo '<img src="data:image/jpeg;base64,' . base64_encode($row['picture']) . '" alt="تصویر">';
}
این کد یک حلقه while
در PHP است که در هر تکرار، یک ردیف از نتایج پرس و جوی پایگاه داده را پردازش و یک تصویر را در صفحه وب نمایش میدهد. در اینجا توضیح مرحله به مرحله از عملکرد این کد آورده شده است:
توضیح :
mysqli_fetch_assoc($result)
:
- این تابع یک ردیف از نتایج پرس و جو را به صورت آرایهی انجمنی برمیگرداند، جایی که کلیدهای آرایه نام ستونهای جدول هستند. مقدار
$result
باید نتیجهی یک پرس و جوی SQL باشد که از قبل اجرا شده است.
- حلقه
while
:
- حلقه
while
تا زمانی که ردیفهای بیشتری در نتیجهی پرس و جو وجود داشته باشد، ادامه پیدا میکند. هر بار که حلقه اجرا میشود، یک ردیف جدید از نتایج دریافت میشود.
echo '<img src="data:image/jpeg;base64,' . base64_encode($row['picture']) . '" alt="تصویر">';
:
- این خط یک تگ
<img>
HTML را در صفحه وب ایجاد میکند. base64_encode($row['picture'])
: این تابع محتوای ستونpicture
(که باید حاوی دادههای باینری تصویر باشد) را به رشتهای به کدگذاری Base64 تبدیل میکند.data:image/jpeg;base64,
: این پیشوند به مرورگر میگوید که دادههای تصویر به صورت Base64 کدگذاری شده است و نوع تصویر JPEG است.$row['picture']
: مقدار تصویر از ردیف جاری نتیجهی پرس و جو دریافت میشود.- در نهایت، تصویر با استفاده از دادههای Base64 در صفحه وب نمایش داده میشود.
این کد به شما امکان میدهد تصاویری که در پایگاه داده ذخیره شدهاند را به صورت مستقیم در صفحه وب نمایش دهید. هر تصویر در یک ردیف جدید در نتایج پرس و جو قرار دارد و به صورت Base64 کدگذاری شده و در تگ <img>
قرار میگیرد.
توضیح توابع مهم استفادهشده
IF NOT EXISTS
این شرط در دستور CREATE TABLE
استفاده میشود تا بررسی کند آیا جدولی با همین نام وجود دارد یا خیر. اگر جدول موجود نباشد، آن را ایجاد میکند.
LONGBLOB
نوع دادهای در MySQL است که برای ذخیره دادههای باینری بزرگ مانند تصاویر و فایلها استفاده میشود. این نوع میتواند تا 4 گیگابایت داده ذخیره کند.
addslashes
این تابع رشتهای را دریافت کرده و کاراکترهای خاص مانند ‘ و “ را با ** فرار میدهد. این کار از بروز خطاهای نحوی در SQL جلوگیری میکند.
$picture = addslashes(file_get_contents($_FILES['picture']['tmp_name']));
mysqli_query
این تابع برای اجرای کوئری SQL روی پایگاه داده استفاده میشود. اگر کوئری موفق باشد، مقدار true و در غیر این صورت مقدار false بازمیگرداند.
mysqli_num_rows
این تابع تعداد رکوردهای بازگشتی از یک کوئری SELECT
را محاسبه میکند. اگر هیچ رکوردی یافت نشود، مقدار صفر بازمیگرداند.
if (mysqli_num_rows($result) > 0) {
// داده موجود است
}
mysqli_fetch_assoc
این تابع یک آرایهی associative شامل دادههای یک رکورد از نتیجهی کوئری بازمیگرداند. این آرایه با استفاده از نام ستونها قابل دسترسی است.
$row = mysqli_fetch_assoc($result);
echo $row['name'];
base64_encode
این تابع دادهی باینری را به رشتهای کدگذاریشده در قالب Base64 تبدیل میکند. این روش برای نمایش دادههای باینری (مانند تصاویر) در HTML بسیار کاربردی است.
Base64 چیست ؟
Base64 یک روش رمزگذاری و کدنویسی است که دادههای دودویی (مانند فایلهای تصویر، ویدئو یا هر نوع داده باینری دیگر) را به رشتهای از کاراکترهای متنی تبدیل میکند. این روش اغلب برای انتقال دادههای دودویی در محیطهایی که تنها متون قابل انتقال هستند (مانند ایمیل، JSON یا دادههای HTTP) استفاده میشود.
<img src="data:image/jpeg;base64,<?php echo base64_encode($row['picture']); ?>" alt="تصویر">
لینکهای مطالعه پیشنهادی
جمعبندی
در این مقاله، نحوهی ذخیره و نمایش تصاویر در پایگاه داده با استفاده از PHP و MySQL را بررسی کردیم. همچنین توابعی مانند addslashes
، base64_encode
، و mysqli_fetch_assoc
که برای کار با دادههای باینری ضروری هستند، توضیح داده شدند. با این روشها میتوانید فایلهای مدیا را بهراحتی در پایگاه داده مدیریت کنید.