اذهب إلى المحتوى

السؤال

نشر

لدي قاعدة بيانات و جدول للمقالات كل مقال له عنوان و مُحتوى و لدي هذه الصفحة تحتوي على نموذج لإضافة مقال:

 <!DOCTYPE html>
 <html dir="rtl" lang="ar">
 <head>
     <title>إضافة مقال</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css">
    <link rel="preconnect" href="https://fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css2?family=Cairo:wght@600&display=swap" rel="stylesheet">
    <style>
        body {
            margin: 0;
            padding: 0;
            background-color: #f1f1f1;
            font-family: 'Cairo', sans-serif;
            text-align: right;
        }

        .box {
            width: 800px;
            border: 1px solid #ccc;
            background-color: #fff;
            border-radius: 5px;
            margin-top: 36px;
        }

    </style> 

</head>

 <body>
     <div class="container box p-3">
        <h3 class="text-center mt-3">إضافة مقال جديد</h3>
         <form method="post">
             <label>عنوان المقال</label>
             <input type="text" name="title" class="form-control" />
             <br />
             <label>محتوى المقال</label>
             <textarea name="body" class="form-control" rows="5"></textarea>
             <br />
             <input type="submit" name="submit" class="btn btn-info" value="أضف" />
             <span class="text-success">
                 <!-- عرض رسالة نجاح الحفظ -->
             </span>
         </form>
     </div>
 </body>

 </html>

أريد عند ملء الحقول و الضغط على زر الإضافة يتم إضافة المقال في جدول المقالات لكن أريد العملية أن تتم بإستخدام البرمجة الكائنية OOP، صنف به عملية الإتصال بقاعدة البيانات و تابع لإضافة سجل جديد.

Recommended Posts

  • 0
نشر

يُمكنك عمل ذلك بعدة طرق و هذه أحد الطرق البسيطة لعمل ذلك،

  • إنشاء صنف DB يحتوي على خاصية للإتصال بقاعدة البيانات
  • إنشاء تابع لهذا الصنف إسمه insert يأخذ مُعاملين إسم الجدول و بيانات المقال على شكل مصفوفة ترابطية نُهيء الإستعلام عن طريق مفاتيح المصفوفة و إسم الجدول 

نضع الصنف DB داخل ملف إسمه DB.php ثم نستخدم هذا الملف داخل الملف الذي ارسلته كما هو موضح أدناه:

الصنف DB:

<?php

class DB
{
  public $con; // خاصية للكائن لحفظ الإتصال
  public function __construct() // إنشاء الباني
  {
    /*
            حفظ الإتصال و تعيين الترميز
            يُمكنك هنا تعديل بيانات الإتصال لديك
        */
    $this->con = mysqli_connect("localhost", "root", "root", "test_db"); 
    mysqli_set_charset($this->con, 'utf8mb4');
    if (!$this->con) {
      echo 'Database Connection Error ' . mysqli_connect_error($this->con);
    }
  }

  /*
        دالة تأخذ إسم الجدول كمعامل أول و البيانات على شكل مصفوفة ترابطية
        حيث تكون المفاتيح هي أسماء حقول الجدول
        تقوم الدالة بإنشاء إستعلام التخزين و تنفيذه 
    */
  public function insert($table_name, $data)
  {
    /*
            if table_name = posts and data = ['title' => 'title 1', 'body' => 'post content'],
            then 
                fields = title,body 
                and values = title 1','post content
                and query = INSERT INTO posts (title,body) VALUES ('title 1','post content')

        */
    $fields = implode(",", array_keys($data));
    $values = implode("','", array_values($data));
    $query = "INSERT INTO $table_name ($fields) VALUES ('$values')";

    if (mysqli_query($this->con, $query)) {
      return true; // return true if data inserted
    } else {
      echo mysqli_error($this->con); // echo error
    }
  }
}

بعد ذلك نُعدل على الملف الذي أرسلته لإضافة عملية التخزين بالإعتماد على الصنف الذي أنشأناه:

<?php

include 'DB.php'; // إستدعاء الكلاس DB
$db = new DB; // إنشاء كائن من الكلاس
$success_message = ''; // تعريف متغير سيحمل رسالة تم الحفظ بنجاح
if (isset($_POST["submit"])) { // في حالة إرسال النموذج و الضغط على زر الإضافة
    /*
        الدالة mysqli_real_escape_string
        تُستخدم لعمل
        escape
        لبعض المحارف التي تُسبب أخطاء في الإستعلام إذا وُجدت
    */
    $data = array(
        'title'     =>  mysqli_real_escape_string($db->con, $_POST['title']),
        'body'      =>  mysqli_real_escape_string($db->con, $_POST['body'])
    );
    if ($db->insert('posts', $data)) { // في حالة نجاح التخزين
        $success_message = 'تم حفظ المقال بنجاح';
    }
}
?>
<!DOCTYPE html>
<html dir="rtl" lang="ar">

<head>
    <title>إضافة مقال</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css">
    <link rel="preconnect" href="https://fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css2?family=Cairo:wght@600&display=swap" rel="stylesheet">
    <style>
        body {
            margin: 0;
            padding: 0;
            background-color: #f1f1f1;
            font-family: 'Cairo', sans-serif;
            text-align: right;
        }

        .box {
            width: 800px;
            border: 1px solid #ccc;
            background-color: #fff;
            border-radius: 5px;
            margin-top: 36px;
        }
    </style>

</head>

<body>
    <div class="container box p-3">
        <h3 class="text-center mt-3">إضافة مقال جديد</h3>
        <form method="post">
            <label>عنوان المقال</label>
            <input type="text" name="title" class="form-control" />
            <br />
            <label>محتوى المقال</label>
            <textarea name="body" class="form-control" rows="5"></textarea>
            <br />
            <input type="submit" name="submit" class="btn btn-info" value="أضف" />
            <!-- عرض رسالة النجاح إذا وُجدت -->
            <?php if (isset($success_message)) : ?>
                <span class="text-success">
                    <?= $success_message ?>
                </span>
            <?php endif; ?>
        </form>
    </div>
</body>

</html>

تتجلى فائدة البرمجة الكائنية في هذه الحالة أننا لن نقوم في كل مرة بإنشاء إستعلام جديد كلما تغير الجدول و البيانات التي نريد تخزينها و إنما بإستعمال التابع insert فإن العملية ستحدث تلقائياً و ستحدث في الخفاء حيث أن الكلاس DB اخفى عملية التخزين.

نقطة إضافية و هي أننا قلصنا مكان التعديل فعملية التخزين إذا ما حدثت مشكلة فيها سنقوم بالبحث عن المُشكلة في مكان واحد وهو التابع insert و حلها فيه.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...