در این مقاله به آموزش اتصال به دیتابیس در برنامه نویسی php میپردازیم و نحوهی ارسال اطلاعات به ديتابيس در PHP را به شما آموزش میدهیم. یکی از جالبترین قسمتهای پیادهسازی یک وب سایت کار با پایگاه داده میباشد و از آن جایی که پایگاه داده بخش خیلی مهمی از پروژه ما است پس باید بتوانیم خیلی خوب با پایگاه داده کار کنیم تا مشکلات امنیتی و یا مشکلاتی نظیر خطا داشتن کدهایمان پیش نیاید. در این قسمت از آموزش قرار است که با هم یاد بگیریم که چگونه میتوان اطلاعات مورد نظرمان را به پایگاه داده ارسال کنیم، با ما همراه باشید.
آماده سازی محیط کار برای ارسال اطلاعات به ديتابيس در PHP
در این آموزش ما تاکید بر استفاده از یک ویرایشگر یا IDE خاصی نداریم و شما با هر ویرایشگری که راحتتر هستید میتوانید کار کنید.
بعد از انتخاب ویرایشگر خود حال شما باید یک وب سرور محلی داشته باشید که دو نوع معروف آن را میتوان به WAMP و XAMPP اشاره کرد که ما به شما پیشنهاد میکنیم وب سرور مجازی XAMPP را بر روی سیستم خود داشته باشید.
ما در این پروژهی کوچک نیاز به سه فایل با نامهای config.php و index.php و process.php داریم، فایل config.php قرار است که تمامی مشخصات مربوط به پایگاهداده را در خود ذخیره سازی کند تا بتوانیم در طول پروژه و زمانی که میخواهیم به پایگاهداده متصل بشویم از آن استفاده کنیم.
در فایل index.php نیز ما کدهای سادهی html خود را درون آن قرار میدهیم نظیر یک فرم که در ادامهی آموزش به طور کامل به آن میپردازیم. در فایل process.php قرار است کدهای PHP که اطلاعات را به سمت پایگاه داده ارسال و ثبت میکند را قرار دهیم.
آماده سازی پایگاه داده برای ارسال اطلاعات به ديتابيس در PHP
قبل از هر پروژهای ما باید ابتدا جداول و فیلدهای پایگاه داده خود را مشخص کنیم، نگاه کلی به این پروژه کوچک این است که ما یک فرم در صفحه index.php خود داشته باشیم و از کاربر اطلاعاتی نظیر نام کاربری، ایمیل و سن او را دریافت کنیم.
اکنون باید پایگاه داده خود را نسبت به کاری که قرار است در پروژه انجام شود طراحی کنیم، ما یک پایگاه داده به اسم پروژهی خودمان میسازیم تا تمامی عملیات پایگاه داده مربوط به پروژهی خود را درون آن داشته باشیم، برای مثال نام پایگاه دادهی خود را myProject قرار میدهیم.
برای ساخت یک پایگاه داده درون mysql همانطور که گفتیم ابتدا باید XAMPP خود را نصب داشته باشیم و Apache و Mysql را Start یا روشن کنیم تا بتوانیم از این دو استفاده کنیم. با وارد کردن آدرس localhost/phpmyadmin در آدرس بار مرورگرمان میتوانیم وارد محیط Phpmyadmin بشویم و از Mysql استفاده کنیم.
باز زدن دکمه new در بالا اسامی پایگاه داده میتوانیم یک پایگاه داده ایجاد کنیم.
بعد از کلیک کردن بر روی دکمه new در صفحه باز شده ما باید نام پایگاه داده و Encoding آن را وارد کنیم، همانطور که در قبل هم گفته شد نام پایگاه داده خود را myProject میگذاریم و Encoding پایگاه داده را نیز utf8mb4_general_ci قرار میدهیم که مناسبترین و سازگارترین نوع برای کلمات فارسی نیز میباشد. بعد از وارد کردن این موارد بر روی دکمه create بزنید تا پایگاه داده شما ایجاد شود.

