سلام دوستان
موضوعی که در این بحث می خواهیم در موردش صحبت کنیم ،معرفی کلاس آماده ای برای کار با دیتابیس در php است . اگر تا حدودی با برنامه نویسی و مخصوصا php که اپن سورس هست آشنا باشید می دونین که معمولا برای هر کاری مث کار با دیتابیس ها ، تصاویر ، فرم ها و … کلاس های آماده و مختلفی وجود دارد که با کمی جستجو در نت می تونید خیلی از اونها رو پیدا کنید.شاید بپرسین وقتی خود زبان php توابع و امکانات لازم برای این کارها رو داره چه دلیلی داره از کدهای ثانویه استفاده کنیم ؟ جواب این سوال ساده است ; چون در این کدها که معمولا به صورت شی گرا (OOP) نوشته شده اند و در قالب یک کلاس (Class) منتشر می شوند ، سعی شده ساده ترین و سریع ترین روش برای انجام کار برامون میسر بشه و دیگه درگیر ریزه کاریهای زبان برنامه نویسی نمی شویم.در این کلاس ها خیلی از کارهای ضروری و عمومی از قبل انجام شده است و امکانات رند گشته و ما فقط با چند خط کد ساده می توانیم به هدف خود برسیم بدون درگیری با جزئیات توابع php و ایجاد امنیت و …
فک می کنم توضیح کافی باشه و اگر اجازه بدید بریم سراغ معرفی کلاس مورد نظرمون که یک کلاس کار با MySQL هست که خودم در کارهام ازش استفاده می کنم و کلاس جالبی است کلا !
این کلاس که اسمش PHP MySQL wrapper v3 هست امکانات و سینتکس ساده ای هم داره و نیاز به تخصص خاصی برای استفاده است نیست . امنیت داده هایی که به دیتابیس insert یا update می شوند را نیز به صورت توکار تامین می کند . دست شما رو برای تغییرات در آینده بازتر می گذارد و مزایای دیگه که کم کم خواهیم دید . برای شروع می تونید کلاس رو به صورت کامل و فشرده از اینجـــــا دانلود کنید
در داخل فایل دریافتی شما ۲ فایل اصلی php قرار دارد که کار هر کدام به این شرح است :
- config.inc.php : همه تنظیمات مربوط به اتصال به دیتابیس اعم از آدرس سرور،نام کاربری ،کلمه عبور و نام دیتابیس مورد نظر را در این فایل وارد می کنیم و در بقیه کدها این فایل را به برنامه الحاق می کنیم تا لازم نباشد در هر صفحه از کدهامان این اطلاعات را قرار بدهیم
- Database.singleton.php : فایل حاوی کلاس اصلی که می خواهیم ازش استفاده کنیم. نیازی به تغییر در داخل این فایل نیست و فقط باید در برنامه الحاقش کنیم حالا یا با دستور require یا include 🙂
اگر با برنامه نویسی شی گرا آشنا باشید حتما می دانید که برای راه اندازی این کلاس نیاز است ابتدا یک کپی از روی آن بسازیم . مختصر ترین کدی که می تونیم بنویسیم به این صورت هست :
// bring in the class file require("Database.singleton.php"); // create the initial singleton database object $db = Database::obtain("server_name", "mysql_user", "mysql_pass", "mysql_database");
در کد بالا همانطور که مشاهده می کنید در خط ۲ فایل اصلی کلاس را به برنامه الحاق کردیم و در خط ۴ پارامتر را به کلاس فرستاده و یک کپی از آن را در متغیر $db
قرار دادیم.
۴ پارامتری که همیشه برای اتصال به پایگاه داده نیاز داریم و در این کلاس هم همینطوره این ها هستند:
- server_name : آدرس یا ip سرور MySQL می باشد که معمولا هم در لوکال هاست و هم روی سرور همان localhost هستش.روی بعضی هاست ها مخصوصا هاست های رایگان ممکنه آدرس های خاصی غیر از این هم باشد
- mysql_user : نام کاربری اتصال به MySQL هست
- mysql_pass : کلمه عبور اتصال به MySQL هست . اگر کلمه عبور وجود ندارد (معمولا روی لوکال هاست) می توانید خالی اش بزارید مثل “”
- mysql_database : این هم از اسمش معلوم هست چیه بله نام دیتابیسی که می خواهیم در برنامه ازش استفاده کنیم
البته این روش در صورتی است که نخواهیم از فایل تنظیمات که قبلا گفته شد استفاده کنیم . ولی شدیدا توصیه می شه این اطلاعات را در متغیر یا ثابت های php ذخیره کنید تا اگر در آینده تغییر کردند لازم نباشد کل کدهاتون رو باز کرده و ویرایش کنید.مثلا انعطاف کد زیر رو با کد بالایی مقایسه کنید
//database server define('DB_SERVER', "localhost"); //database login name define('DB_USER', "username"); //database login password define('DB_PASS', "password"); //database name define('DB_DATABASE', "username_mydata"); //smart to define your table names also define('TABLE_USERS', "users"); define('TABLE_NEWS', "news");
همونطور که مشاهده می کنید برای همه اطلاعاتی که ممکنه در آینده تغییر کنند یک ثابت (Constant) تعریف کردیم و مقدار را در ثابت قرار دادیم .(می تونستیم در متغیر هم قرار بدیم زیاد فرقی ندارند).
بعد در بالای برنامه مون کافیست این کد را قرار بدهیم :
require("config.inc.php"); require("Database.singleton.php"); $db = Database::obtain(DB_SERVER, DB_USER, DB_PASS, DB_DATABASE);
در خط اول فایل تنظیمات را به برنامه الحاق کردیم . در خط دوم کلاس اصلی را الحاق کرده و در نهایت یک شی از روی کلاس ساختیم و در متغیر قرار دادیم و از این به بعد می توانیم به راحتی ازش استفاده کنیم .
اگر در مکانی غیر از برنامه اصلی (مثلا در داخل توابع) بخواهیم با دیتابیس کار کنیم کافیست از کد زیر استفاده کنیم:
// grab the existing $db object $db=Database::obtain();
حالا اگر موافق باشید همه اینها رو داخل یک برنامه کامل استفاده کنیم . مثلا فرض کنید می خواهیم برنامه ای بنویسیم که چک کند یک نام کاربری از قبل در پایگاه داده وجود دارد یا خیر . پس کدی به این شکل خواهیم داشت
// every page needs to start with these basic things // I'm using a separate config file. so pull in those config values require("config.inc.php"); // pull in the file with the database class require("Database.singleton.php"); // create the $db singleton object $db = Database::obtain(DB_SERVER, DB_USER, DB_PASS, DB_DATABASE); // connect to the server $db->connect(); ##### // your main code would go here // with the singleton you can use the $db object inside other classes or functions function get_user_exists($user){ // get the already existing instance of the $db object $db = Database::obtain(); $sql="SELECT `uid` FROM `account` WHERE `user`='".$db->escape($user)."'"; $row = $db->query_first($sql); // if user exists if(!empty($row['uid'])) return true; else return false; } ##### // good practice to close the connection when finished // however, PHP will auto-close it when the page ends if you forget $db->close();
احتمالا حدس زدید که می تونیم از خط ۷ تا ۱۳ رو هم داخل فایل config.inc.php قرار بدهیم چون کارهای روتینی هستند که همیشه انجام خواهیم داد و به این ترتیب از حجم کدهامون کم می شود . همینطور که می بینید چون متغیر $db
که قبلا ساختیم در داخل تابع در دسترس نیست امدیم و در خط ۲۲ یک نمونه جدید از آن ساختیم .
در خط ۲۴ چون مقداری رو که از کاربر گرفتیم به دیتابیس می فرستیم تا تطبیق داده شود ،از متد $db->escape()
کلاس مون استفاده کردیم تا جلوی حملات تزریق sql گرفته شود.به این حملات اصطلاحا XSS گفته می شود و در آن شخص نفوذگر سعی می کند با فرستادن و تزریق کدهای خاصی به دیتابیس دسترسی پیدا کرده و کارهای مورد نظرش را انجام دهد. این متد تا حد خوبی از این کار جلوگیری می کند و برنامه ما را امن تر می سازد
در خط ۲۵ هم از یک متد دیگر کلاس مون استفاده کردیم که پرس و جوی sql رو همزمان اجرا کرده و مقدار را هم بر می گرداند.
توجه کنید چون در اینجا نهایتا یک رکورد از جدول user برگردانده می شود از این متد استفاده کردیم . اگر تعداد رکورد ها بیشتر از یکی باشند از متد دیگری بهره خواهیم برد که در ادامه خواهیم دید
بروزکردن رکوردی از جدول (update)
آپدیت یکی از کارهای معمول در برنامه هاست که هنگام ویرایش اطلاعات انجام می شود . این کار با استفاده از کلاس فوق ساده تر از روش معمول هست به این صورت :
// update an existing record using update() $data['comments'] = 3536; $data['title'] = "New Article"; // special cases supported for update: NULL and NOW() $data['author'] = "NULL";// it knows to convert NULL and NOW() from a string // also supports increment to the current database value // will also work with a negative number. eg; INCREMENT(-5) $data['views'] = "INCREMENT(1)"; // update() parameters // table name (ideally by calling a constant defined in config file) // assoc array with data (does not need escaped) // where condition $db->update(TABLE_NEWS, $data, "news_id='46'"); // would create the query: // UPDATE `news` SET `comments`='3536', `title`='New Article', // `author`=NULL, `views`=`views` + 1 WHERE news_id='46'
همونطور که می بینید داده ها رو در یک آرایه قرار دادیم که کلید آرایه در واقع نام فیلد در جدول مون هست . بعد این آرایه مقادیر رو به همراه نام جدول و شرط مورد نظر به متد update سپردیم و داده ها بروز شدند.
وارد کردن اطلاعات جدید در جدول (insert)
درج اطلاعات جدید هم تقریبا مثل بروز کردن اطلاعات هستش فقط در اینجا شرط نیاز نیست :
// insert a new record using insert() $data['news_id'] = 47; $data['title'] = "You're Top"; // insert() will auto escape it for us $data['created'] = "NOW()";// it knows to convert NULL and NOW() from a string // insert() parameters // table name (ideally defined as a constant, but did not for this example) // assoc array with data (does not need escaped) // insert() returns // primary id of the inserted record. you can collect or ignore $primary_id = $db->insert("news", $data); // then use the returned ID if you want echo "New record inserted: $primary_id"; // would create the query: // INSERT INTO `news` (`news_id`,`title`,`created`) // VALUES ('47', 'Your\'re Top', NOW())
حذف اطلاعات از جدول (delete)
حذف اطلاعات نیز به سادگی قابل انجام است :
// delete a specific entry $sql = "DELETE FROM `".TABLE_USERS."` WHERE `user_id`=$user_id"; $db->query($sql);
جستجوی در جدول (search)
کد زیر کار جستجو رو انجام می دهد و داخل جدول گشته و اگر مقدار فیلد referer در جایی شامل آدرس سایت گوگل بود ، توسط یک حلقه while رکورد های یافت شده را نمایش میده.در اینجا هم از سه متد اصلی کلاس یعنی escape() query() fetch()
استفاده شده:
// escape() query() and fetch() // pullout the first 10 entries where referrer came from google // using defined TABLE_USERS table name from config // $db->escape() escapes string to make it safe for mysql $url = "http://www.google.com/"; $sql = "SELECT user_id, nickname FROM `".TABLE_USERS."` WHERE referrer LIKE '".$db->escape($url)."%' ORDER BY nickname DESC LIMIT 0,10"; $rows = $db->query($sql); while ($record = $db->fetch($rows)) { echo "<tr><td>$record[user_id]</td> <td>$record[nickname]</td></tr>"; }
یک روش دیگر هم با استفاده از این کلاس می تونیم به انجام برسونیم که تعداد خط کدهاش کمتر باشد . مثل :
// using escape() and fetch_array() // pullout the first 10 entries where url came from google // using defined TABLE_USERS table name from config // $db->escape() escapes string to make it safe for mysql $url = "http://www.google.com/"; $sql = "SELECT user_id, username FROM `".TABLE_USERS."` WHERE referer LIKE '".$db->escape($url)."%' ORDER BY username DESC LIMIT 0,10"; // feed it the sql directly. store all returned rows in an array $rows = $db->fetch_array($sql); // print out array later on when we need the info on the page foreach($rows as $record){ echo "<tr><td>$record[user_id]</td> <td>$record[username]</td></tr>"; }
اگر بخواهیم از انجام شدن درست عملیات های وارد کردن اطلاعات یا بروز کردن اطلاعات مطمئن بشیم هم یک متد در نظر گرفته شده است که به این صورت مورد استفاده قرار می گیرد :
// using $db->affected_rows // returns the number of rows in a table affected by your query // can be used after UPDATE query (to see how many rows are updated) // can be used after SELECT query (to see how many rows will be returned) $sql = "SELECT `username` FROM `".TABLE_USERS."` WHERE `user_status`='1'"; $row = $db->query($sql); if($db->affected_rows > 0){ echo "Success! Number of users found: ". $db->affected_rows; } else{ echo "Error: No user found."; }
نکته : نسخه ۳ این کلاس فقط در php نسخه ۵ کاربرد دارد واگر از نسخه های قدیمی php استفاده می کنید می توانید از ورژن ۲ این کلاس بهره ببرید
امیدوارم مورد استفاده تون قرار گرفته باشه و در کارهاتون ازش استفاده کنید.اگر سوال یا مشکلی در مورد این کلاس داشتید لطفا در انجمن سایت مطرح کنین تا با طور کامل بتونیم پاسخ بدیم .اگر کلاس دیگر و بهتری سراغ دارین معرفی کنید حتما استفاده خواهیم کرد.
سلام من احسان هستم یه سوال داشتم در موردphp ببخشید اگه بخوام یه تکس باس که
ایمیل رو از کاربر میگیره و در دیتا بیس ثبت میکنه قبل از ثبت بره ببینه این ایمیل وجود داره یا نه
و پیغامی رو نشون بده باید چیکار کنم
اگه میشه جواب رو به ایمیلم بفرستید
اگه میشه راهنماییم کنید
سلام
برای اینکه ببینیم ایمیل وجود داره یا نه این هست که یک ایمیل به اون آدرس بفرستیم و اگر کاربر ایمیل رو دریافت کرد می فهمیم هست . کدهای فعالسازی که بعد از ثبت نام در اکثر سایت ها برای ایمیل شما فرستاده میشه برای همین موضوع هست . ولی در همان موقع ثبت نام امکانش نیست فقط می تونیم چک کنیم که درست وارد کرده باشه مثلا @ رو داشته باشه و ساختارش درست باشه
سلام اقا علی من ۲ تا فایل دانلود کردم نمیدونم چطوری باهاش کار کنم اگ میشه کمک کنین ایمیل من [email protected]و ایدی تلگرامم [email protected]
خیلی مفید بود و تشکر از اینکه این هم وقت میذارین.
سلام
خوب هستین؟
لطفا وقتی آموزشی رو ترجمه میکنین و در سایت درج میکنین کدهای اصلی رو هم برا دانلود قرار بدین
http://tutorialzine.com/2010/06/simple-ajax-commenting-system
با سپاس
سلام
مرسی
چشم حتما
موفقیت
خوب بود
کد خوب و خلاصه ایه. فقط این یک تیکه رو بعد از تابع obtain بزارید:
or die(‘Error In Connecting to Database.’);
این پیغام خطایی میده که جایگزین خطای پیشفرض میشه. چون با بعضی تنظیمات سرور خطا تو اتصال به خاطر بالا بودن ریکوئست ها یا دلایل دیگه ممکنه باعث بشه اطلاعات حساسی رو تو پیغام خطا به بازیدید کننده نشون بده و ضعف امنیتی محصوب میشه.
ممنون . این کلاس توش یه متغیر بنام debug$ هست که اگه مقدارش رو false کنیم دیگه خطایی نشون نمیده . فک کنم این راهم خوب باشه برای عدم نمایش خطا