یکشنبه ۳۰ اردیبهشت ۱۴۰۳

Sunday, May 19, 2024 GMT +3:30
دسته بندی
×

اتصال PHP به MySQL با اکستنشن MySQLi

mysql

در مطلب گذشته از بخش آموزش مقدماتی MySQL با کلیاتی از پرکاربردترین سیستم مدیریت پایگاه داده آشنا شدیم، گفتیم که به طور معمول پایگاه داده MySQL را با دو روش می توانیم مدیریت کنیم، روش اول استفاده از رابط کاربری برنامه phpMyAdmin و به صورت دستی است که در این خصوص توضیحات مختصری ارائه شد، روش دوم که هدف اصلی ما در این سری از آموزش ها است، ارتباط و مدیریت پایگاه داده MySQL با برنامه نویسی PHP است که بدین منظور در کنار کدهای PHP از برنامه های نرم افزاری کوچکی تحت عنوان اکستنشن در مفسر این زبان باید بهره بگیریم، اکستنش های ارتباط با MySQL در PHP سه مورد هستند، MySQL، MySQLi و PDO که به جهت قدیمی و منسوخ شدن MySQL از توضیح آن صرف نظر می کنیم، اکستنشن PDO نیز به جهت ماهیت کاربرد چندگانه آن در جای خود آموزش داده خواهد شد، در مباحث این بخش از اکستنشن MySQLi (نسخه بهبود یافته اکستنشن MySQL، حرف i به معنی improved) که به طور اختصاصی برای ارتباط PHP با MySQL طراحی شده است به روش برنامه نویسی رویه ای (Procedural) و شی گرا (Object-oriented) استفاده می کنیم.

اتصال به دیتابیس در اکستنشن MySQLi


برای اتصال به دیتابیس قبل از هرچیز باید پایگاه داده ساخته باشیم، برای انجام این کار می توانیم از برنامه phpMyAdmin وارد سربرگ Databases شده و در فیلد "Create database" نام پایگاه داده مد نظر خود را وارد، از قسمت Collation گزینه utf8_persian_ci را انتخاب و در نهایت بر روی دکمه "create" کلیک نمائیم.
نکته: عمدتا در لوکال می توانیم به صورت پیش فرض با نام کاربری root و بدون پسورد از دیتابیس استفاده کنیم اما در سرور اصلی معمولا باید ابتدا یک نام کاربری با کلمه عبور ساخته و آن را برای استفاده از پایگاه داده مد نظر تنظیم نمائیم، این موارد از طریق برنامه های مدیریت هاست مانند DirectAdmin ،cPanel و... قابل انجام است، به طور مثال در cPanel از قسمت Databases گزینه MySQL Databases با امکاناتی نظیر Create New Database، MySQL Users، Add New User، Add User To Database و... می توانیم دیتابیس و کاربر ساخته و در نهایت کاربر را به دیتابیس اختصاص دهیم (اجازه استفاده از دیتابیس را به کاربر مد نظر بدهیم).
پس از ایجاد دیتابیس از طریق واسط کاربری برنامه phpMyAdmin، به طور معمول نخستین گام در برنامه های تحت وب برقراری اتصال بین کدهای PHP و سیستم مدیریت پایگاه داده MySQL است، در ادامه خواهیم دید چگونه با استفاده از دستورات اکستنشن MySQLi در PHP می توانیم به دیتابیس MySQL متصل شویم، در نمونه کدهای زیر این کار انجام شده است.
برنامه نویسی رویه ای (Procedural):
<?php
//اتصال به دیتابیس
$conn = mysqli_connect("localhost", "username", "password", "dbname");
if(!$conn) {
    echo "PHP & MySQL Connection: Error! " . mysqli_connect_errno() . ' - ' . mysqli_connect_error();
    exit;
} else {
    echo "PHP & MySQL Connection: Ok!<br>";
}
//پایان اتصال
mysqli_close($conn);
?>
برنامه نویسی شی گرا (Object-oriented):
<?php
//اتصال به دیتابیس
$conn = new mysqli("localhost", "username", "password", "dbname");
if(!$conn) {
    echo "PHP & MySQL Connection: Error! " . $conn->errno . ' - ' . $conn->error;
    exit;
} else {
    echo "PHP & MySQL Connection: Ok!<br>";
}
//پایان اتصال
$conn->close();
?>
در شرح نمونه کد بالا ابتدا اطلاعات پایگاه داده خود را که قبلا ساخته ایم در مقادیر مشخص شده وارد می کنیم، به جای username نام کاربری پایگاه داده، در قسمت password کلمه عبور و در قسمت dbname نام دیتابیسی که ساخته ایم را می نویسیم، به طور مثال در لوکال از نام کاربری root بدون پسورد استفاده می کنیم:
$conn = mysqli_connect("localhost", "root", "", "dbname");