بعد از ایجاد شدن پایگاه داده الان نوبت آن است که جدول مورد نظر خودمان را بسازیم تا بتوانیم دادههای مورد نظرمان را به صورت منظم درون یک جدول داشته باشیم.
بعد از اینکه ما پایگاه داده خود را ساختیم به طور خودکار وارد صفحهای میشویم که از ما میخواهد جدول مورد نظرمان را ایجاد کنیم.
در فیلد Name ما باید نام جدول خود را قرار دهیم که در پروژهی ما قرار است اطلاعاتی مربوط به کاربران را درونش ذخیره سازی کنیم پس با این اوصاف نام جدول خود را users قرار میدهیم. بعد از قرار دادن نام جدول حال باید تعداد فیلدهای جدول خود را درون Number of columns مشخص کنیم. همانطور که در بالاتر نیز گفته شد قرار است نام کاربری، ایمیل و سن کاربر را ذخیره سازی کنیم پس نتیجه میگیریم که ما نیاز به چهار فیلد داریم.
شاید با خودتان بگویید که اینها فقط سه فیلد است پس چرا چهار فیلد؟ باید به شما بگوییم که همهی جداول درون پایگاه داده یک فیلد به نام id نیاز دارد که یک عدد منحصر به فرد است و برای هر record یا اطلاعاتی که درون پایگاه داده ثبت میشود یک عدد منحصر به فرد برای آن اختصاص مییابد تا بتوان با آن عدد record مورد نظرمان را شناسایی کنیم.
بعد از وارد کردن نام جدول و تعداد فیلدهای آن بر روی دکمه go کلیک میکنیم تا به صفحهای که باید نوع و اسامی فیلدهای جدول خودمان را وارد کنیم برویم.

همانطور که شما انتخاب کردید چهار فیلد برای ما آماده شده است تا ما نام، نوع و دیگر خصوصیات آنها را وارد کنیم، در بخش Name نام ستونهایی که از قبل هم گفته شد میآوریم. به ترتیب از سمت چپ به راست id، username، email، age را در ستون Name وارد میکنیم.
حال باید type و یا نوع آنها را مشخص کنیم، برای id، ما int قرار میدهیم تا عددهای منحصر به فرد درونش قرار بگیرد، برای فیلد id ما دو ویژگی دیگر که یکی به اسمهای Auto Increment که با A_I در Mysql شناخته میشود و باید تیک آن زده شود و دیگری ستون Index برای اینکه مشخص کنیم این عدد منحصر به فرد است، در گزینههایی که دارد ما گزینه PRIMARY را انتخاب میکنیم تا عددی که تولید میشود یکتا باشد.

برای فیلدهای username، email ما نوع آنها را VARCHAR انتخاب میکنیم تا بتوانیم دادهی رشتهای وارد کنیم، ویژگی دیگری که باید برای این دو تنظیم کنیم طول رشته است که ستون Length/Values قابل تنظیم است، شما میتوانید طول 255 را برای هر دو قرار دهید تا 255 کاراکتر را بتوان درون ستونها وارد کرد.

و درنهایت برای فیلد age ما باید نوع آن را int و طول آن را سه رقم قرار دهیم چون در حال حاضر ما سنی بزرگتر از سه رقم نداریم. بر روی دکمه Save کلید کنید تا جدول تعریف شدهی شما ساخته شود.

