
آموزش برنامه نویسی PHP-جلسه بیستم
خیلی وقتها امکان دارد در کلاسها و توابعی که استفاده میکنیم دادهای که داره به تابع پاس میشه چک نشه که چه نوع داده ای هست.
Table of contents [Show]
- 1 Iterable در PHP چیست؟
- 2 Iterable در PHP چه مفهومی دارد؟
- 3 چرا از Iterable استفاده میکنیم؟
- 4 مثال ساده از Iterable
- 5 اگر مقدار نامعتبر به Iterable ارسال شود چه اتفاقی میافتد؟
- 6 Iterable به عنوان Return Type
- 7 مثال کامل Return Type با Iterable
- 8 Iterable فقط Array نیست
- 9 Iterable و Generator
- 10 بررسی Iterable بودن یک مقدار
- 11 تفاوت Iterable و Array
- 12 PHP و پایگاه داده چیست؟
- 13 Database چیست؟
- 14 MySQL چیست؟
- 15 PHP چگونه با MySQL ارتباط برقرار میکند؟
- 16 SQL چیست؟
- 17 مثال ساده SQL
- 18 MySQL چه تفاوتی با SQL دارد؟
- 19 دیتابیس رابطهای چیست؟
- 20 انواع معروف پایگاه داده
- 21 چرا MySQL در پروژههای PHP محبوب است؟
- 22 ارتباط PHP با MySQL در پروژههای واقعی
- 23 روشهای ارتباط PHP با MySQL
- 24 استفاده از Prepared Statement
- 25 اهمیت امنیت در ارتباط PHP و Database
- 26 ارتباط Iterable با کار با Database
- 27 جمعبندی
Iterable در PHP چیست؟
در PHP زمانی که با مجموعهای از دادهها کار میکنیم، یکی از روشهای رایج برای پیمایش اطلاعات استفاده از حلقه foreach است.
برای مثال اگر یک آرایه داشته باشیم، میتوانیم به کمک foreach تمام عناصر آن را یکییکی بررسی کنیم:
<?php
$names = ["Ali", "Sara", "Reza"];
foreach ($names as $name) {
echo $name;
}
?>
اما در پروژههای واقعی همیشه نمیتوانیم فرض کنیم دادهای که به یک تابع ارسال میشود حتماً یک آرایه است. PHP نوع دادهای به نام Iterable در اختیار ما قرار داده است که برای مشخص کردن دادههایی استفاده میشود که قابلیت پیمایش با foreach را دارند.
Iterable در PHP چه مفهومی دارد؟
iterable یک نوع داده (Type) در PHP است که میتواند دادههایی را بپذیرد که قابلیت پیمایش با foreach دارند.
در PHP، iterable شامل موارد زیر میشود:
- آرایهها (
array) - اشیایی که
Traversableهستند - Iteratorها
- Generatorها
بنابراین یک نکته مهم این است که iterable فقط به معنی «آرایه» نیست.
برای مثال:
function printIterable(iterable $items)
{
foreach ($items as $item) {
echo $item;
}
}
در اینجا PHP انتظار دارد مقدار ارسالشده به $items قابل پیمایش باشد.
چرا از Iterable استفاده میکنیم؟
فرض کنید تابعی داریم که قرار است با foreach روی دادههای ورودی حرکت کند:
function printItems($items)
{
foreach ($items as $item) {
echo $item;
}
}
در این حالت نوع ورودی تابع مشخص نیست.
ممکن است برنامهنویس دیگری به اشتباه مقدار نامناسبی برای تابع ارسال کند.
اما با استفاده از Type Declaration میتوانیم مشخص کنیم که ورودی تابع باید iterable باشد:
function printItems(iterable $items)
{
foreach ($items as $item) {
echo $item;
}
}
اکنون تابع فقط دادهای را قبول میکند که PHP آن را iterable تشخیص دهد.
این موضوع باعث میشود کد قابل پیشبینیتر و خطاهای ناشی از ورودی نامعتبر کمتر شوند.
مثال ساده از Iterable
در مثال زیر یک آرایه به تابع ارسال میکنیم:
<?php
function printIterable(iterable $myIterable)
{
foreach ($myIterable as $item) {
echo $item;
}
}
$arr = ["a", "b", "c"];
printIterable($arr);
?>
خروجی:
abc
چون $arr یک Array است و Array در PHP قابلیت پیمایش دارد، ارسال آن به پارامتر iterable معتبر است.
اگر مقدار نامعتبر به Iterable ارسال شود چه اتفاقی میافتد؟
اگر تابعی به صورت زیر تعریف شده باشد:
function printIterable(iterable $items)
{
foreach ($items as $item) {
echo $item;
}
}
و یک مقدار نامعتبر مانند یک عدد یا Boolean به آن ارسال شود، PHP خطای TypeError ایجاد میکند.
برای مثال:
printIterable(123);
این مقدار iterable نیست و نمیتواند به عنوان ورودی معتبر برای این تابع استفاده شود.
این ویژگی یکی از مزایای Type Declaration در PHP است، زیرا خطا را نزدیک به محل ورود داده نامعتبر مشخص میکند.
Iterable به عنوان Return Type
iterable فقط برای ورودی توابع استفاده نمیشود.
میتوانیم مشخص کنیم که یک تابع باید یک مقدار iterable برگرداند.
برای این کار بعد از پرانتز تابع از : iterable استفاده میکنیم:
function getIterable(): iterable
{
return ["a", "b", "c"];
}
سپس:
$myIterable = getIterable();
foreach ($myIterable as $item) {
echo $item;
}
در اینجا مشخص کردهایم مقدار برگشتی تابع باید قابل پیمایش باشد.
مثال کامل Return Type با Iterable
<?php
function getIterable(): iterable
{
return ["PHP", "MySQL", "HTML"];
}
$items = getIterable();
foreach ($items as $item) {
echo $item . "<br>";
}
?>
خروجی:
PHP
MySQL
HTML
استفاده از Return Type باعث میشود قرارداد تابع مشخص باشد و سایر بخشهای برنامه بدانند چه نوع مقداری از تابع دریافت خواهند کرد.
Iterable فقط Array نیست
یکی از نکات مهم در مورد iterable این است که تصور نکنیم:
iterable = array
این دو دقیقاً یکسان نیستند.
iterable یک مفهوم گستردهتر است و علاوه بر Array، اشیایی را نیز شامل میشود که قابلیت پیمایش دارند.
برای مثال:
function showItems(iterable $items)
{
foreach ($items as $item) {
echo $item;
}
}
این تابع میتواند با یک Array یا یک Iterator مناسب کار کند.
این قابلیت به خصوص در پروژههای بزرگ که دادهها ممکن است از منابع مختلف تولید شوند، اهمیت پیدا میکند.
Iterable و Generator
یکی از کاربردهای مهم Iterable در PHP، کار با Generatorها است.
Generatorها به ما اجازه میدهند دادهها را به صورت مرحلهای تولید کنیم، بدون اینکه لازم باشد تمام دادهها را همزمان در حافظه قرار دهیم.
برای مثال:
function numbers(): iterable
{
yield 1;
yield 2;
yield 3;
}
foreach (numbers() as $number) {
echo $number . "<br>";
}
خروجی:
1
2
3
در پروژههایی که با حجم زیادی از دادهها کار میکنند، Generator میتواند به کاهش مصرف حافظه کمک کند.
بررسی Iterable بودن یک مقدار
در PHP میتوانیم برای بررسی اینکه یک مقدار قابل پیمایش است یا خیر، از is_iterable() استفاده کنیم.
مثال:
$value = ["a", "b", "c"];
if (is_iterable($value)) {
echo "This value is iterable.";
}
خروجی:
This value is iterable.
مثلاً:
$value = "Hello";
if (is_iterable($value)) {
echo "Iterable";
} else {
echo "Not iterable";
}
در این حالت رشته معمولی iterable محسوب نمیشود.
بنابراین:
is_iterable($value)
یک روش مناسب برای بررسی قابلیت پیمایش یک مقدار است.
تفاوت Iterable و Array
تفاوت مهم این دو را میتوان به صورت زیر خلاصه کرد:
| ویژگی | Array | Iterable |
|---|---|---|
| نوع داده مشخص | بله | یک Type برای مقادیر قابل پیمایش |
| شامل Array | بله | بله |
| شامل Iterator | خیر | بله |
| قابل استفاده با foreach | بله | بله |
| قابل استفاده به عنوان Type Declaration | بله | بله |
| مناسب برای دادههای قابل پیمایش مختلف | محدودتر | انعطافپذیرتر |
PHP و پایگاه داده چیست؟
تقریباً بیشتر وبسایتها و برنامههای تحت وب با دادههایی سروکار دارند.
برای مثال در یک فروشگاه اینترنتی اطلاعاتی مانند موارد زیر باید ذخیره شوند:
- اطلاعات کاربران
- نام محصولات
- قیمت محصولات
- سفارشها
- اطلاعات پرداخت
- دستهبندی محصولات
- نظرات کاربران
- تاریخ ثبت سفارش
ذخیره کردن این حجم از اطلاعات در فایلهای معمولی، مدیریت دادهها را بسیار دشوار میکند.
به همین دلیل از Database یا پایگاه داده استفاده میکنیم.
پایگاه داده سیستمی است که برای ذخیره، سازماندهی، جستوجو، تغییر و مدیریت اطلاعات استفاده میشود.
Database چیست؟
Database یا پایگاه داده مجموعهای سازمانیافته از اطلاعات است که به شکلی ساختاریافته ذخیره میشود.
برای مثال ممکن است یک فروشگاه اینترنتی جدولی به نام users داشته باشد:
| id | name | |
|---|---|---|
| 1 | Ali | ali@example.com |
| 2 | Sara | sara@example.com |
| 3 | Reza | reza@example.com |
و جدول دیگری برای محصولات داشته باشد:
| id | name | price |
|---|---|---|
| 1 | Laptop | 50000 |
| 2 | Mouse | 1000 |
| 3 | Keyboard | 2500 |
پایگاه داده به برنامه اجازه میدهد این اطلاعات را ذخیره و در زمان نیاز بازیابی کند.
MySQL چیست؟
MySQL یکی از سیستمهای مدیریت پایگاه داده رابطهای (RDBMS) است.
در MySQL اطلاعات معمولاً در قالب جدولهایی ذخیره میشوند و بین جدولها میتوان روابط مختلفی ایجاد کرد.
برای مثال یک فروشگاه اینترنتی میتواند جدولهای زیر را داشته باشد:
users
products
orders
order_items
categories
هر جدول اطلاعات مربوط به یک بخش از سیستم را نگهداری میکند.
PHP چگونه با MySQL ارتباط برقرار میکند؟
PHP خودش Database نیست.
PHP یک زبان برنامهنویسی سمت سرور است و میتواند با سیستمهای مدیریت پایگاه داده مختلف ارتباط برقرار کند.
یکی از رایجترین انتخابها برای پروژههای PHP، MySQL یا سیستمهای سازگار با آن است.
به طور ساده میتوان ارتباط را اینگونه تصور کرد:
کاربر
↓
وبسایت
↓
PHP
↓
MySQL
↓
Database
برای مثال کاربر در یک فرم ثبتنام، نام و ایمیل خود را وارد میکند.
PHP اطلاعات فرم را دریافت میکند و با استفاده از Query مناسب آن را در MySQL ذخیره میکند.
SQL چیست؟
برای کار با بسیاری از پایگاه دادههای رابطهای از زبان SQL استفاده میشود.
SQL مخفف:
Structured Query Language
به معنی «زبان پرسوجوی ساختیافته» است.
SQL یک زبان استاندارد برای کار با دادههای پایگاه دادههای رابطهای است.
با SQL میتوان عملیات مختلفی مانند موارد زیر را انجام داد:
- ایجاد جدول
- اضافه کردن اطلاعات
- دریافت اطلاعات
- ویرایش اطلاعات
- حذف اطلاعات
- جستوجو در دادهها
- مرتبسازی اطلاعات
- ایجاد ارتباط بین جدولها
مثال ساده SQL
برای دریافت اطلاعات از یک جدول میتوان از دستور SELECT استفاده کرد:
SELECT * FROM users;
این Query اطلاعات موجود در جدول users را دریافت میکند.
برای اضافه کردن یک کاربر:
INSERT INTO users (name, email)
VALUES ('Ali', 'ali@example.com');
برای تغییر اطلاعات:
UPDATE users
SET name = 'Reza'
WHERE id = 1;
و برای حذف:
DELETE FROM users
WHERE id = 1;
این دستورات بخشی از زبان SQL هستند و PHP میتواند آنها را برای اجرا به سیستم پایگاه داده ارسال کند.
MySQL چه تفاوتی با SQL دارد؟
این دو مفهوم را نباید با یکدیگر اشتباه گرفت.
SQL یک زبان برای کار با پایگاه دادههای رابطهای است.
اما MySQL یک سیستم مدیریت پایگاه داده است که از SQL برای کار با دادهها استفاده میکند.
به زبان ساده:
SQL
↓
زبان کار با دادهها
MySQL
↓
سیستم مدیریت پایگاه داده
برای مثال:
SELECT * FROM users;
یک دستور SQL است.
این دستور میتواند در MySQL اجرا شود.
دیتابیس رابطهای چیست؟
MySQL یک سیستم مدیریت پایگاه داده رابطهای است.
در پایگاه دادههای رابطهای، اطلاعات معمولاً در جدولها ذخیره میشوند و میتوان بین جدولها ارتباط ایجاد کرد.
فرض کنید یک فروشگاه داریم.
جدول کاربران:
users
جدول سفارشها:
orders
هر سفارش میتواند متعلق به یک کاربر باشد.
در چنین ساختاری معمولاً از شناسههایی مانند id و user_id برای ایجاد ارتباط بین دادهها استفاده میشود.
مثلاً:
users
----------------
id | name
1 | Ali
2 | Sara
orders
----------------
id | user_id
10 | 1
11 | 2
در این مثال سفارش شماره 10 مربوط به کاربری با id = 1 است.
انواع معروف پایگاه داده
امروزه سیستمهای مدیریت پایگاه داده متنوعی وجود دارند و انتخاب آنها به نیاز پروژه، حجم داده، معماری سیستم و سایر عوامل بستگی دارد.
برخی از سیستمهای شناختهشده عبارتاند از:
MySQL
MySQL یک سیستم مدیریت پایگاه داده رابطهای محبوب است که در پروژههای وب کاربرد زیادی دارد و از SQL استفاده میکند.
Microsoft SQL Server
SQL Server محصول شرکت Microsoft است و در بسیاری از سیستمهای سازمانی و تجاری استفاده میشود.
Oracle Database
Oracle Database یکی از سیستمهای مدیریت پایگاه داده سازمانی شناختهشده است و در پروژههای بزرگ و سامانههای حساس مورد استفاده قرار میگیرد.
PostgreSQL
PostgreSQL یک سیستم مدیریت پایگاه داده رابطهای و شیءگرا با قابلیتهای پیشرفته است که در بسیاری از پروژههای حرفهای مورد استفاده قرار میگیرد.
SQLite
SQLite یک پایگاه داده سبک و مبتنی بر فایل است و در پروژههایی که به یک سرور دیتابیس جداگانه نیاز ندارند، کاربرد زیادی دارد.
IBM Db2
Db2 یکی از محصولات پایگاه داده IBM است که در محیطهای سازمانی و تجاری استفاده میشود.
Amazon RDS
Amazon RDS یک سرویس مدیریتشده پایگاه داده در زیرساخت AWS است. RDS خودش یک موتور پایگاه داده مستقل محسوب نمیشود؛ بلکه امکان استفاده مدیریتشده از موتورهایی مانند MySQL، PostgreSQL و چند سیستم دیگر را فراهم میکند.
چرا MySQL در پروژههای PHP محبوب است؟
MySQL سالهاست در پروژههای وب مورد استفاده قرار میگیرد و در اکوسیستم PHP نیز کاربرد گستردهای دارد.
برخی دلایل رایج استفاده از MySQL در پروژههای PHP عبارتاند از:
- سازگاری مناسب با PHP
- پشتیبانی از SQL
- مناسب بودن برای بسیاری از پروژههای وب
- ابزارهای متعدد برای مدیریت پایگاه داده
- پشتیبانی گسترده در سرویسهای میزبانی وب
- جامعه کاربری بزرگ
- امکان استفاده در پروژههای کوچک تا سیستمهای بزرگتر
البته انتخاب دیتابیس باید بر اساس نیاز واقعی پروژه انجام شود و نمیتوان گفت MySQL برای تمام پروژهها بهترین انتخاب است.
ارتباط PHP با MySQL در پروژههای واقعی
فرض کنید یک فرم ثبتنام داریم:
نام
ایمیل
رمز عبور
کاربر اطلاعات را وارد میکند.
فرآیند کلی میتواند به این شکل باشد:
کاربر
↓
فرم HTML
↓
PHP
↓
اعتبارسنجی اطلاعات
↓
SQL Query
↓
MySQL
↓
ذخیره اطلاعات
وقتی کاربر بعداً وارد حساب خود میشود، PHP میتواند اطلاعات مورد نیاز را از MySQL دریافت کند و نتیجه را به کاربر نمایش دهد.
روشهای ارتباط PHP با MySQL
در PHP روشهای مختلفی برای ارتباط با MySQL وجود دارد.
دو روش شناختهشده عبارتاند از:
MySQLi
MySQLi یکی از APIهای PHP برای کار با MySQL است.
مثال:
<?php
$connection = new mysqli(
"localhost",
"username",
"password",
"database"
);
if ($connection->connect_error) {
die("Connection failed: " . $connection->connect_error);
}
echo "Connected successfully";
?>
PDO
روش دیگر استفاده از PDO است.
PDO یک API عمومیتر برای دسترسی به پایگاه دادهها در PHP است و از چندین سیستم پایگاه داده پشتیبانی میکند.
مثال:
<?php
$dsn = "mysql:host=localhost;dbname=my_database;charset=utf8mb4";
$pdo = new PDO($dsn, "username", "password");
$pdo->setAttribute(
PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION
);
echo "Connected successfully";
?>
استفاده از Prepared Statement
هنگام دریافت اطلاعات از کاربر و ارسال آن به دیتابیس، نباید مقادیر ورودی را به شکل ناامن مستقیماً داخل Query قرار دهیم.
یکی از روشهای مهم برای افزایش امنیت Queryها استفاده از Prepared Statement است.
برای مثال با PDO:
$stmt = $pdo->prepare(
"SELECT * FROM users WHERE email = :email"
);
$stmt->execute([
"email" => $email
]);
این روش به جلوگیری از بسیاری از مشکلات SQL Injection کمک میکند و در برنامههای واقعی باید هنگام کار با دادههای ورودی کاربر به آن توجه ویژه داشت.
اهمیت امنیت در ارتباط PHP و Database
ارتباط PHP با دیتابیس فقط به ذخیره اطلاعات محدود نمیشود؛ امنیت دادهها نیز اهمیت زیادی دارد.
در پروژههای واقعی باید مواردی مانند موارد زیر را جدی گرفت:
- استفاده از Prepared Statements
- اعتبارسنجی ورودی کاربران
- عدم ذخیره رمز عبور به صورت متن ساده
- استفاده از
password_hash()برای Hash کردن رمز عبور - محدود کردن دسترسی کاربر دیتابیس
- عدم قرار دادن اطلاعات حساس دیتابیس در کد عمومی
- مدیریت صحیح خطاها
- استفاده از HTTPS برای ارتباطات وب
- پشتیبانگیری منظم از دادههای مهم
به عنوان مثال برای ذخیره رمز عبور نباید آن را به صورت Plain Text در دیتابیس قرار داد:
$passwordHash = password_hash(
$password,
PASSWORD_DEFAULT
);
سپس هنگام ورود کاربر میتوان Hash ذخیرهشده را با password_verify() بررسی کرد.
ارتباط Iterable با کار با Database
Iterable در پروژههای PHP میتواند هنگام کار با دادههای دیتابیس نیز مفید باشد.
فرض کنید تابعی داریم که قرار است مجموعهای از نتایج را دریافت و نمایش دهد:
function displayUsers(iterable $users)
{
foreach ($users as $user) {
echo $user["name"] . "<br>";
}
}
اکنون هر دادهای که قابل پیمایش باشد میتواند در این تابع استفاده شود.
این نوع طراحی باعث میشود تابع به یک ساختار خاص وابستگی کمتری داشته باشد.
جمعبندی
در این بخش با دو موضوع مهم در PHP آشنا شدیم: Iterable و Database.
iterable یک Type در PHP است که برای مقادیری استفاده میشود که قابلیت پیمایش با foreach را دارند. Arrayها، Iteratorها و Generatorها نمونههایی از دادههای قابل پیمایش هستند.
برای مثال:
function printItems(iterable $items)
{
foreach ($items as $item) {
echo $item;
}
}
همچنین میتوان از iterable به عنوان Return Type استفاده کرد:
function getItems(): iterable
{
return ["A", "B", "C"];
}
در بخش دیتابیس نیز یاد گرفتیم که Database برای ذخیره و مدیریت اطلاعات استفاده میشود و MySQL یکی از سیستمهای مدیریت پایگاه داده رابطهای شناختهشده است.
همچنین باید تفاوت بین SQL و MySQL را به خاطر داشته باشیم:
SQL
↓
زبان کار با پایگاه داده
MySQL
↓
سیستم مدیریت پایگاه داده
PHP نیز میتواند از طریق ابزارهایی مانند MySQLi و PDO با MySQL ارتباط برقرار کند و اطلاعات را ذخیره، دریافت، ویرایش و حذف کند.
در پروژههای حرفهای، آشنایی با این مفاهیم در کنار مباحثی مانند OOP، PDO، SQL، امنیت دیتابیس، Prepared Statements و طراحی پایگاه داده، پایه مهمی برای ساخت وبسایتها و نرمافزارهای مبتنی بر PHP محسوب میشود.
پیشنهاد ما:آموزش رایگان PHP

