آموزش جامع کار با دیتابیس در PHP

در سایت‌های پویا از پایگاه داده برای ذخیره‌سازی داده‌ها استفاده می‌شود. اتصال به دیتابیس و کار با آن در اکثر پروژه‌ها مورد نیاز است. امکان ارتباط با انواع دیتابیس‌ها در PHP وجود دارد؛ پایگاه داده MySQL یکی از قدیمی‌ترین و پر استفاده‌ترین آن‌هاست. در این آموزش به نحوه ارتباط با پایگاه داده MySQL و روش کار با دیتابیس در PHP می‌پردازیم.

پایگاه داده در یک تعریف خیلی ساده، محلی برای ذخیره و نگهداری داده‌های مورد نیاز ما است. دیتابیس MySQL یک پایگاه داده جدولی و رابطه‌ای است. به این معنا که دیتابیس از جداول ساخته شده و داده‌ها در این جدول‌ها به شکل یک ردیف ذخیره می‌شوند. بین این جداول و ردیف‌ها نیز می‌توان رابطه‌هایی در نظر گرفت.

نحوه کار با دیتابیس در PHP

در حالت کلی وقتی می‌خواهیم با یک دیتابیس کار کنیم، ابتدا باید به سرویس‌دهنده (یا سرور) پایگاه داده متصل شویم. هر پایگاه داده واسطی ارائه می‌کند که برنامه‌نویس به وسیله آن می‌تواند دستورهای خود را اجرا کند.

دیتابیس MySQL به کمک یک زبان ساده به نام SQL فرمان‌های برنامه‌نویس را دریافت کرده و اجرا می‌کند.

برای کار با دیتابیس در PHP باید ابتدا به سرور آن متصل شده و سپس دستورهای مورد نظرمان را اجرا کنیم. دستورهای ما می‌تواند یک نتیجه به همراه داشته یا نداشته باشد. مثلاً اگر بخواهیم اطلاعات یک فرد را در دیتابیس ذخیره کنیم، به جز نتیجه ذخیره‌سازی اطلاعات دیگری نیاز نخواهیم داشت. اما اگر بخواهیم لیست تمام افراد با نام omid را استخراج کنیم، باید انتظار یک خروجی را نیز داشته باشیم.

در این آموزش از روش mysqli در PHP برای کار با دیتابیس استفاده می‌کنیم. روش mysql یک روش قدیمی‌تر و روش PDO در PHP روشی جدیدتر از آن است. در PDO به صورت شئ‌گرا با دیتابیس ارتباط برقرار می‌کنیم.

ارتباط با سرور پایگاه داده MySQL

ساختار کلی دستور اتصال به دیتابیس با mysqli به صورت زیر است:

mysqli_connect( HOST, USERNAME, PASS, DBNAME);

این دستور چهار ورودی می‌گیرد:

  • HOST آدرس سرور پایگاه داده را مشخص می‌کند. معمولاً دیتابیس روی همان سروری قرار دارد که با آن کار می‌کنیم. در اینصورت از localhost یا 127.0.0.1 استفاده می‌کنیم. اگر پایگاه داده شما روی سرور دیگری قرار دارد، باید آدرس یا IP آن را در این ورودی مشخص کنید.
  • USERNAME نام کاربری برای ورود به دیتابیس را مشخص می‌کند. وقتی یک دیتابیس می‌سازید، باید یک حساب کاربری با سطح دسترسی مشخص برای آن ایجاد کنید.
  • PASSWORD رمز عبور حساب کاربری اتصال به دیتابیس است.
  • DBNAME نام دیتابیس را مشخص می‌کند. در یک سرور پایگاه داده ممکن است چندین دیتابیس برای کارهای مختلف وجود داشته باشد. ما باید مشخص کنیم که می‌خواهیم با کدام دیتابیس کار کنیم. اگر هنوز دیتابیسی ندارید، این ورودی را خالی رها کنید، در ادامه یاد می‌گیریم چطور آن را ایجاد کنیم.

این دستور یک مقدار به عنوان خروجی به ما می‌دهد که اصطلاحاً به آن «ارتباط دیتابیس» (Database Connection) می‌گوییم. به این معنی که ارتباط برقرار شده را در خود نگه داشته تا بتوانیم از آن در خطوط بعدی استفاده کنیم.