آماده سازی فایل config.php برای ارسال اطلاعات به ديتابيس در PHP
همانطور که گفته شد ما درون فایل config.php مشخصات مربوط به پایگاه داده خود را قرار میدهیم و در آن به پایگاه داده متصل میشویم، این مشخصات شامل نام هاست، نام پایگاه داده، نام کاربری پایگاه داده و رمز پایگاه داده است. ما قصد داریم این اطلاعات را به صورت یک آرایه درون فایل config.php داشته باشیم.
<?php
$database = [
'host' => 'localhost',
'dbname' => 'myProject',
'user' => 'root',
'pass' => ''
];
در کد بالا ما یک آرایه به نام database تعریف کردهایم که از نوع Associative array است، که ما این اطلاعات را در آن ذخیره میکنیم:
- host که در وب سرورهای محلی با نام localhost شناخته میشود.
- dbname که نام پایگاه داده ما است.
- user نام کاربری ورود به Mysql که به طور پیشفرض root است.
- و pass که رمز عبور Mysql ما است و به طور پیش فرض خالی یا هیچی است.
try {
$db = new PDO("mysql:host={$database['host']};dbname={$database['dbname']}", $database['user'], $database['pass']);
} catch (PDOException $e) {
die("An error happend, Error: " . $e->getMessage());
}
کد اتصال به پایگاه داده را ما درون یک بلاک try و catch گذاشتیم که اگر خطایی در اتصال به پایگاه داده وجود داشت بتوانیم آن را کنترل کنیم.
درون بخش try ما آمدهایم از PDO برای اتصال به پایگاه داده استفاده کردهایم، از آن جایی که PDO یک شئ است (درباره مبحث شئ گرایی به طول کامل درون دوره آموزشPHP تدریس شده است) ما باید یک از کلمه new برای ساختن یک نمونه از آن استفاده کنیم، درون PDO ما نوشتهایم که:mysql، به این معناست که پایگاه داده ما Mysql است، کلمهی بعدی که host است باید نام host خود را مشخص کنیم که ما آن را درون آرایهای که مشخصات پایگاه داده را در اختیار داشت فراخوانی کردهایم، دو براکت {} بین متغیر برای جلوگیری از تداخل بین رشته و متغیر است.
در ادامه ما با یک ; (سمی کالمن) دو مقدار را از هم جدا کردهایم، رو به روی کلمه dbname ما نام پایگاه داده خود را آوردهایم. در خارج از رشته ما نام کاربری و رمز عبور را فراخوانی کردهایم. در نهایت نیز اتصال پایگاه داده را درون متغیر db نگه داشتهایم.
بلاک catch نیز زمانی اجرا میشود که خطایی در بلاک try رخ دهد و اگر خطایی رخ دهد تابع die اجرا میشود که خطا را چاپ و برنامه را متوقف میکند.
آموزش ساخت فرم در سایت با php و mysql
درون فایل index.php ما باید فرم خود را قرار دهیم تا کاربر بتواند اطلاعات خود را درونش وارد کند و آنها را درون پایگاه داده ذخیره کنیم. از آن جایی که هدف این آموزش، آموزش html و css نیست ما یک نمونه فرم برای شما آماده کردهایم پیشنهاد میکنیم برای اینکه وقتتان ذخیره شود از همین کدهای زیر استفاده کنید.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert data to database</title>
<style>
.container {
margin: 20px auto;
width: 24%;
text-align: left;
border: 1px solid #eee;
padding: 14px 26px;
border-radius: 6px;
}
.form-control {
padding: 8px;
}
input {
border-radius: 5px;
border: 1px solid #eee;
padding: 8px 9px;
}
input#age {
margin-left: 43px;
}
input#email {
margin-left: 27px;
}
input[type="submit"] {
background-color: dodgerblue;
color: white;
cursor: pointer;
}
label {
margin-right: 22px;
}
</style>
</head>
<body>
<div class="container">
<form action="process.php" method="post">
<div class="form-control">
<label for='username'>Username</label>
<input type="text" id="username" name="username" placeholder="Enter your username" autocomplete="off">
</div>
<div class="form-control">
<label for='email'>Email</label>
<input type="email" id="email" name="email" placeholder="Enter your email" autocomplete="off">
</div>
<div class="form-control">
<label for='age'>age</label>
<input type="text" id="age" name="age" placeholder="Enter age username" autocomplete="off">
</div>
<div class="form-control">
<input type="submit" value="Submit">
</div>
</form>
</div>
</body>
</html>
نکتهای که درون کد بالا وجود دارد این است که ما action فرم را به فایل process.php متصل کردهایم و متد فرم را نیز POST قرار دادهایم.
نکتهی دیگر این است که اگر ما بخواهیم به مقادیر وارد شده درون فرم دسترسی داشته باشیم باید به inputهای فرم name بدهیم که ما این کار را در فرم بالا کردهایم و برای هر input یک name مطابق با نام آن قرار دادهایم.
ذخیره اطلاعات فرم در دیتابیس
به بخش جذاب این پروژهی کوچک رسیدهایم که قرار است آموزش اتصال فرم به دیتابیس را به شما بگوییم تا بتوانیم اطلاعاتمان را در پایگاه داده ثبت کنیم، در فایل index.php که فرم ما درون آن وجود دارد وقتی که فیلدهای فرم توسط کاربر پر میشوند و دکمه Submit یا ارسال فشرده میشود اطلاعات فرم به سمت فایل process.php ارسال میشود و تمامی اطلاعات از طریق آرایه Super global به نام POST قابل دسترس است. برای مثال بیایید دادههایی که به سمت فایل process.php میآید را چاپ کنیم تا مشاهده کنیم شامل چه محتوایی میباشد.
برای این کار شما ابتدا درون فایل process.php آرایه POST را print_r کنید، با print_r میتوان آرایههای مختلف را چاپ کرد و محتوای آنها را دید.
<?php
print_r($_POST);
درون فایل process.php این کد را قرار دادهایم حال بیایید شروع به وارد کردن دادهی درون فرم کنیم و آن را ارسال کنیم.
دادهای که در بالا وارد کردیم را ارسال میکنم و در صفحهی process.php ما به این خروجی دست مییابیم.
همانطور که در قبل گفتیم مقادیر فرم توسط name آن قابل دسترس است، در اینجا نیز شما مشاهده میکنید که name فرم به ایندکس آرایه درون POST در آمده و مقدار درون فیلد نیز به عنوان value قرار گرفته پس ما میتوانیم به راحتی با استفاده از ایندکس آنها به مقدار هر فیلد دسترسی داشته باشیم.
حال که میتوانیم به مقادیر فرم دسترسی داشته باشیم کوئری یا دستور ارسال داده به پایگاه داده را نیز مینویسیم.
ابتدا برای اینکه بتوانیم از ارتباطی که در فایل config.php ایجاد کردهایم استفاده کنیم باید فایل config.php را include کنیم.
include_once 'config.php';
مطمئن بشوید include بالا قبلتر از هر کدی انجام شده است تا بتوانید در ادامه از ارتباط پایگاه داده استفاده کنیم.
در ادامه میخواهیم بررسی کنیم که آیا مقادیری که قرار است ارسال بشود توسط کاربر پر شده است یا خیر؟شرطهای بررسی مقادیر ارسال شده
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if (isset($_POST['username']) and isset($_POST['email']) and isset($_POST['age'])) {
if (!empty($_POST['username']) and !empty($_POST['email']) and !empty($_POST['age'])) {
# data is valid
}
}
}
در کد بالا ما چندین شرط قرار دادهایم تا تقریبا از صحت داده ارسال شده مطمئن شویم، شرط اول بررسی میکند که آیا متد درخواستی (Request method) که آمده است از نوع POST است به این معناست که فرم ارسال شده است؟ در شرط خط دوم ما بررسی کردهایم که آیا مقادیر username، email، age در آرایه POST وجود دارد یا خیر؟ و در شرط خط سوم بررسی کردهایم که مقادیر ارسال حاوی اطلاعات پوچ یا خالی نباشد.
حال اگر آن سه شرط true شود، کد ما درون بلاک آخرین if اجرا میشود، نوبت آن است که کد مربوط به ارسال اطلاعات را درون آخرین بلاک بنویسیم.
ما قصد داریم که کدهای مربوط ارسال اطلاعات به پایگاه داده را درون یک تابع قرار بدهیم تا هم کد تمیزتر داشته باشیم و هم بتوانیم از کدمان در قسمتهای مختلف استفاده کنیم. ما تابع را پایینتر از شروط if تعریف میکنیم.
ارسال اطلاعات به ديتابيس در PHP
<?php
include_once 'config.php';
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if (isset($_POST['username']) and isset($_POST['email']) and isset($_POST['age'])) {
if (!empty($_POST['username']) and !empty($_POST['email']) and !empty($_POST['age'])) {
# data is valid
}
}
}
function insertUserData($username, $email, $age)
{
global $db;
$sql = "INSERT INTO users (username, email, age) VALUES (:username, :email, :age)";
$stmt = $db->prepare($sql);
$stmt->execute([':username' => $username, ':email' => $email, ':age' => $age]);
return $stmt->rowCount();
}
همانطور که میبینید ما یک تابع به اسم insertUserData تعریف کردهایم و پارامتر ورودی برای تابع به نامهای username، email، id در نظر گرفتهایم. درون تابع ما متغیر db را که درون فایل config.php است global کردهایم شاید بپرسید چرا؟ برای اینکه بتوانیم از متغیرهای تعریف شده درون پروژهمان در توابع استفاده کنیم باید کلید global را قبل از نام متغیر قرار بدهیم تا درون بلاک تابع قابل دسترس باشد.
در خط بعدی ما کوئری ارسال اطلاعات به پایگاه داده را نوشتهایم و درون متغیر sql قرار دادهایم. تنها جایی که در کوئری نیاز به توضیح دارد قسمت پرانتز بعد از VALUES میباشد. در داخل پرانتز ما آمدهایم یک سری کلیدها با نامهای مرتبط قرار دادهایم، چرایی این کار این است که اگر مقادیر وارد شده معتبر نباشد و هدف آن SQL Injection باشد (در مقاله آموزش کامل امنیت در PHP درباره SQL Injection صحبت کردهایم و راحل رفع آن را نیز گفتهایم) جلوی این حمله را گرفته باشیم پس به خاطر همین است که ما مقادیر ورودی را به طور مستقیم درون کوئری قرار ندادهایم.
در ادامه کد کوئری را درون تایع prepare قرار دادهایم تا کوئری ما را آمادهی اجرا کردن کند و محتوای آن را بررسی کند، مقدار prepare شده کوئری را درون متغیر stmt قرار دادهایم تا بتوانیم کوئری را در ادامه اجرا کنیم، در ادامه ما از متغیر stmt تابع execute را صدا زدهایم تا کلیدهایی که درون کوئری تعریف کردهایم با مقادیر اصلیشان جایگذاری کنیم و کوئری را اجرا کنیم. برای این کار کافی است در بین پرانتزهای تابع execute یک آرایه (درست مثل آرایه Associative) را به عنوان ورودی تابع بدهیم. که Indexهای آرایه مقدار کلیدهای تعریف شده درون کوئری است. و valueهای آرایه ورودیهای تابع است. در نهایت نیز از stmt تابع rowCount را صدا میزنیم تا برای ما تعداد فیلدهایی که تحت تاثیر این کوئری قرار گرفته است را برگرداند، واگر این کوئری به درستی کار کند عدد یک را برای ما بر میگرداند.
ارسال نهایی اطلاعات به ديتابيس در PHP
تا اینجا که فهمیدیم تابع ما چه کار میکند، باید از آن درون کدمان استفاده کنیم و دادههای ارسال شده را در پایگاه داده ذخیره کنیم، برای این کار کافی است تابع را در داخلیترین بلاک if شروط بالا قرار دهیم.
<?php
include_once 'config.php';
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if (isset($_POST['username']) and isset($_POST['email']) and isset($_POST['age'])) {
if (!empty($_POST['username']) and !empty($_POST['email']) and !empty($_POST['age'])) {
$result = insertUserData($_POST['username'], $_POST['email'], $_POST['age']);
}
}
}
function insertUserData($username, $email, $age)
{
global $db;
$sql = "INSERT INTO users (username, email, age) VALUES (:username, :email, :age)";
$stmt = $db->prepare($sql);
$stmt->execute([':username' => $username, ':email' => $email, ':age' => $age]);
return $stmt->rowCount();
}
در بالا ما تابع insertUserData که نوشتهایم را صدا میزنیم و به ترتیب مقادیر را به آن پاس میدهیم و مقدار خروجی تابع را درون یک متغیر به اسم result قرار میدهیم.
حال اگر به فرم ساخته شده درون index.php مراجعه کنیم و فیلدها را پر کنیم و بر روی دکمهی submit یا ارسال بزنیم اطلاعات در پایگاه داده ذخیره میشوند و ما به صفحه process.php انتقال داده میشویم. اگر بخواهید مطمئن شوید که اطلاعات در پایگاه داده ذخیره شده است یا خیر میتوانید وارد phpmyadmin خود شوید و درون جدول users مقدار ثبت شده را مشاهده خواهید کرد.
مشکلی که ممکن است در این قسمت به وجود بیاید این است که شما به process.php منتقل میشوید و وقتی در همان صفحه، صفحه را Refresh میکنید اطلاعات دوباره به پایگاه داده ارسال میشود، در ادامه راه حل برطرف کردن این مشکل را به شما میگوییم.
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if (isset($_POST['username']) and isset($_POST['email']) and isset($_POST['age'])) {
if (!empty($_POST['username']) and !empty($_POST['email']) and !empty($_POST['age'])) {
$result = insertUserData($_POST['username'], $_POST['email'], $_POST['age']);
if ($result) {
header('location: index.php?s=1');
exit;
} else {
header('location: index.php?s=0');
exit;
}
}
}
}
اگر به خاطر داشته باشید ما خروجی تابع را درون متغیر result قرار میدادیم، پس با همین متغیر میتوانیم مشکلمان را حل کنیم. اگر تابع به درستی اجرا شود مقدار درون result برابر با عدد یک میشود و اگر به درستی انجام نشود مقدار صفر که به معنای false است قرار میگیرد.
در ادامه ما مقدار درون result را در یک شرط بررسی میکنیم، اگر مقدار result برابر با یک بود وارد بلاک if میشود و ما را با کمک تابع header به index.php ارسال میکند، اما با یک مقدار اضافه در url که s=1 است. s حرف اول کلمه success است برای اینکه تشخیص بدهیم اطلاعات با موفقیت در پایگاه داده ثبت شدهاند یا خیر. اگر مقدار result یک نبود وارد بلاک else میشود و ما را به صفحه index.php بر میگرداند اما با s=0 که نشان میدهد اطلاعات با موفقیت درون پایگاه داده ثبت نشدهاند.
exit بعد از header برای این است که بعد از اجرا شدن تابع header ادامهی کدهای درون آن صفحه خوانده نشوند و از همان جا خارج شود.
تمرین
در نهایت یک تمرین برای شما در نظر گرفتهایم، با مقداری که از طریق url به صفحهی index.php ارسال میشود پیام مرتبط چاپ کنید، برای مثال اگر s برابر با یک بود پیام موفقیت آمیز بدهید.
جمع بندی:در مقالهی ارسال اطلاعات به ديتابيس در PHP ، ما ابتدا محیط کار خودمان را آماده سازی کردیم و بعد از آن پایگاه داده خود را طراحی کردیم و شروع به اضافه کردن تنظیمات مربوط به پایگاه داده درون فایل config.php کردیم. بعد از آن یک فرم مناسب در صفحه index.php قرار دادیم و شروع به کد نویسی اصلی پروژهمان که در فایل process.php بود کردیم و یاد گرفتیم که چگونه میتوانیم اطلاعاتمان را با روشی درست و مناسب به سمت پایگاه داده ارسال کنیم و حتی جلوی مشکلی که پیش میآمد را نیز گرفتیم. امیدواریم که از این مقاله بهره کافی را برده باشید. اگر در انجام این کار سوال یا مشکلی داشتید خوشحال میشویم که در بخش نظرات با ما به اشتراک بگذارید.
اگر به یادگیری بیشتر در زمینهی PHP علاقه داری، با شرکت در دورهی آموزشی متخصص PHP در کمتر از یکسال به یک متخصص PHP تبدیل میشوی که آمادهی استخدام، دریافت پروژه، کسب درآمد و یادگیری مباحثی مثل لاراول هستی.