اسکریپت برای نمایش لیست کشورها و شهرها بصورت AJAX، هم با استفاده از دیتابیس داخلی SQLite و هم با دیتابیس MySQL، یکی از موارد مهم و پرکاربرد در توسعه وبسایت‌ها و برنامه‌های تحت وب است. این نوع اسکریپت‌ها، به دلیل قابلیت‌های فراوان و انعطاف پذیری بالا، امکان نمایش داده‌های پویا و به‌روز را فراهم می‌آورند، بدون نیاز به رفرش صفحه، و در نتیجه، تجربه کاربری بسیار بهتر و حرفه‌ای‌تر را رقم می‌زنند.


در ادامه، ابتدا به اهمیت و کاربردهای این نوع اسکریپت‌ها می‌پردازیم، سپس نحوه ساخت و پیاده‌سازی آن‌ها را به صورت کامل توضیح می‌دهیم، و در نهایت، مزایا و معایب هر روش را بررسی می‌کنیم.
ضرورت و کاربردهای اسکریپت‌های نمایش لیست کشورها و شهرها
در پروژه‌های مختلف، نیاز است که کاربر بتواند به صورت پویا و در لحظه، لیستی از کشورها یا شهرهای مرتبط را مشاهده کند. برای مثال، فرم ثبت‌نام در سایت‌های فروشگاهی، سامانه‌های رزرو هتل، یا اپلیکیشن‌های سفر، معمولا نیاز دارند که کاربر ابتدا کشور خود را انتخاب کند، و سپس بر اساس آن، شهرهای موجود در آن کشور نمایش داده شوند. این نیازمندی‌ها، به دلیل حجم زیاد داده‌ها، و همچنین ضرورت بروزرسانی سریع و بدون نیاز به رفرش، بهترین راهکار، استفاده از AJAX است.
استفاده از AJAX، این امکان را فراهم می‌کند که بخش‌های خاصی از صفحه بدون نیاز به بارگذاری مجدد، بروزرسانی شوند. به عبارت دیگر، وقتی کاربر یک کشور را انتخاب می‌کند، درخواست به سرور ارسال می‌شود، و لیست شهرهای مربوطه، در همان لحظه، به صورت پویا، نمایش داده می‌شود. این فرآیند، هم سرعت را افزایش می‌دهد، و هم کاربر را راضی‌تر می‌کند، چون تجربه‌ای سریع و بدون توقف را تجربه می‌کند.
چرا باید از دیتابیس داخلی SQLite یا MySQL استفاده کنیم؟
در توسعه این اسکریپت‌ها، ذخیره‌سازی داده‌ها، مهم‌ترین بخش است. دیتابیس‌ها، نقش حافظه‌های بزرگ و سریع را بازی می‌کنند، و اطلاعات مربوط به کشورها و شهرها، معمولا در قالب جداول منظم، در آن‌ها نگهداری می‌شود.
در حالت اول، می‌توان از دیتابیس داخلی SQLite، که یک دیتابیس سبک و فشرده است، بهره برد. SQLite، مزایای زیادی دارد؛ از جمله، نصب آسان، بدون نیاز به سرور جداگانه، و قابلیت حمل و نقل آسان فایل دیتابیس. این نوع دیتابیس، برای پروژه‌های کوچک، نمونه‌های آزمایشی، یا اپلیکیشن‌هایی که نیاز به سادگی و کم‌حجم بودن دارند، بسیار مناسب است.
در کنار آن، استفاده از دیتابیس MySQL، که یکی از محبوب‌ترین و قدرتمندترین سیستم‌های مدیریت دیتابیس است، در پروژه‌های بزرگ و پیشرفته، بسیار رایج است. MySQL، امکانات بی‌نظیر، امنیت بالا، قابلیت مقیاس‌پذیری، و پشتیبانی از چند کاربر و درخواست همزمان را فراهم می‌کند. این دیتابیس، برای پروژه‌های بزرگ، که داده‌های زیادی دارند و نیاز به مدیریت و کنترل دقیق‌تر دارند، ایده‌آل است.
در نتیجه، انتخاب بین SQLite و MySQL، بستگی به نیازهای پروژه، حجم داده‌ها، و مقیاس‌پذیری دارد. در ادامه، به نحوه پیاده‌سازی هر دو حالت، به صورت کامل و جامع، می‌پردازیم.
---