بنابراین وقتی دستور اتصال به دیتابیس با mysqli را می‌نویسم، خروجی آن را درون یک متغیر نگهداری می‌کنیم. (در اینجا $conn)

$conn = mysqli_connect( "localhost", "omid", "123456");

گاهی اوقات ممکن است به دلیل در دسترس نبودن سرویس پایگاه داده، عملیات اتصال به درستی انجام نشود. به کمک تابع mysqli_connect_errno() می‌توانیم وضعیت اتصال را بررسی کنیم. کافی است متغیر $conn را به عنوان ورودی به آن بدهیم.

اگر خطایی در ارتباط رخ داده باشد، خروجی این تابع مقداری غیر از صفر (در حقیقت شماره خطای اتصال) خواهد بود.

پس بلافاصله پس از دستور اتصال، قطع کد زیر را قرار می‌دهیم تا اگر مشکلی در ارتباط بود، با چاپ یک پیغام، برنامه را متوقف کند.

if( mysqli_connect_errno($conn) ){
   echo "MySQL Connection Failed: " . mysqli_connect_error();
   die();
}

در این کد، از دستور mysqli_connect_error() برای نمایش پایم خطا و از die() برای متوقف کردن اجرای ادامه کد استفاده کرده‌ام.

سازگاری با زبان فارسی در ارتباط دیتابیس PHP

برای اینکه در کار با کاراکترها و رشته‌های فارسی به مشکل برنخوریم، بهتر است charset ارتباط را روی utf8 تنظیم کنیم.

mysqli_set_charset( $conn, "utf8" )

اجرای دستورها در دیتابیس با PHP

حالا که به دیتابیس وصل شدیم، برای اجرای دستورات باید از زبان SQL استفاده کنیم. این زبان خیلی ساده و نزدیک به زبان محاوره هست. با این حال اگر بخواهید به صورت حرفه‌ای با دیتابیس کار کنید، پیشنهاد می‌کنیم بعداً SQL را بیشتر بیاموزید.

هر کاری که با دیتابیس انجام می‌دهیم یک کوئری (Query) محسوب می‌شود. کوئری از یک یا چند دستور تشکیل می‌شود تا هدف ما را اجرایی کند.

به کمک تابع mysqli_query() می‌توان کوئری‌ها را در دیتابیس اجرا کرد. این تابع دو ورودی اجباری می‌گیرید:

  1. ورودی اول$conn است که مشخص می‌کند این دستور باید روی کدام ارتباط از دیتابیس اجرا شود.
  2. ورودی دوم کوئری است که به زبان SQL و به شکل یک رشته متنی تعریف می‌شود. کوئری را می‌توان مستقیماً در ورودی نوشت و یا برای حرفه‌ای‌تر شدن کار، در یک متغیر قرار داده و به تابع بدهیم.

خروجی تابع در صورت موفقیت‌آمیز بودن اجرای کوئری true و در غیر اینصورت false خواهد بود.

mysqli_query( $conn, $query )

من در ادامه کوئری‌های مربوط به هر بخش را در متغیر $query قرار داده و به تابع می‌دهم.

ساخت دیتابیس جدید با PHP

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

$query = "CREATE DATABASE test_db";
mysqli_query( $conn, $query )

این دستور یک دیتابیس با نام test_db در پایگاه داده‌ای که با $conn به آن متصل شده‌ایم ایجاد می‌کند.

اگر قرار است در این دیتابیس مقادیر فارسی هم ذخیره شود، بهتر است کوئری را به شکل زیر تغییر دهیم تا charset دیتابیس روی utf8 تنظیم شود.

$query = "CREATE DATABASE test_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci";

اکنون باید ارتباط خود با سرور پایگاه داده را بر اساس دیتابیس جدیدی که ساختیم به‌روزرسانی کنیم.

$conn = mysqli_connect( "localhost", "omid", "123456", "test_db");

ساخت جدول در دیتابیس MySQL

حال باید جدول یا جدول‌های دیتابیس خود را ایجاد کنیم. جدول‌ها معمولاً با هدف ذخیره‌سازی اطلاعات مرتبط با هم استفاده به کار می‌روند. برای مثال اگر قرار است اطلاعات کاربران را در دیتابیس ذخیره کنیم، یک جدول به نام users ایجاد کرده که هر ردیف آن نشان‌دهنده یکی از کاربران است.

