ارتباط به پایگاه داده mysql در PHP
در PHP نسخه 5 به بالا، برای کار با پایگاه داده MySQL می توانید یکی از روش های زیر را استفاده نمایید:
- افزونه MySQLi (کاراکتر i مخفف improved بمعنی بهبود یافته است)
- PDO که سرنام واژگان PHP Data Objects است
در نسخه های قبلی PHP از افزونه MySQL استفاده می شده، اما استفاده از این افزونه، از 2012 دیگر توصیه نمی شود.
باید از MySQLi استفاده کنم یا PDO ؟
اگر بخواهیم خیلی خلاصه جواب دهیم، این انتخاب بستگی به نیاز شما دارد ...!
هر کدام از گزینه های MySQLi و PDO، مزییت های خودشان را دارند.
گزینه PDO با 12 پایگاه داده مختلف کار می کند، اما MySQLi تنها با پایگاه داده MySQL کار خواهد کرد.
بنابراین اگر بخواهید زمانی به یک پایگاه داده دیگر سوییچ کنید، گزینه PDO کار را آسان تر خواهد کرد و فقط کافی است که ارتباط یا connection به پایگاه داده را تغییر دهید و احتمالاً چند تغییر کوچک در کوئری ها را خواهید داشت.
هر دو گزینه شیء گرا هستند، اما MySQLi رویه های API را نیز ارائه می دهد.
هر دو گزینه، دستورات آماده برای مقابله با تزریقات SQL یا SQL injection را پشتیبانی می کنند، که البته این موضوع، برای حفظ امنیت برنامه های کاربردی وب بسیار حیاتی است.
مثال های MySQL به هر دو روش MySQLi و PDO
در این مطلب و آموزش های بعدی، سه روش مختلف برای کار کردن با پایگاه داده را نشان خواهیم داد:
- MySQLi (شیء گرا یا Object-Oriented)
- MySQLi (رویه ای یا Procedural)
- PDO
نصب MySQLi
برای سیستم عامل Linux و Windows، افزونه MySQLi در اغلب موارد بصورت اتوماتیک بعد از نصب پکیج php5 mysql نصب خواهد شد.
برای کسب اطلاعات بیشتر به لینک روبرو مراجع فرمایید: http://php.net/manual/en/mysqli.installation.php
نصب PDO
برای کسب اطلاعات بیشتر به لینک روبرو مراجع فرمایید: http://php.net/manual/en/pdo.installation.php
ارتباط یا Connection به پایگاه داده MySQL
قبل از اینکه به داده های پایگاه داده دسترسی داشته باشید، باید یک ارتباط یا Connection تعریف کنید:
مثال (MySQLi Object-Oriented)
$servername = "localhost";
$username = "username";
$password = "password";
// Create connection
$conn = new mysqli($servername, $username, $password);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
?>
توجه داشته باشید که در مثال شیء گرای بالا، connect_error$ تا PHP 5.2.9 و 5.3.0 PHP کار نمی کند، بنابراین اگر می خواهید که کدتان با نسخه های قدیمی PHP نیز سازگار باشد، بجای آن از کد زیر استفاده نمایید:// Check connection |
در مثال زیر با استفاده از تابع ()mysqli_connect یک connection به پایگاه داده تعریف شده است:
مثال (MySQLi Procedural)
$servername = "localhost";
$username = "username";
$password = "password";
// Create connection
$conn = mysqli_connect($servername, $username, $password);
// Check connection
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
?>
مثال(PDO)
$servername = "localhost";
$username = "username";
$password = "password";
try {
$conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
}
catch(PDOException $e)
{
echo "Connection failed: " . $e->getMessage();
}
?>
توجه داشته باشید که در مثال PDO بالا، با تنظیم گزینه dbname با مقدار "myDB" نام پایگاه داده را نیز مشخص کرده ایم. اگر PDO موفق به اتصال به پایگاه داده نشود یک استثنا یا exception پرتاب (thrown) می شود. |
نکته: یکی از بزرگترین مزیت های PDO وجود کلاس exception برای مدیریت خطاها است. همان طور که می دانید این خطاها ممکن است در کوئری های پایگاه داده رخ دهد و اگر یک استثنا یا exception از داخل بلاک { }try پرتاب (thrown) شود، اجرای اسکریبت متوقف شده و جریان کار به اولین بلاک { }catch منتقل می شود. در واقع استثنای که در قسمت try رخ داده در قسمت catch به دام می افتد.
بستن یک ارتباط
ارتباط یا Connection به صورت اتوماتیک وقتی که اسکریبت پایان یافت، بسته می شود، اما اگر مایل باشید می توانید این کار را قبل از پایان اسکریبت انجام دهید:
مثال(MySQLi Object-Oriented)
مثال(MySQLi Procedural)
مثال(PDO)
برای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.
- نوشته شده توسط امیر پهلوان صادق
- بازدید: 36602
دیدگاهها
سلام دوستان کسی هست بتونه توضیح بده این علامت در جمله زیر یعنی چی؟
$conn->connect_error
سلام خسته نباشید،
من دقیقا مثال(PDO) رو کپی کردم توی فایل php خودم، اسم دیتا بیس رو با اسم دیتا بیس خودم یکی کردم اما اینمتن تو صفحه ام ظاهر میشه ، باید چکار کنم؟ نمیتونم به دیتابیسم وصل بشم.
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EX CEPTION); echo "Connected successfully"; } catch(PDOExcept ion $e) { echo "Connection failed: " . $e->getMessage( ); } ?>
سلام خسته نباشید
من دقیقا همین کد رو(مثال (MySQLi Procedural)) کپی و داخل یک صفحه جدید htmlبین دو تک body کپی کردم و به اسم conectو با پسوند .phpذخیره کردم
حالا داخل مرورگر این رو سرچ کردم(http://localhost/conection.php)
که این خطا رو داد:Warning: mysqli_connect( ): (HY000/1045): Access denied for user 'username'@'loc alhost' (using password: YES) in C:\xampp\htdocs \conection.php on line 14
Connection failed: Access denied for user 'username'@'loc alhost' (using password: YES)
حالا باید چیکار کنم.
مشابه همین سوال رو خانمی پرسیدن شما فرمودید که باید نام کاربری و دیتابیس رو چک کنید
اما من متوجه نشدم کجا باید این کارو انجام بدم
مرسی از راهنماییتون
سلام
اشکال کار شما تنظیم ناصحیح متغییرهای زیر است:$servername = "localhost";
$username = "username";
$password = "password";اما در زیر به توضیح هر کدام از آنها پرداخته ایم:
servername: محل قرار گیری پایگاه داده
username: نام کاربری اتصال به پایگاه داده
password: کلمه عبور اتصال به پایگاه داده
پس رضا جان توجه داشته باش که برای اتصال به پایگاه داده شما نیاز به نام کاربری و کلمه عبور دارید. اما همان طور که می دانید، زمان نصب Xampp پایگاه داده MySQL نیز نصب شده است. اما نکته بسیار مهم این هست که هنگام نصب MySQL یک نام کاربری پیشفرض با نام root و کلمه عبور خالی ایجاد شده است. پس نهایتا سه متغیر بالا باید بصورت زیر مقدار دهی شوند:
$servername = "localhost";
$username = "root";
$password = "";
آیا برای دسترسی به دیتابیس به جای تنظیم نمودنmysqli_con nect($servernam e, $username, $password);
مقادیر دیتابس به صورت متغییر
آیا میتوان از ثابت هایی که از اینکلود میشوند به صفحه استفاده کردم؛من کردم نشد؟!
سلام.
بله، امکانش هست. اتفاقا روش صحیحتر این هست که برای مقداردهی پارامترهای کلیدی و مهم که مقادیرشون هم در برنامه تغییر نمیکنه، از ثابت استفاده بشه.
شما ابتدا باید ثابتها رو به صورت زیر تعریف کنید:
define('USER', 'db_username');
define('PASS', 'db_password');
define('NAME', 'db_name');
سپس به صورت زیر وصل بشید:
mysqli_con nect(NAME, USER, PASS);
اگر وصل نمیشه احتمالا یه جایی رو اشتباه دارید میکنید. به اینکلود فایل دقت کنید و ابتدا مقادیر رو چاپ کنید تا مطمئن بشید که مقادیر قابل دسترسی هستند یا خیر. با تریس برنامه میتونید مشکل رو پیدا کنید.
من کد ها رو دقیقا مشابه آموزش ها وارد میکنم حتی با یوزر و دیتا بیس جدید هم امتحان کردم اما باز هم ارور فاتال میده و دیتابیس رو پیدا نمی کنه اگه کسی میتونه لطفا به من کمک کنه
شما باید مقاله ی بعدی: ایجاد پایگاه داده رو هم بخونید و اجرا کنید. با خواندن و اجرای مقاله ی بعدی، نیازی نیست که به صورت دستی پایگاه داده رو ایجاد کنید.
ببینید من موقعی که تو لوکال از دیتابیس خودم استفاده می کنم هیچ مشکلی نداره
اما موقعی که سایت خودم رو به سرور انتقال میدم و تنظیمات دیتابیس رو دقیقا مطابق راهنمای سایتی که هاست رو ازش خریداری کردم وارد میکنم صفحات سایتم رو اونایی که با پی اچ پی کار شده به درستی نشون میده اما اون صفحاتی که توشون کد مای اس کیو ال هست رو اصلا نمایش نمیده حتی وقتی پیج سورس رو هم میزنم میگه این صفحه هیچی توش نیست و ارور سینکتکس در لاین 135 میده
لاین 135 دقیقا جاییه که کد های مربوط به دیتابیس شروع میشه
یک نکته توی آموزش سایتی که هاست رو خریداری کردم گفته آخرش باید فایل configuratiotn php رو تغییر بدیم
اما من این فایل رو ندارم ، در واقع فکر میکنم اون آموزش توی سایت برای سایت های جوملایی باشه اما من با نت بینس نوشتم
در کل اگر برا تون مقدور هستش آموزش انتقال صحیح وبسایت از لوکال به سرور رو بذارید خیلی ممنون
این طور مشکلات رو نمیشه بدون ملاحظه از نزدیک درست کرد. چون من دقیقا نمیدونم اونور چه اتفاقاتی داره میفته.
اگر سورس کد رو در هاست دارید، اطلاعات رو بدید یه نگاه بندازم یا اینکه میتونیم هماهنگ کنیم مشکل رو از طریق تیمویور حل کنیم.
اما اولش شما ببینید میتونید خودتون مشکل رو حل کنید. خط 135 از فایل موردنظر رو چک کنید، ببینید خطای گرامری داره یا نه. درستیشو چک کنید و کد رو دوباره اجرا کنید.
سلام دوست عزیزز من هر چه بالا را میخوانم متوجه نمی شوم شما یه چیز گفتی و کتاب چیز دیگه ای
من با command line دارم کار میکنم این چیزی که شما دارید میگید با نرم افزاره؟ یا چی؟
با سلام.
من متوجه منظور شما نمیشم. دقیقا مشکل شما کدوم قسمت و توی چه محیطی هست. دقیق بگید، تا من و سایر دوستان بهتر بتونیم به شما کمک کنیم.
سلام
این که برای استفاده در کامپیوتر خودمون بود
اگر ممکنه رشته اتصال برای استفاده در سرور سایت رو معرفی کنید
با سلام.
بیشتر توضیح بدید، متوجه منظورتون نمیشم.
با سلام
مقدار سرور نیم رو بجای لوکال هاست هنگام اجرا در سرور رو چی بذاریم ؟ باید آدرس سایت بذاریم ؟ سینتکسش چه جوریه هر کار میکنم هیچی نشون نمی ده
معمولا تنظیمات هر سایت طوری هست که عبارت localhost برای اشاره به همون به کار میره. شما هم میتونید از همین عبارت استفاده کنید.
اگر مشکل حل نشد، بیشتر توضیح بدید، تا بهتر بتونیم کمک کنیم.
سلام روش صحیح تغییر نام کربری و پسورد رو تو مای اسکیو ال توضیح بیدین ، من نه میتونم ورود کنم نه پسوردم رو تغییر بدم
با سلام.
روشهای مختلفی وجود داره.
میتونید بعد از اینکه اطلاعات رو از کاربر گرفتید و در صورت صحیح بودن آنها، سشن مربوطه رو ست کنید. دقت کنید اعتبار سنجی و صحت اونها رو حتما باید چک کنید و تا زمانی که اطلاعات جدید، درست نبوده، نباید جایگزین اطلاعات قبلی بشه.
بعد از به روزرسانی، سشن رو با مقادیر جدید ست کنید.
سلام و خسته نباشید..
من کد شما رو عینا کپی کردم ولی این خطا رو میده...در ضمن از ومپ استفاده میکنم..
Connection failed: Access denied for user 'username'@'loc alhost'(using password: YES)
میشه بگید مشکل از کجاست..
با سلام و تشکر.
دقت داشته باشید عبارت Access denied همیشه بیانگر خطای عدم سطح دسترسی هست.
لطفا نام کاربری و پسورد دیتابیس رو چک کنید که اشتباه نباشه!!!
ایا می شود جای متغییر هایservername , password,userna meاز یک ثابت با نام های دیگر استفاده کنیم؟
بله!!!
username, password و servername در واقع متغیرهایی هستند که توسط برنامه نویس تعریف میشوند. میشه به جای متغیر از ثابت استفاده کرد. مسلم هست که این ثابتها رو باید قبلا در برنامه تعریف و به فایل موردنظر وصل کرده باشید، تا در فایل موردنظر این مقادیر این ثابتها خوانده شوند.
میشه مثلا بجای استفاده از کلمه پسورد برای تعریف رمز عبور از کلمه رمز عبور استفاده کنیم اما ترتیب رعایت کنیم؟
سؤالتون واضح نیست!!!
بجای استفاده از $password" = password";از $کلمه دیگر ="password"; استفاده کنیم
بله! هیچ اشکالی نداره.
اینجا صرفا جنبهی آموزشی داره و برای فهم بیشتر از این کلمه استفاده شده.
در دنیای واقعی اتفاقا باید از کلمات دیگه و خیلی سخت برای پسورد استفاده کنید که حدس زدنش برای دیگران راحت نباشه.
منظورم نام متغییر نه محتوا و رمز
بله!
هر کدوم رو که تغییر بدید، مانعی نداره. فقط ترتیب رو رعایت کنید.
کسی میدونه این اررور چی مدخواد؟؟؟؟
Warning: mysql_num_rows( ) expects parameter 1 to be resource, boolean given in ...
با سلام
کوئری شما خطا داشته. mysql_error رو چاپ کنید ببینید مشکل از چیه. همچنین میتونید از
die(mysql_error () ) استفاده کنید.
سلام
میگم من از نرم افزار wamp server استفاده میکنم بعد وقتی می خوام ارتباط وصل کنم این Error میده
Connection failed: Access denied for user 'username'@'loc alhost' (using password: YES)
با سلام
اگر دقت کنید هنگام اتصال ازتون پس ورد میخواد با اینکه شما پس وردی برا اتصال در نظر نگرفتید. این خطا به خاطر این اتفاق میوفته که در هنگام نوشتن کد اتصال برای قسمت پس ورد بین دو کوتیشن یک فاصله قرار میدید و سیستم اینو یه پس ورد در نظر میگیره ، پس برای رفع این مشکل برای قسمت پس ورد دابل کوتیشن ها رو بدون فاصله قرار بدید.
سلام
بعد از اینکه فرم را درست کردیم ارتباط با پایگاه داده را هم برقرار کردیم چگونه اطلاعاتی را از فرم به پایگاه داده وارد کنیم میشه در همین قسمت یک نمونه بگدارید
در مثال های بالا شما فقط طریقه ارتباط با پایگاه داده را فرمودید اما اینکه چگونه اطلاعاتی را که از کاربر از طریق فرم می گیریم به پایگاه داده وارد کنیم چیزی نگفتید.
باسلام
به آموزش " آموزش MySQL-دستور Insert " مراجعه کنید.
www.beyamooz.com/php/97-database/116-%D8%AF%D8%B1%D8%AC-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%D8%AF%D8%B1-php
ببخشيد من كد ها رو براي ايجاد پايگاه داده درست مثل شما وارد ميكنم اما وصل نميشه...اين ارور رو ميده:
Connection failed: Access denied for user 'username'@'loc alhost'(using password: YES)ميشه راهنمايي كنيد ك اشكال از كجاست؟
درضمن من xampp رو فقط نصب كردم.... با نصب xampp باز هم براي ايجاد پايگاه داده بايد برنامه ي ديگه اي هم نصب شه؟
زمانی که بسته xampp را نصب می کنید، پایگاه داده MySQL نیز نصب می شود و بصورت پیش فرض یک user با نام root و کلمه عبور خالی نیز تعریف می شود.
بنابراین برای ارتباط با پایگاه داده username را با مقدار "root" و password را خالی تنظیم نمایید.
امروزه استفاده از روش pdo به عنوان یک روش مفیدتر شناخته میشه
این مورد چند دلیل داره
یک.شی گرایی بودن و کلاس ها
دو.امنیت بیشتر در ثبت اطلاعات.
سه . عدم وابستگی به mysql .قابلیت اتصال به چندین منبع داده رو بااستفاده از رشته اتصال داره.