کلاس پایگاه داده (بخش 1)

(Database Class (Part 1

25 بهمن 1399
پروژه ساخت شبکه ی اجتماعی: کلاس پایگاه داده (بخش 1)

در قسمت قبل مروری بر PDO داشتیم و قرار شد در این جلسه کلاسِ کار با پایگاه داده خود را بسازیم اما قبل از هر کاری باید اطلاعات مربوط به پایگاه داده را در فایل config.php وارد کنیم. اگر یادتان باشد گفتیم مواردی که ممکن است بعدا تغییر کند (مانند نام دامنه، نام سایت، اطلاعات پایگاه داده مانند رمز عبور و حساب کاربری و ....) را در فایلی جداگانه به نام config.php ایجاد می کنیم تا در صورت لزوم تمام اطلاعاتی که باید تغییر کنند در یک فایل و یک مکان قرار داشته باشند.

در جلسات قبل گفتیم که برای این اطلاعات از ثابت ها (constant) استفاده می کنیم بنابراین اطلاعات زیر را که اطلاعات پایگاه داده ما است به آن اضافه خواهیم کرد:

// DB Params
  define('DB_HOST', 'localhost');
  define('DB_USER', 'root');
  define('DB_PASS', '123456');
  define('DB_NAME', 'tmvc');

وضعیت کدها در فایل Config.php تا این لحظه به شکل زیر است:

<?php
  // DB Params
  define('DB_HOST', 'localhost');
  define('DB_USER', 'root');
  define('DB_PASS', '123456');
  define('DB_NAME', 'tmvc');

  // App Root
  define('APPROOT', dirname(dirname(__FILE__)));
  // URL Root
  define('URLROOT', 'http://localhost/traversymvc');
  // Site Name
  define('SITENAME', 'TraversyMVC');

حالا باید کلاس پایگاه داده را بسازیم. برای این کار به پوشه libraries رفته و فایلی به نام Database.php را باز کنید (اگر یادتان باشد قبلا و در جلسات اولیه این فایل را ایجاد کرده بودیم). برای شروع باید کلاسی به نام Database ساخته و اطلاعات پایگاه داده را در آن وارد کنیم:

class Database {
    private $host = DB_HOST;
    private $user = DB_USER;
    private $pass = DB_PASS;
    private $dbname = DB_NAME;
{

این اطلاعات حتما باید private باشند تا به مشکلات امنیتی برخورد نکنیم؛ هیچ کس نباید اجازه ویرایش این مقادیر را داشته باشد به غیر از خودمان.

حالا خصوصیتی به نام dbh می سازیم (مخفف database handler)؛ هر زمانی که بخواهیم دستوری را prepare کنیم از این خصوصیت استفاده خواهیم کرد. سپس خود دستور (statement) را درون خصوصیتی به نام stmt قرار می دهیم. در آخر خصوصیتی به نام error می سازیم تا خطاها را با آن دریافت کنیم:

private $dbh;
    private $stmt;
    private $error;

حالا باید یک constructor ایجاد کنیم. درون این constructor باید رشته DSN را بنویسیم؛ اگر یادتان نمی آید DSN چیست به دو جلسه قبل مراجعه کنید:

$dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;

یادآوری: برای دسترسی به خصوصیات یک کلاس (زمانی که در آن کلاس هستیم) از کلید واژه this استفاده می کنیم.

حالا باید چند مورد از تنظیمات PDO را انجام دهیم. تنظیمات PDO بسیار زیاد و متعدد هستند و کاملا پیشرفته می شوند:

PDO {
      __construct ( string $dsn [, string $username [, string $password [, array $driver_options ]]] ) 
	bool beginTransaction ( void ) 
	bool commit ( void ) 
	mixed errorCode ( void ) 
	array errorInfo ( void ) 
	int exec ( string $statement ) 
	mixed getAttribute ( int $attribute ) 
	static array getAvailableDrivers ( void ) 
	bool inTransaction ( void ) 
	string lastInsertId ([ string $name = NULL ] ) 
	PDOStatement prepare ( string $statement [, array $driver_options = array() ] ) 
	PDOStatement query ( string $statement ) 
	string quote ( string $string [, int $parameter_type = PDO::PARAM_STR ] ) 
	bool rollBack ( void ) 
	bool setAttribute ( int $attribute , mixed $value ) }mp($var_name);
}

ما با همه این تنظیمات کاری نداریم بلکه تنها چند مورد از آن ها را مورد استفاده قرار می دهیم. این تنظیمات را به شکل زیر داخل یک آرایه قرار می دهیم:

$options = array(
        PDO::ATTR_PERSISTENT => true,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
      );

خصوصیت اول (ATTR_PERSISTENT) می گوید اگر از قبل اتصالی به پایگاه داده داریم اتصال جدید ایجاد نکن و همان اتصال قبلی را به صورت پایا حفظ کن. این کار باعث افزایش عملکرد و سرعت برنامه ما می شود.

خصوصیت دوم (ATTR_ERRMODE) حالت گزارش خطا در PDO را مشخص می کند. PDO سه حالت خطای مختلف دارد: Silent و Warning و Exception. ما از حالت Exception استفاده خواهیم کرد که حالت کامل تر و مفصل تر کار با خطاها است.

حالا وقت نمونه سازی از PDO است:

try{
        $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
      } catch(PDOException $e){
        $this->error = $e->getMessage();
        echo $this->error;
      }

استفاده از حالت try {} catch {} روش اصولی تر یا حداقل تمیزتر کار با کدهای PDO است. در این حالت می گوییم کدهای داخل بلوک try را امتحان کن (try یعنی امتحان کردن) اگر جواب داد که هیچ اما اگر با مشکلی روبرو شدیم کدهای داخل catch را اجرا کن (catch یعنی «گرفتن»). حالا چه چیزی را می گیریم؟ خطای تولید شده را!

در پارامترهای catch یک متغیر به نام e$ اضافه کرده ایم که شاید در نظر اول برایتان عجیب باشد. این متغیر را می توانید به هر نامی که دوست داشتید بنویسید اما معمولا بین برنامه نویسان به همان e مشهور شده است (مخفف error). این متغیر به صورت خودکار Exception را می گیرد و نیازی نیست شما کار خاصی انجام دهید. در آخر این متغیر (e) متدی به نام getMessage دارد که پیام خطا را به ما نشان می دهد و ما هم آن را echo کرده ایم.

این کلاس هنوز کارهای زیادی دارد و باید موارد متعددی به آن اضافه شود اما قبل از انجام آن کار ها می خواهیم آن را تست کنیم. کلاس پایگاه داده ما در Model نمونه سازی (instantiate) خواهد شد بنابراین به پوشه models رفته و فایل جدیدی به نام post.php بسازید تا آن را تست کنیم. کلاسی به نام Post را در آن ایجاد کنید.

نکته: معمولا نام model ها را به صورت مفرد و نام controller ها را به صورت جمع (با S جمع) مینویسند، البته این مورد قرار دادی است و شما الزامی به پیروی از آن ندارید.

برای شروع کار درون این کلاس یک خصوصیت به نام db و یک constructor می سازیم:

class Post {
    private $db;

    public function __construct(){
      $this->db = new Database;
    }
  }

بنابراین کلاس Database خود را نمونه سازی کرده ایم و آن را به خصوصیت db داده ایم. در حال حاضر این model کاری نمی کند، بنابراین باید آن را در Controller بارگذاری (load) کنیم.

اگر یادتان باشد در کلاس model در فایل controller متدی داشتیم که model ها را load می کرد. از آنجا که فقط می خواهیم آن را تست کنیم از همان Pages.php (در پوشه controllers) استفاده خواهیم کرد. در constructor کلاس Controller در فایل Pages.php می نویسیم:

public function __construct(){
      $this->postModel = $this->model('Post');
    }

فایل را ذخیره کرده و آدرس localhost/traversymvc را دوباره refresh کنید. باید با خطای unknown databse مواجه شوید که کاملا طبیعی است. چرا؟ ما نام پایگاه داده خود را در فایل config.php رشته tmvc قرار دادیم اما هیچ گاه چنین پایگاه داده ای را نساختیم بنابراین خطا را دریافت می کنیم.

سریعا به PhpMyAdmin بروید و از قسمت create database یک پایگاه داده به نام tmvc بسازید. سپس دوباره به آدرس localhost/traversymvc بروید. این بار نباید هیچ خطایی به چشم بخورد.

در قسمت بعدی می خواهیم کلاس پایگاه داده را تکمیل کنیم تا بتوانیم از طریق model (مثلا Post در فایل Post.php) کوئری هایمان را اجرا کنیم. البته فایل Post.php را بعدا منتقل می کنیم چرا که فقط برای تست بود.

دانلود فایل کدها تا این جلسه

امیدوارم از این قسمت لذت برده باشید.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش ساخت شبکه اجتماعی توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.