مریم گوهرزاد
مدرس و بنیانگذار هلدینگ آرتا رسانه. برنامه نویس و محقق حوزه بلاکچین و توسعهدهنده بلاکچین | متخصص Solidity | توسعهدهنده وب Full-Stackمن یک توسعهدهنده علاقهمند به فناوریهای بلاکچین و وب ۳ هستم و در زمینه Solidity، توسعه قراردادهای هوشمند و ساخت برنامههای غیرمتمرکز (DApps) فعالیت میکنم. تمرکز من بر طراحی و پیادهسازی راهکارهایی است که در کنار بهرهگیری از فناوریهای نوین، عملکرد مناسب، امنیت و تجربه کاربری مطلوبی ارائه دهند.در کنار تخصص در حوزه بلاکچین، به عنوان یک توسعهدهنده وب Full-Stack نیز در طراحی و توسعه وبسایتها و برنامههای تحت وب فعالیت میکنم. تجربه کار در بخشهای Front-End و Back-End به من این امکان را داده است که پروژهها را از مرحله ایده و طراحی تا توسعه و اجرا، با دیدی جامع دنبال کنم. در فرآیند توسعه، توجه ویژهای به کدنویسی تمیز، معماری مناسب، طراحی واکنشگرا، عملکرد مطلوب و تجربه کاربری روان دارم.



