در سایتهای پویا از پایگاه داده برای ذخیرهسازی دادهها استفاده میشود. اتصال به دیتابیس و کار با آن در اکثر پروژهها مورد نیاز است. امکان ارتباط با انواع دیتابیسها در 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()
میتوان کوئریها را در دیتابیس اجرا کرد. این تابع دو ورودی اجباری میگیرید:
- ورودی اول
$conn
است که مشخص میکند این دستور باید روی کدام ارتباط از دیتابیس اجرا شود. - ورودی دوم کوئری است که به زبان 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);
}
توجه کنید که اگر برنامه شما چندین بار اجرا میشود، باید دستورهای ساخت دیتابیس جدید و جدول جدید، صرفاً یک بار اجرا شوند. اگر هر یکی از این دو دستور دوباره اجرا شوند، با خطای دیتابیس / جدول از قبل وجود دارد مواجه خواهیم شد. بهتر است یک تابع برای نصب اولیه برنامه خود ایجاد کرده و این دستورها را در آن اجرا کنید.
ذخیره داده در پایگاه داده
برای ذخیرهسازی از دستور 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
بهتر در انتهای برنامه یا جایی که دیگر احتیاجی به ارتباط دیتابیس ($conn
) نداشتیم، ارتباطمان با پایگاه داده را قطع کنیم.
البته اگر این کار را انجام ندهیم و برنامه به درستی تا انتها اجرا شود، ارتباط به صورت خودکار قطع خواهد شد.
برای بستن ارتباط از تابع mysqli_close()
استفاده کرده و به عنوان تنها ورودی اجباری آن، متغیر $conn
را میدهیم.
mysqli_close($conn);
جمعبندی و دیتابیس پیشرفته PHP
در این آموزش سعی شد مبانی و اصول ارتباط با دیتابیس در PHP را بررسی کنیم. یاد گرفتیم که این ارتباط چگونه شکل میگیرد و چطور باید کارهای اولیه را با آن انجام دهیم. مهارتهای بیشتر اکثراً وابسته به توانایی نوشتن کوئریهای پیچیدهتر است.
اگر میخواهید با تمام توابع mysqli آشنا شوید، به این مرجع انگلیسی مراجعه کنید.
ارتباط با دیتابیس با روش mysqli در PHP میتواند به صورت شئگرایی هم پیادهسازی شود. به اینصورت که ابتدا باید یک شئ mysqli بسازیم. سپس یک شئ از ارتباط در اختیار داریم. به جای اینکه توابع مختلفی را صدا زده و یک متغیر از connetion را به آن بدهیم، میتوانیم از متدهای این شئ استفاده کنیم.
برای یادگیری متدهای بیشتر این روش میتوانید آموزش MySQLi شئگرا در PHP را ببینید. اگر در حال گذارند جلسات دوره جامع هستید، در جلسات بعدی به این آموزش میرسیم. یادتان باشد که بخش دیدگاهها برای بیان سؤال و تجربههای شماست! 🙂
این آموزش بخشی از یک آموزش جامع و قدم به قدم در سبز دانش است: دوره رایگان آموزش PHP
این آموزش برای همیشه رایگانه! میتونید با اشتراکگذاری لینک این صفحه از ما حمایت کنید یا با خرید یه فنجون نوشیدنی بهمون انرژی بدید!
میخوام یه نوشیدنی مهمونتون کنم
سلام من تازه کار هستم وقتی ما اطلاعاتی از قبیل password و username را روی فرم مینویسیم ایا کاربر آنرا مشاهده میکند؟ چطور میتوانیم این فرم را از دید کاربر مخفی کنیم که هیچ دستیابی به این اطلاعات نداشته باشد
سلام
منظورتون رو دقیق متوجه نشدیم! user pass کاربر رو ما روی فرم بنویسیم؟ فرم معمولاً جایی هست که از کاربر اطلاعاتی رو میگیریم؛ پس کاربر مقداری رو وارد میکنه و ما اون رو دریافت میکنیم.
اگر اشتباه متوجه شدیم دقیقتر توضیح بدید تا بتونیم راهنمایی کنیم.
سلام خسته نباشین ممنونم.
سلامت باشید. خوشحالیم براتون مفید بوده
سلام استاد
من اسکریپت املاک رو طراحی کردم و وقتی میخوام نصبش کنم باید برم تو PhpMyAdmin .
نمیشه برای این یه اینستالر ساخت؟؟؟
شما فقط یه نمونه بدید که یه جدول رو با چند خط و ستون توی یه دیتایبسی که اطلاعات رو میدیم ایجاد کنه.
فقط همین کد php رو بدید مممنون میشم
سلام
معمولاً میان یه دستور sql مینویسن تا چک کنه اگه دیتابیسی به فلان نام نبود (یا در سیستمهای عمومیتر، جداولی به این نامها نبود) اون اونها رو ایجاد کنه.
عملاً با دستور CREATE TABLE و شرط if not exists باید کار کنید.
میتونید این کار رو در یه فایل جدا برای نصب انجام بدید یا در ابتدای اجرای اسکریپت.
دمت گرم
خوشحالیم براتون مفید بوده حسین عزیز 🙂
با سلام …
من میخوام اطلاعات درون دیتابیسم بصورت سطری نمایش داده بشه نه ستونی ! آیا این امکانش هست اصلا ؟
منظورم اینه که محتوا دیتابیس ردیف هم قرار بگیرن مثل اطلاعات محصول نمیخوام زیر هم نمایش داده بشه
سلام
منظورتون در نمایش نهاییه؟ یعنی وقتی از دیتابیس واکشی کردید و میخواید نمایش بدید؟ یا توی ساختار خود جداول دیتابیس؟
اگه اولیه هست، که مربوط به front کارتون هست و باید نحوه چاپ و نمایشش رو طوری که میخواید تغییر بدید.
بله قربان منظورم نمایش نهایی بود میشه کمی بیشتر توضیح بدید ؟ یا اگر ممکنه یه کد مثال بزنید برام ممنونتون میشم
این مورد رو باید در کدهای html پیاده کنید. توی این آموزش از جدول برای نمایشش استفاده شده؛ که شما باید مطابق دادههاتون این جدول رو باطراحی کنید.
البته باید بدونید دقیقاً چندتا داده دارید که تعداد ستونها رو بر اساسش تنظیم کنید.
اگه با ساختار table آشنا باشید، ما اون رو سطر به سطر ایجاد میکنیم. شما باید در هر سرط، از تمام دادههایی که واکشی کردید استفاده کنید. مثلاً «اسم» همه کاربرها رو در سطر اول (tr) و در تکتک ستونهاش (tdها) چاپ کنید.
البته زبان برنامه نویسی php & mysql هست
سلام.
اگر بخواهیم اطلاعات جدول مدام بروز شود و با دیتابیس همگام شود (مثلا هر ۵ ثانیه یک بار) باید چیکار کنیم؟
نمیخوام از رفرش استفاده کنم.
سلام
میتونید از javascript برای آپدیت دیتا بدون رفرش صفحه کمک بگیرید؛ مثل روش ajax در php
با سلام
دستورات query در index.php اجرا نمیشود علت را ارسال نماید
سلام
پیشنهاد میکنم گام به گام پیش برید تا متوجه بشید مشکل از کجاست. یعنی ابتدا کوئری رو مستقیماً در دیتابیس اجرا کنید ببینید درسته یا نه؟ بعدش سعی کنید فقط به db وصل بشید و یه سطر رو بخونید. بعدش یه دیتای ثابت ذخیره کنید و در انتها به سراغ گرفتن دادههای فرم برید.
مرسی از شما
اگه join بنویسیم باید در کدها تغییری ایجاد بشه؟؟
خیر نیازی نیست. مشابه روش واکشی داده اقدام کنید نتایج رو خواهید داشت.
همه چیز رو گفتید مرسی از شما
منتظر فیلمهای دوره هاتونم هستم
ممنون بابت لطفتون. در تلاشیم تا یک ماه آینده ویدئوهامون منتشر بشن.
با سلام
من در واکشی مشکلی دارم به تکه کد زیر توجه کنید
دو جدول داریم در یکی موبایل و کد ارسالی تایید کاربر رو ذخیره میکنه
و جدول دوم نام همون کاربر و دو مقدار سن و فامیلی مثلا
حالا مشکل در نمایش :
برا ی ثبت یک کاربر هم دیتابیس و هم در نمایش اوکی .
اما از یکی که بیشتر ثبت کنیم هم کاربر ثبت شده چند بار نمایش داده میشه و هم شماره موبایل با کاربر همخوانی ندارد
ممنون از راهنمایی
سلام
امکانش هست یک نمونه از دیتایی که چند بار نمایش داده میشه و همخوانی نداره بفرستید؟
احساس میکنم برای جستجوی رکوردها در جدول دومی یک مقدار یکتا در نظر نگرفتید! مثلاً یک id برای کاربر یا تکرار موبایل برای شناسایی اینکه اطلاعات برای کدوم کاربر هست…
سلام سپاس از پاسخ شما
timeha.ir/screenshot-timeha.ir-2021.07.25-09_09_24.png
دادهها داخل دیتابیس هم به همین صورت ذخیره شدن؟ یا موقع واکشی اینطوری میشن؟
اگر موقع واکشی هست کوئری دیتابیس PHP و کد نمایشتون رو هم بفرستید. از روی عکس ایدهای ندارم که چرا اینطوری شده!
دو سوال دیگه: همه سطرهای دیتابیس رو fetch میکنید؟ برای سطرها id تعریف کردید؟
سلام
بسیار ممنونم
کد های دیتا رو تغییر دادم بازم نشد ببینید :
جداولی که درست کردید ظاهراً بدون مشکل هستند! البته ضعفهایی درطراحی دیتابیس دارن که برای این مورد شما مشکلی نداره.
کوئری که دیتا رو از دیتابیس میگیرد و حلقهای که نمایشش میدید رو هم بررسی کردید؟
سلام درود
دستور join رو ناقص نوشتید! یک بخش ON هم بعدش داره که مشخص میکنه عملیات join رو روی چه ستونهایی انجام بده.
پیشنهاد میکنم اول جدول یوزرتون یک کلید اصلی ایجاد کنید. بعدش مقدار معادش رو داخل جدول دوم بیارید (شناسایی اینکه هر رکورد جدول دوم مربوط به کدوم یوزره) حالا روی اینها join انجام بدید.
خیلی عالی توضیح دادید