$conn = new mysqli("localhost", "root", "", "dbname");
اگر همه چیز درست باشد با فراخوانی فایل PHP و اجرای دستورات بالا پیام "PHP & MySQL Connection: Ok" را در خروجی خواهیم داشت در غیر این صورت قسمت else اجرا شده و خطای مربوطه نشان داده می شود، نهایتا نیز با تابع mysqli_close (در برنامه نویسی رویه ای) و متد close (در برنامه نویسی شی گرا) به ارتباط پایان می دهیم (در حال حاضر نیازی به درک عمیق دستورات MySQLi نیست، صرف آشنایی ظاهری با نمونه کدها برای این سطح کفایت می کند).
دسته بندی: آموزش مقدماتی » MySQL
related مطالب بیشتر:
نحوه ذخیره کردن اطلاعات با دستور INSERT در MySQL
آموزش MySQL، سیستم مدیریت پایگاه داده
توابع تجمیعی (Aggregate Functions) در MySQL
حذف مقادیر از MySQL با دستور DELETE
استفاده از WHERE در پرس و جوی MySQL
دیدگاه
more ۳۴ دیدگاه برای این مطلب ارسال شده است.
more دیدگاه جدید بر اساس تاریخ ارسال در انتهای دیدگاه های موجود نمایش داده می شود.
نیما
۰۱:۰۳ ۱۳۹۱/۰۹/۱۳
عالی
۲۲:۰۲ ۱۳۹۱/۰۹/۱۹
سلام این کد که کار نمیکنه!...
میگه باید دیتابیس رو سلکت کنیم این کار رو هم که انجام میدم باز نمیشه
از این کد ها استفاده کردم
mysql_select_db("mahdi");
mysql_select_db("mahdi",$con);
con متغیری هست که به mysql کانکت شده
ممنون از یادآوری شما، قسمت mysql_select_db در هنگام منتشر کردن مطلب از قلم افتاده بود، آموزش به طور کامل ویرایش و بر اساس اکستنشن توصیه شده MySQLi تصحیح شد، می توانید از الگوی فعلی استفاده کنید، اگر خطایی دریافت کردید بررسی کنید که دیتابیس را از قبل ساخته و نام آن به درستی درج شده باشد.
web developer
۱۴:۰۶ ۱۳۹۱/۱۲/۲۶
درود
ممنون از آموزش های خوب شما
دوست گرامی
آموزش یو تی اف کردن را در کنار آموزش ساخت فرم ثبت نام انجام می دهم.
زمانی که یو تی اف می کند، تنها تیبل اصلی یو تی اف می شود و ستون های زیر مجموعه را یو تی اف نمی کند.
ممنون می شوم راهنمایی کنید
ابتدا یونیکد دیتابیس را در هنگام ایجاد کردن، بر روی utf8_persian_ci تنظیم کنید، سپس در هنگام ایجاد جداول و در همان صفحه کد، از دستور ALTER TABLE در انتهای دستور CREATE TABLE استفاده کنید (پیش از اینکه اتصال را خاتمه دهید).
مثال:
mysqli_query($conn, "CREATE TABLE tb_name(
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
name VARCHAR(255)) ENGINE=MyISAM ")
or die(mysqli_error($conn));
echo "جدول با موفقیت ساخته شد!";