گفتیم که ردیف‌های یک جدول، آیتم‌های داده‌ای ما هستند. ستون‌های جدول مشخص‌کننده ویژگی‌های هر کدام از ردیف‌ها هستند.

همان مثال کاربران را در نظر بگیرید. برای هر کاربر حداقل نیازی که داریم این است که نام کاربری، رمز عبور و شماره عضویت او را نگهداری کنیم. پس جدول ما سه ستون دارد.

به کوئری زیر توجه کنید:

$query = "CREATE TABLE users( username CHAR(15), password CHAR(), id INT )";

این کوئری یک جدول به نام users با ستون‌های username و password و id ایجاد می‌کند که از نوع رشته متنی و عدد هستند.

برای اطمینان از صحت اجرای کوئری، به کمک یک دستور شرطی PHP نتیجه اجرای آن را بررسی می‌کنیم.

if( mysqli_query( $conn, $query ) ){
    echo "Table Created Successfully!";
} else {
    echo "Error: " . mysqli_error($conn);
}

توجه کنید که اگر برنامه شما چندین بار اجرا می‌شود، باید دستورهای ساخت دیتابیس جدید و جدول جدید، صرفاً یک بار اجرا شوند. اگر هر یکی از این دو دستور دوباره اجرا شوند، با خطای دیتابیس / جدول از قبل وجود دارد مواجه خواهیم شد. بهتر است یک تابع برای نصب اولیه برنامه خود ایجاد کرده و این دستورها را در آن اجرا کنید.

آموزش تابع در PHP و ترفندهای کار با Function

آموزش تابع در PHP و ترفندهای کار با Function

ذخیره داده در پایگاه داده

برای ذخیره‌سازی از دستور INSERT در SQL استفاده می‌کنیم. این دستور به صورت زیر تعریف شده و شامل سه بخش اصلی است:

INSERT INTO TABLE_NAME (COL1, COL2, COL3, ...)
 VALUES (VAL1, VAL2, VAL3, ...)
  • ابتدا باید جدولی که می‌خواهیم داده‌ها در آن ذخیره شود را به جای TABLE_NAME مشخص کنیم.
  • سپس ستون‌هایی که قرار است برای آن‌ها مقداری را تعیین کنیم درون پرانتز اول می‌آوریم. این ترتیب می‌تواند با ترتیبی که در ستون‌های جدول دیتابیس وجود دارد متفاوت باشد.
  • درون پرانتز جلوی VALUES هم مقادیر متناظر هر ستون را برای داده جدید مشخص می‌کنیم.

به یک داده جدید در دیتابیس اصطلاحاً یک رکورد دیتابیس (record) گفته می‌شود.

در قطعه کد زیر دو رکورد جدید به دیتابیس با PHP اضافه کرده‌ام:

$query = "INSERT INTO users (username, password, id) VALUES ('test', '123456789', 2)";
mysqli_query( $conn, $query );
 