ساخت اسکریپت با دیتابیس داخلی SQLite


در این بخش، نحوه ساخت یک اسکریپت کامل، برای نمایش لیست کشورها و شهرها، با استفاده از دیتابیس SQLite، تشریح می‌شود.
1. ایجاد بانک اطلاعاتی SQLite و جداول مربوطه
ابتدا، باید یک فایل دیتابیس بسازیم، و جداول مورد نیاز را تعریف کنیم. فرض کنیم، دو جدول داریم: `countries` و `cities`.
sql  
CREATE TABLE countries (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE cities (
id INTEGER PRIMARY KEY,
country_id INTEGER,
name TEXT NOT NULL,
FOREIGN KEY (country_id) REFERENCES countries(id)
);

در این ساختار، هر کشور، یک شناسه دارد، و هر شهر، به صورت خارجی، به کشور مربوطه ارتباط دارد.
2. وارد کردن داده‌های نمونه
برای شروع، چند کشور و چند شهر وارد می‌کنیم.
sql  
INSERT INTO countries (name) VALUES ('ایران'), ('آلمان'), ('فرانسه');
INSERT INTO cities (country_id, name) VALUES
(1, 'تهران'), (1, 'اصفهان'), (2, 'برلین'), (2, 'مونیخ'), (3, 'پاریس'), (3, 'لیون');

3. توسعه اسکریپت PHP و AJAX برای خواندن داده‌ها
در فایل PHP، ابتدا، باید اتصال به دیتابیس SQLite برقرار کنیم. سپس، درخواست‌های AJAX را برای دریافت لیست کشورها و شهرها، مدیریت کنیم.
php  
<?php
$db = new PDO('sqlite:locations.db');
if (isset($_GET['action'])) {
if ($_GET['action'] == 'get_countries') {
$stmt = $db->query("SELECT * FROM countries");
$countries = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($countries);
} elseif ($_GET['action'] == 'get_cities' && isset($_GET['country_id'])) {
$country_id = intval($_GET['country_id']);
$stmt = $db->prepare("SELECT * FROM cities WHERE country_id = ?");
$stmt->execute([$country_id]);
$cities = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($cities);
}
exit;
}
?>

4. ساخت رابط کاربری و اسکریپت AJAX
در فایل HTML، لیست کشویی برای کشورها و شهرها، و اسکریپت‌های JavaScript برای فراخوانی داده‌ها، قرار می‌دهیم.
html  
<select id="countrySelect">
<option value="">انتخاب کشور</option>
</select>
<select id="citySelect">
<option value="">انتخاب شهر</option>
</select>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function() {
$.get('your_script.php', { action: 'get_countries' }, function(data) {
var countries = JSON.parse(data);
$.each(countries, function(i, country) {
$('#countrySelect').append($('<option>', {
value: country.id,
text: country.name
}));
});
});
$('#countrySelect').change(function() {
var countryId = $(this).val();
$('#citySelect').empty().append('<option value="">انتخاب شهر</option>');
if (countryId) {
$.get('your_script.php', { action: 'get_cities', country_id: countryId }, function(data) {
var cities = JSON.parse(data);
$.each(cities, function(i, city) {
$('#citySelect').append($('<option>', {
value: city.id,
text: city.name
}));
});
});
}
});
});
</script>

این کد، با کلیک بر روی هر کشور، لیست شهرهای مربوطه را به صورت پویا و بدون نیاز به رفرش، نمایش می‌دهد.
---

ساخت اسکریپت با دیتابیس MySQL