mysqli_query($conn, "ALTER TABLE tb_name
DEFAULT CHARACTER SET utf8
COLLATE utf8_persian_ci;")
or die(mysqli_error($conn));
echo "یونیکد با موفقیت تنظیم شد!";
ansherli
۱۶:۰۲ ۱۳۹۱/۱۲/۲۸
سلام
ببخشید من متوجه نشدم چطوری با دستور ALTER TABLE کارکنم؟
من دیتابیس و جداولم رو دستی ایجاد کردم
الان چطوری این کد رو بهش اضافه کنم ؟
سلام
برای حالت دستی، در برنامه phpMyAdmin بر روی جدول مربوطه کلیک کنید و در منوهای بالایی، گزینه SQL را انتخاب نمائید، سپس از نمونه دستور زیر استفاده کنید:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8;
روش توضیح داده شده در آموزش مربوط به حالتی است که جداول را با اجرای فایل های PHP می سازید.
ansherli
۱۹:۳۹ ۱۳۹۱/۱۲/۲۸
خیلی ممنونم از راهنماییتون
مسیری که گفتید رفتم ولی توی sql چند تا تب هست که مربوط به کدهای delete , clear, update,select,select * ,insert هستش و توی هر کدوم کدهای مربوطه به اون !
مثلا توی insert:
INSERT INTO `akhbar`(`id`, `onvan_khabar`, `aks_khabar`, `matn_khabar`, `datetime`) VALUES ([value-1],[value-2],[value-3],[value-4],[value-5])
نوشته شده من کدی گفتید رو کجا اضافه کنم؟ در ضمن گزینه save توی این صفحه نیست! این کد رو که اضافه میکنم دوباره که برمیگردم به این صفحه چیزی save نشده!
ممنون میشم بگید چیکار کنم ؟
وقتی یک جدول را انتخاب کردید و وارد قسمت sql شدید، نیازی نیست سایر دکمه ها را انتخاب کنید، در فیلد متنی Run SQL query/queries on database مقادیر پیش فرض را حذف و پرس و جوی گفته شده را قرار دهید، سپس در پائین صفحه سمت راست بر روی دکمه GO کلیک کنید!
ansherli
۲۲:۴۴ ۱۳۹۱/۱۲/۲۸
ببخشید من دقیقا مسیری که شما میگید رو رفتم و کدی که گفتید رو وارد کردم ولی بازم هیچ تغییری توی داده ها ایجاد نشد حتی داده جدیدم وارد کردم ولی بازم فارسی نیست! :(
اگر یونیکد ستون های شما utf8_general_ci باشد، داده ها به شکل فارسی ذخیره می شوند (البته در حالت وارد کردن به صورت دستی) اگر هم به شکل کاراکترهای ناخوانا وارد شوند باز مشکلی نیست و در هنگام نمایش در صفحات utf8 به صورت فارسی نمایش داده می شوند، اما برای اطمینان بهتر است داده ها را با دستورات PHP در دیتابیس ذخیره کنید و پس از اتصال و انتخاب دیتابیس، پرس و جوی زیر را هم اجرا کنید تا تمام فرآیند ها به صورت فارسی ذخیره یا بازیابی شوند:
SET NAMES 'utf8'
در کل برای پشتیبانی کامل و نمایش حروف فارسی در دیتابیس به شکل صحیح، در درجه اول باید Server connection collation دیتابیس را
utf8_persian_ci
انتخاب کنید، سپس مراحل زیر را انجام دهید:
- از متاتگ زیر در تمام صفحات استفاده کنید:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- علاوه بر دیتابیس، جداول و ستون ها را نیز با یونیکد
utf8_persian_ci
بسازید.
- پس از اتصال با دیتابیس، پرس و جوی زیر را هم اجرا کنید:
SET NAMES 'utf8'
صادق
۲۰:۱۶ ۱۳۹۲/۰۳/۱۵
سلام یه سوال داشتم که شاید خیلی به این مطلب مربوط نباشه من میخوام یک عکس رو در mysql ذخیره کنم و سپس اون عکس رو دوباره مشاهده کنم اولا نوع داده دیتابیسم چی باید باشه و چگونه ببینم
ذخیره تصاویر در دیتابیس در وب چندان توصیه نمی شود، چون برای نمایش آن (در برخی مرورگرها) ممکن است با مشکلاتی روبرو شوید و از طرفی حجم کلی پایگاه داده به میزان زیادی افزایش می یابد، بهتر است تصاویر را به صورت معمول در هارددیسک سرور ذخیره و تنها آدرس یا نام آنها را در دیتابیس ثبت کنید.
اما جهت اطلاعات بیشتر، نوع داده برای ذخیره تصاویر در MySQL نوع BLOB به معنی Binary Large OBject است که برای نمایش تصویر باید یک دستور header تنظیم کنید:
header("Content-type: image/jpeg");
echo $row['image_column'];
توجه کنید که قبل از این دستورات هیچ خروجی نباید به مرورگر ارسال شود (شامل کاراکترهای نامرئی BOM نیز می شود)، روش دیگر نمایش، استفاده از data:image و base64_encode است:
<?php echo '<img src="data:image/jpeg;base64,' . base64_encode($row['image_column']) . '">'; ?>
صادق
۱۰:۱۴ ۱۳۹۲/۰۳/۱۶
خیلی ممنون
صبا
۱۳:۱۲ ۱۳۹۲/۰۳/۲۸
سلام، به خاطر مطالب خيلي خوبتون ممنونم. يه سوال وقتي دستور ساخت دیتابیس با دستور CREATE رو مينويسم اين خطا رو ميده در ضمن من از wampserver استفاده ميكنم.مشكل از كجاست
اتصال برقرار نشد: Access denied for user 'username'@'localhost' (using password: YES)
به احتمال زیاد در هنگام اتصال به دیتابیس در لوکال هاست، قسمت مربوط به کلمه عبور را نیز مقداردهی می کنید، در حالی که معمولا در لوکال هاست با نام کاربری root و بدون پسورد باید به دیتابیس متصل شد (البته با توجه به تنظیمات پیش فرض).
۱۰:۴۱ ۱۳۹۲/۰۴/۲۷
ممنون
yahya
۰۹:۳۵ ۱۳۹۲/۰۵/۰۲
با سلام و تشکر از زحمات شما
یک سوال داشتم آیا امکان افزودن ستون به جدول بعد از ایجاد جدول وجود دارد . اگر این امکان وجود دارد دستور مربوط به آن چیست؟
بله با ALTER می توانید تغیرات بعدی را در جدول ایجاد کنید، به طور مثال:
mysqli_query($conn, "ALTER TABLE tbl_name ADD COLUMN new_col_name INT(11) NOT NULL DEFAULT 0 AFTER col_name")
or die(mysqli_error($conn));
کد بالا یک ستون فرضی از نوع INT بعد از ستون col_name می سازد.
علی
۱۹:۵۷ ۱۳۹۲/۰۶/۳۱
سلام. ببخشید برای ساخت جدول در mysql محدودیت تعداد کارکتر رو باید بدیم. چطوری این مقدار رو نامحدود کنم که تعداد کاراکتر مهم نباشه.
تا آنجا که اطلاع داریم، امکان ساخت ستون بدون محدودیت کاراکتر در MySQL وجود ندارد، اما می توانید از data type های زیر استفاده کنید:
TINYTEXT - 255 bytes
TEXT - 65535 bytes
MEDIUMTEXT - 16,777,215 bytes (2^24 - 1)
LONGTEXT - 4G bytes (2^32 – 1)
که برای متن های خیلی خیلی طولانی (در حد حجم 4 گیگابایت)، LONGTEXT انتخاب مناسبی است.
یاسمن
۱۱:۰۷ ۱۳۹۲/۱۰/۲۰
وقتی دستور ایجاد دیتا بیس رو می زنم این پیغام رو میده:
خطایی رخ داده است:
Access denied for user ''@'localhost' to database 'db_name
به نظر کدهای شما اشکالی دارد و اطلاعات مورد نیاز برای اتصال به پایگاه داده (نام کاربری، کلمه عبور، نام دیتابیس و...) به درستی تنظیم نشده است.
حامد
۱۲:۲۰ ۱۳۹۲/۱۰/۳۰
با سلام
من میخوام یک پی اچ پی با استفاده از جداول اس کیو ال بسازم که برای نمایشگاه ماشین باشه و شامل گزینه های خرید و فروش و نمایش و جستجو و بروز رسانی اطلاعات باشه و مقادیر نام ماشین و کد ماشین و شرکت سازنده و سال تولید و رنگ و قیمت باشه
لطفآ راهنماییم کنید
پاسخ روشنی به سوالتان وجود ندارد!
قاعدتا باید برنامه نویسی بلد باشید که اینچنین سیستمی را تعریف کنید، لذا فراگیری آموزش های PHP و MySQL از سطح مقدماتی و تمرین و تکرار توصیه می شود!
zanyar
۲۲:۰۶ ۱۳۹۲/۱۱/۱۹
با سلام اگه بعدا بخوایم برای این دیتابیس رمز عبور یا نام کاربری رو تغییر بدیم باید از چه کدی استفاده کنیم؟
از برنامه مدیریت هاستتان باید استفاده کنید.
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
2 × 1
20 × 20
=
آخرین دیدگاه ها
more برای دسترسی سریع به یادداشت مربوطه می توانید از لینک مطلب در کادر زیر استفاده کنید.
سعیدی
سلام می تونید اینو اصلاح کنید؟ چون من با توضیحات شما یاد نگرفتم خیلی ممنون اگه یکبار اصلاح کنید واسه بعد یاد...
۱۴۰۳/۰۲/۲۲

سعیدی
دست شما درد نکنه وقتی اینطوری تغییر میدم و به class می نویسم کار نمی کنه و ارور میده
۱۴۰۳/۰۲/۲۱

سعیدی
دست شما درد نکنه خیلی خوب بود این یکی رو چطوری فراخوانی کنم؟ این واسه مناسبت هاست خیلی ممنون
۱۴۰۳/۰۲/۱۹

سعیدی
با سلام آیا می شه این تابع رو بصورت class نوشت؟ میخوام وقتی کد ملی میدم با این تابع فراخوانی بشه و شهر...
۱۴۰۳/۰۲/۱۹

پرتو
مگه شما دارین اموزشش رو؟ آدرسش رو میزارید؟ یا اگر سایتی رو میشناسید که آموزش داده باشه معرفی کنید ممنون میشم من خیلی گشتم توی...
۱۴۰۳/۰۲/۱۸

پــرتو
سلام خوبید ؟ خسته نباشید گوشی پدرم شیاومی هست ایمیلمو ثبت کردم داخلش بعد می خواستم حذفش کنم نمیشد می گفت همه داده های توی...
۱۴۰۳/۰۲/۱۶

vip
خیلی ممنونم از شما خیلی عالی شد میشه مثل تبلیغ بلاگفا باشه یعنی زیر صفحه نمایش داده بشه و صفحه رو سیاه نکنه که تا...
۱۴۰۳/۰۲/۰۵

vip
با سلام و خسته نباشید استاد چند وقت پیش این کد رو از شما گرفتم این کد خیلی خوبه و کاربر رو هم...
۱۴۰۳/۰۲/۰۴

پـــرتو
سلام خسته نباشید شرمنده مزاحم میشم یه سوال داشتم می خواستم بپرسم که چرا بلاگفا باز نمیشه برام؟ کلا هر وبلاگی که مربوط به بلاگفا...
۱۴۰۳/۰۲/۰۲

هادی عبداله زاده
با تشکر از شما دوست عزیز با order_id درستش کردم موقع برگشت order_id رو بر می گردونه اینطوری کردم که از طریق اون شناسه...
۱۴۰۳/۰۱/۲۲

هادی عبداله زاده
با تشکر از شما برای ارسال درخواست درست بود و به بانک هم وصل شد فقط برای وریفای چیکارش کنم؟
۱۴۰۳/۰۱/۲۲

هادی عبداله زاده
با سلام و خسته نباشید سال نو شما مبارک من یه کد واسه انتقال به درگاه دارم واسه زرین پال هست ...
۱۴۰۳/۰۱/۲۰

پـــرتو
ببخشید ممنون از جوابتون ولی یه سوال اگر بخوام همون شماره رو با حساب کاربری جدید با همون شماره رو داشته باشم داده های قبلی...
۱۴۰۳/۰۱/۱۹

حسین بلاگ
من یه صفحه ارسال متن دارم میخوام کاربرها وقتی واسه م پیام میدن وقتی روی اون دکمه کلیک می کنن بهشون بگه لطفا صبر...
۱۴۰۳/۰۱/۱۹

شریفی
سلام و عرض احترام سال نو رو بهتون تبریک میگم انشالله سال خوبی داشته باشین یه سرویس وبلاگدهی داریم که قصد داریم به...
۱۴۰۳/۰۱/۱۵

فرهادی
سلام ببخشید یه مشکل دارم این صفحه رو نگاه کنید چند بار توی سورس تکرار شده نمی تونم الگوی توضیحاتش رو استخراج...
۱۴۰۳/۰۱/۱۰

فرهادی
با تشکر از شما یه مشکل دیگه برام پیش اومده واسه این کد وقتی echo می گیرم تومان باهاش میاد وقتی میخوام فقط...
۱۴۰۳/۰۱/۰۹

سید صالح
با سلام و خسته نباشید من یک فرم ساده دارم که کاربر باید پر کنه چون سوال امنیتی و اینا نداره ربات ها همه...
۱۴۰۳/۰۱/۰۷

فرهادی
با تشکر از شما یه سوال دیگه هم دارم توی تعدادی از سایتهای فروشگاهی صفحات سایت مپ به جای لینک صفحات حاوی لینکهایی هستند...
۱۴۰۳/۰۱/۰۶

فرهادی
با سلام و درود سال نو رو بهتون تبریک میگم یه سوال من میخوام لینکهای داخل صفحه sitemap.xml سایتها رو دربیارم کدش رو هم...
۱۴۰۳/۰۱/۰۲
  در انتظار بررسی: ۰
 پاسخگویی به سوالات ممکن است تا ۲۴ ساعت زمان ببرد.