حسابداری هلو

افزودن عکس در پایگاه داده با 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-xhr="#" 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- آپلود و ذخیره تصاویر در پایگاه داده

برای ذخیره تصاویر در پایگاه داده:

  1. تصویر انتخاب‌شده توسط کاربر از طریق فرم HTML دریافت می‌شود.
  2. داده‌ی تصویر به‌صورت باینری خوانده و با استفاده از تابع addslashes آماده‌ی ذخیره‌سازی می‌شود.
  3. اطلاعات واردشده در جدول ذخیره می‌شود.
$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']));

توضیحات :

  1. $_FILES['picture']['tmp_name']:
  • این بخش از کد نام موقت فایلی را که توسط کاربر آپلود شده است، دریافت می‌کند. $_FILES یک آرایه‌ی ابر جهانی در PHP است که اطلاعات فایل‌های آپلود شده را نگهداری می‌کند. picture نام فیلد ورودی فایل در فرم HTML است و tmp_name مسیر موقتی است که فایل در سرور ذخیره شده است.
  1. file_get_contents():
  • این تابع محتوای فایل را به صورت یک رشته می‌خواند. در اینجا، محتوای فایل آپلود شده خوانده می‌شود.
  1. addslashes():
  • این تابع به هر علامت نقل قول (' یا ") و بک‌اسلش (\) در رشته اضافه می‌کند تا از فرار کردن کاراکترها جلوگیری کند. این کار معمولاً برای جلوگیری از حملات SQL Injection و هنگام ذخیره‌سازی داده‌ها در پایگاه داده انجام می‌شود.

نکته :

  • مقدار $picture شامل محتوای فایل آپلود شده با اسلش‌های اضافی برای کاراکترهای خاص است. این معمولاً قبل از ذخیره‌سازی داده‌ها در پایگاه داده استفاده می‌شود تا از صحت داده‌ها و امنیت اطمینان حاصل شود.

3- بازیابی و نمایش تصاویر

برای نمایش تصاویر ذخیره‌شده در پایگاه داده:

  1. تمام رکوردهای جدول با استفاده از کوئری SELECT بازیابی می‌شوند.
  2. هر تصویر با استفاده از تابع base64_encode کدگذاری شده و در HTML نمایش داده می‌شود.
while ($row = mysqli_fetch_assoc($result)) {
    echo '<img src="data:image/jpeg;base64,' . base64_encode($row['picture']) . '" alt="تصویر">';
}

این کد یک حلقه while در PHP است که در هر تکرار، یک ردیف از نتایج پرس و جوی پایگاه داده را پردازش و یک تصویر را در صفحه وب نمایش می‌دهد. در اینجا توضیح مرحله به مرحله از عملکرد این کد آورده شده است:

توضیح :

  1. mysqli_fetch_assoc($result):
  • این تابع یک ردیف از نتایج پرس و جو را به صورت آرایه‌ی انجمنی برمی‌گرداند، جایی که کلیدهای آرایه نام ستون‌های جدول هستند. مقدار $result باید نتیجه‌ی یک پرس و جوی SQL باشد که از قبل اجرا شده است.
  1. حلقه while:
  • حلقه while تا زمانی که ردیف‌های بیشتری در نتیجه‌ی پرس و جو وجود داشته باشد، ادامه پیدا می‌کند. هر بار که حلقه اجرا می‌شود، یک ردیف جدید از نتایج دریافت می‌شود.
  1. 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 که برای کار با داده‌های باینری ضروری هستند، توضیح داده شدند. با این روش‌ها می‌توانید فایل‌های مدیا را به‌راحتی در پایگاه داده مدیریت کنید.

مهرداد یاری

View Comments

  • I do not know whether it's just me or if perhaps everybody else experiencing issues with your site.
    It appears like some of the text within your posts are running off the screen. Can somebody else please comment and let me
    know if this is happening to them as well? This could be
    a problem with my internet browser because I've had this happen before.
    Thank you

  • Excellent beat ! I wish to apprentice at the same time as you amend your website, how could i subscribe for a blog web site?
    The account aided me a applicable deal. I have been tiny bit familiar of this your broadcast provided bright clear
    idea

  • hi!,I love your writing very so much! share we keep in touch more about your article on AOL?
    I need a specialist on this house to unravel my problem.
    Maybe that's you! Looking forward to see you.

  • Thanks for your personal marvelous posting! I quite enjoyed reading it, you
    happen to be a great author. I will always bookmark your blog and may come back later on. I want to encourage yourself to continue your great
    job, have a nice weekend!

  • What's up Dear, are you actually visiting this web
    site daily, if so after that you will absolutely
    obtain nice know-how.

Recent Posts

بررسی خطاهای کوئری‌ پایگاه داده در PHP

هنگام کار با پایگاه داده در PHP، ممکن است خطاهایی ناشی از کوئری‌های ناقص یا…

4 هفته ago

آموزش ایجاد پایگاه داده در PHP

ایجاد پایگاه داده در PHP یکی از مباحث اساسی برای ساخت وب‌سایت‌ها و برنامه‌های تحت…

4 هفته ago

کلاس‌ها در PHP به زبان ساده

کلاس‌ها در PHP یکی از اصلی‌ترین مباحث برنامه‌نویسی شیءگرا (Object-Oriented Programming) هستند. با استفاده از…

4 هفته ago

آموزش try در PHP

استفاده از ساختارهای کنترل خطا در برنامه‌نویسی از اهمیت ویژه‌ای برخوردار است. در زبان PHP،…

1 ماه ago

اتصال به پایگاه داده در PHP

اتصال به پایگاه داده database connectivity یکی از مراحل مهم در توسعه وب است. با…

1 ماه ago

تفاوت‌های سشن و کوکی در PHP

سشن‌ها (Sessions) و کوکی‌ها (Cookies) هر دو ابزارهایی هستند که برای ذخیره‌سازی داده‌ها و پیگیری…

1 ماه ago