در حالت دوم، به جای SQLite، از MySQL بهره می‌گیریم. این کار، کمی متفاوت است، چون نیازمند نصب و راه‌اندازی یک سرور MySQL است، و اتصال از طریق PHP با مشخصات سرور، کاربر، رمز عبور، و دیتابیس، انجام می‌شود.
1. ساخت بانک اطلاعاتی و جداول در MySQL
در محیط MySQL، دستورهای زیر را اجرا می‌کنیم:
sql  
CREATE DATABASE location_db;
USE location_db;
CREATE TABLE countries (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE cities (
id INT AUTO_INCREMENT PRIMARY KEY,
country_id INT,
name VARCHAR(100) NOT NULL,
FOREIGN KEY (country_id) REFERENCES countries(id)
);

2. وارد کردن داده‌های نمونه
sql  
INSERT INTO countries (name) VALUES ('ایران'), ('آلمان'), ('فرانسه');
INSERT INTO cities (country_id, name) VALUES
(1, 'تهران'), (1, 'اصفهان'), (2, 'برلین'), (2, 'مونیخ'), (3, 'پاریس'), (3, 'لیون');

3. توسعه اسکریپت PHP برای اتصال به MySQL
در فایل PHP، باید اطلاعات سرور MySQL را وارد کنیم، و در ادامه، درخواست‌های AJAX را مدیریت کنیم.
php  
<?php
$host = 'localhost';
$dbname = 'location_db';
$user = 'your_username';
$pass = 'your_password';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("خطا در اتصال به دیتابیس: " . $e->getMessage());
}
if (isset($_GET['action'])) {
if ($_GET['action'] == 'get_countries') {
$stmt = $pdo->query("SELECT * FROM countries");
echo json_encode($stmt->fetchAll(PDO::FETCH_ASSOC));
} elseif ($_GET['action'] == 'get_cities' && isset($_GET['country_id'])) {
$country_id = intval($_GET['country_id']);
$stmt = $pdo->prepare("SELECT * FROM cities WHERE country_id = ?");
$stmt->execute([$country_id]);
echo json_encode($stmt->fetchAll(PDO::FETCH_ASSOC));
}
exit;
}
?>

4. ساخت رابط کاربری و اسکریپت AJAX
کد HTML و JavaScript، همانند نمونه قبل، با کمی تغییر، کار می‌کند.
html  
<select id="countrySelect">
<option value="">انتخاب کشور</option>
</select>
<select id="citySelect">
<option value="">انتخاب شهر</option>
</select>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function() {
$.get('your_mysql_script.php', { action: 'get_countries' }, function(data) {
var countries = JSON.parse(data);
$.each(countries, function(i, country) {
$('#countrySelect').append($('<option>', {
value: country.id,
text: country.name
}));
});
});
$('#countrySelect').change(function() {
var countryId = $(this).val();
$('#citySelect').empty().append('<option value="">انتخاب شهر</option>');
if (countryId) {
$.get('your_mysql_script.php', { action: 'get_cities', country_id: countryId }, function(data) {
var cities = JSON.parse(data);
$.each(cities, function(i, city) {
$('#citySelect').append($('<option>', {
value: city.id,
text: city.name
}));
});
});
}
});
});
</script>

این کد، همان روند قبلی را دنبال می‌کند، اما با اتصال به دیتابیس MySQL، داده‌ها را دریافت و نمایش می‌دهد.
---

مزایا و معایب هر روش


در پایان، بد نیست نگاهی به مزایا و معایب هر یک بیندازیم:
- SQLite: سبک، سریع، بدون نیاز به سرور، مناسب برای پروژه‌های کوچک، و نمونه‌های آزمایشی. اما، در پروژه‌های بزرگ، محدودیت‌های مقیاس‌پذیری دارد، و چند کاربر همزمان، ممکن است مشکل‌ساز شود.
- MySQL: قدرتمند، امن، مقیاس‌پذیر، و مناسب برای پروژه‌های بزرگ و پرکاربرد. اما، نیازمند نصب و پیکربندی سرور، و کمی پیچیده‌تر در مدیریت است.
در نهایت، بسته به نیاز پروژه، حجم داده‌ها، و امکانات سرور، یکی از این دو گزینه، بهترین انتخاب است.
---
در نتیجه، این اسکریپت‌ها، با بهره‌گیری از AJAX و دیتابیس‌های مختلف، امکان ساخت سیستم‌های پویا، سریع، و کاربرپسند را فراهم می‌کنند، و در عین حال، انعطاف و قابلیت توسعه زیادی دارند. توسعه‌دهندگان، می‌توانند بر اساس نیاز، نمونه‌های مشابه را گسترش دهند، و امکانات جدید، مانند جستجو، فیلتر، یا نمایش نقشه، را نیز به آن‌ها اضافه کنند.