mysqli_query( $conn, "INSERT INTO users (username, password, id) 
                    VALUES ('newuser', 'new123', 5)" );

می‌بینید که کوئری را یک بار به صورت متغیر و یک بار مستقیماً در تابع نوشته‌ام. هیچ تفاوتی در استفاده از این دو روش وجود ندارد.

اگر بخواهید این داده‌ها را از کاربر دریافت کنید، می‌توانید از فرم‌ها در PHP استفاده کنید.

فراخوانی داده از دیتابیس PHP

از دستور SELECT برای انتخاب داده از جداول دیتابیس استفاده می‌شود. ساختار این دستور به صورت زیر است:

SELECT COLUMN(s) FROM TABLE_NAME

به جای COLUMN(s) می‌توانیم نام ستون‌ها (ویژگی‌های داده) که مورد نظرمان است را قرار دهیم. اگر می‌خواهید همه ویژگی‌های داده‌های جدول را در خروجی داشته باشید، از علامت ستاره (*) استفاده کنید.

وقتی کوئری از نوع SELECT را در دیتابیس توسط PHP اجرا می‌کنیم، داده‌های فراخوانی شده به عنوان خروجی تابع mysqli به ما داده می‌شود. پس این مقدار را در متغیری ذخیره می‌کنیم.

$result = mysqli_query( $conn, "SELECT * FROM users" );

یکی از روش‌های نمایش نتایج از دیتابیس، تبدیل آن‌ها به آرایه در PHP است. برای این کار از تابع mysqli_fetch_array() استفاده می‌کنیم. ورودی این تابع $result است.

با هر بار اجرای تابع fetch روی نتایج کوئری، یکی از رکوردهای به دست آمده به صورت آرایه به ما داده می‌شود. به قطعه کد زیر توجه کنید:

while( $row = mysqli_fetch_array($result) ){

    echo $row['id'] . ": " . $row['username'];
    echo "<br>";
}

در اینجا شناسه کاربری و نام کاربری هر نفر را در یک خط چاپ کرده‌ام.

نمایش اطاعات در جدول

اینکه داده‌های به دست آمده از دیتابیس در PHP را چگونه نمایش دهید، به نیاز شما و پروژه بستگی دارد. یک مثال ساده و کلیشه‌ای، نمایش لیست کاربران در یک جدول است.

در قطعه کد زیر، ابتدا id و username همه رکوردهای جدول users را گرفته و به کمک یک حلقه while آن‌ها را در ردیف‌های جدولی که به html ساخته‌ایم قرار می‌دهیم.

$result = mysqli_query( $con, "SELECT id,username FROM users");

echo "<table><tr><th>ID</th><th>Username</th></tr>";

while( $user = mysqli_fetch_array($result) ){
   echo "<tr>";
   echo "<td>" . $user['id'] . "</td>";
   echo "<td>" . $user['username'] . "</td>";
   echo "</tr>";
}
echo "</table>";

ایجاد شرط در واکشی MySQL

در بخش قبلی همه رکوردهای یک جدول را واکشی کردیم. اگر بخواهیم داده‌های مربوط به یک یا چند ردیف از جدول دیتابیس را واکشی کنیم، از کلمه کلیدی WHERE در انتهای کوئری استفاده می‌کنیم.

در حقیقت به کمک WHERE در SQL می‌توانیم شرط یا شروطی را برای کوئری در نظر بگیریم تا دستور ما روی برخی از رکوردهای جدول اجرا شود.

SELECT COLUMN(s) FROM TABLE_NAME
 WHERE COL_NAME operator VALUE

کوئری زیر شناسه (id) فردی را واکشی می‌کند که نام کاربری‌اش test است.

SELECT id FROM users WHERE username = 'test'

به همین سادگی!

ارسال ایمیل با PHP

ارسال ایمیل با PHP

قطع ارتباط با دیتابیس php

بهتر در انتهای برنامه یا جایی که دیگر احتیاجی به ارتباط دیتابیس ($conn) نداشتیم، ارتباطمان با پایگاه داده را قطع کنیم.

البته اگر این کار را انجام ندهیم و برنامه به درستی تا انتها اجرا شود، ارتباط به صورت خودکار قطع خواهد شد.

برای بستن ارتباط از تابع mysqli_close() استفاده کرده و به عنوان تنها ورودی اجباری آن، متغیر $conn را می‌دهیم.

mysqli_close($conn);

جمع‌بندی و دیتابیس پیشرفته PHP

در این آموزش سعی شد مبانی و اصول ارتباط با دیتابیس در PHP را بررسی کنیم. یاد گرفتیم که این ارتباط چگونه شکل می‌گیرد و چطور باید کارهای اولیه را با آن انجام دهیم. مهارت‌های بیشتر اکثراً وابسته به توانایی نوشتن کوئری‌های پیچیده‌تر است.

اگر می‌خواهید با تمام توابع mysqli آشنا شوید، به این مرجع انگلیسی مراجعه کنید.

ارتباط با دیتابیس با روش mysqli در PHP می‌تواند به صورت شئ‌گرایی هم پیاده‌سازی شود. به اینصورت که ابتدا باید یک شئ mysqli بسازیم. سپس یک شئ از ارتباط در اختیار داریم. به جای اینکه توابع مختلفی را صدا زده و یک متغیر از connetion را به آن بدهیم، می‌توانیم از متدهای این شئ استفاده کنیم.

برای یادگیری متدهای بیشتر این روش می‌توانید آموزش MySQLi شئ‌گرا در PHP را ببینید. اگر در حال گذارند جلسات دوره جامع هستید، در جلسات بعدی به این آموزش می‌رسیم. یادتان باشد که بخش دیدگاه‌ها برای بیان سؤال و تجربه‌های شماست! 🙂

این آموزش بخشی از یک آموزش جامع و قدم به قدم در سبز دانش است: دوره رایگان آموزش PHP