در آموزش اتصال به دیتابیس با mysqli ، قصد داریم نحوه پیادی سازی عملیات CRUD توسط MYSQLi و prepared statement را یاد بگیریم
Mysqli چیست ؟
در نسخه های قدیمی تر PHP مثل PHP4 از mysql استفاده میشد و کاملا برای تمامی برنامه نویس ها جا افتاده بود. اما در نسخه های جدید php یعنی در حال حاضر PHP7 و PHP5.6 برای کار با دیتابیس از افزونه پیشرفته تری استفاده میشه. این افزونه که بهینه شده ی MySql هست MySqli نامگذاری شده. (افزونه PDO برای اتصال به انواع دیتابیس ها در PHP)
- در این ماژول شما میتونید هم بصورت شی گرایی یا Object Oriented کار کنید هم بصورت Procedural . البته روش شی گرایی انعطاف پذیر تر هست و شما راحت تر میتونید باهاش کار کنید.
- MySqli فقط با دیتابیس MySql سازگاری داره.
- MySqli میتونه Stored Procedure رو هم Call کنه که این از نظر Sql Injection امنیت شمارو تامین میکنه.
- MySqli توسعه یافته ی MySql هست و طبق تجارب بدست اومده سرعت عملکردش از PDO هم بیشتره.
- اگر کنترل پنل شما ویندوز و یا لینوکس باشه ، MySqli بطور کامل روی کنترل پنلتون نصب هست و نیازی به نصب ندارید.
نکته : اگر Procedural یا همان رویه ای کار می کنید تفاوتی بین MySql و MySqli نمیبینید جر اینکه حرف i به دستورات اضافه شده، اما شی گرایی کاملا متفاوت عمل میکنه.
Prepared statement چیست ؟ یک قابلیت برای اجرای کردن یک دستور SQL مشابه به دفعات زیاد و با کارایی بالا است . در واقع دستورات prepare شده یک قالب استاندارد برای دستورات SQL است .
استفاده از دستورات از پیش تعیین شده یا همان prepared statement از لحاظ کارایی ، سرعت و امنیت ، مزیت های زیادی دارد . با استفاده از این متد ، کوئری برای بار اول کامپایل شده و منابع مورد نظر ساخته و در دستورات prepare شده ذخیره می شوند . این شئ (object) برای دفعات بعد در کدهایمان استفاده می شوند که باعث کاهش زمان اجرا (execute) می شوند.
در این مثال از اتصال به دیتابیس با mysqli، من یک جدول employee در دیتابیس با عملیات CRUD می سازم . ما به دیتابیس متصل و یک کوئری را برای INSERT ،UPDATE، DELETE، SELECT آماده می کنیم .
بعد اگر نیاز بود ، مقادیر را به پارامتر های کوئری ، Bind میکنیم . در مقاله قبلی در مورد آموزش pdo در php دیدم.
Create توسط prepared Statement
این کد از اتصال به دیتابیس با mysqli ، به شما یک فرم HTML برای ثبت یک سطر جدید در دیتابیس را نشان می دهد. سه فیلد برای جمعاوری اطلاعات کارکنان (employee) وجود دارد . با ارسال (submit) این فرم ، داده فیلد های این فرم به صفحه php ارسال می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<form name="frmUser" method="post" action=""> <div class="button_link"><a href="index.php"> Back to List </a></div> <table border="0" cellpadding="10" cellspacing="0" width="500" align="center" class="tbl-qa"> <thead> <tr> <th colspan="2" class="table-header">Add New Employee</th> </tr> </thead> <tbody> <tr class="table-row"> <td><label>Department</label></td> <td><input type="text" name="department" class="txtField"></td> </tr> <tr class="table-row"> <td><label>Name</label></td> <td><input type="text" name="name" class="txtField"></td> </tr> <tr class="table-row"> <td><label>Email</label></td> <td><input type="text" name="email" class="txtField"></td> </tr> <tr class="table-row"> <td colspan="2"><input type="submit" name="submit" value="Submit" class="demo-form-submit"></td> </tr> </tbody> </table> </form> |
در کد php ، دستور sql برای insert و bind کردن مقادیر فرم به پارامتر های کوئری ایجاد می شود .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php if (isset($_POST['submit'])) { require_once("db.php"); $sql = $conn->prepare("INSERT INTO tbl_emp_details (department,name,email) VALUES (?, ?, ?)"); $department=$_POST['department']; $name = $_POST['name']; $email= $_POST['email']; $sql->bind_param("sss", $department, $name, $email); if($sql->execute()) { $success_message = "Added Successfully"; } else { $error_message = "Problem in Adding New Record"; } $sql->close(); $conn->close(); } ?> |
خواندن سطر ها
کد زیر برای خواندن لیست کارکنان از دیتابیس به کار می رود . این لیست شامل عملیاتی برای ویرایش یا حذف هر کدام دارد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
<?php require_once("db.php"); $sql = "SELECT * FROM tbl_emp_details"; $result = $conn->query($sql); $conn->close(); ?> <html> <head> <link href="style.css" rel="stylesheet" type="text/css" /> <title>Employee</title> </head> <body> <div class="button_link"><a href="add.php">Add New</a></div> <table class="tbl-qa"> <thead> <tr> <th class="table-header" width="20%">Department </th> <th class="table-header" width="20%"> Name </th> <th class="table-header" width="20%"> Email </th> <th class="table-header" width="20%" colspan="2">Action</th> </tr> </thead> <tbody> <?php if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { ?> <tr class="table-row" id="row-<?php echo $row["id"]; ?>"> <td class="table-row"><?php echo $row["department"]; ?></td> <td class="table-row"><?php echo $row["name"]; ?></td> <td class="table-row"><?php echo $row["email"]; ?></td> <!-- action --> <td class="table-row" colspan="2"><a href="edit.php?id=<?php echo $row["id"]; ?>" class="link"><img title="Edit" src="icon/edit.png"/></a> <a href="delete.php?id=<?php echo $row["id"]; ?>" class="link"><img name="delete" id="delete" title="Delete" onclick="return confirm('Are you sure you want to delete?')" src="icon/delete.png"/></a></td> </tr> <?php } } ?> </tbody> </table> </body> </html> |
Update توسط prepared Statement
با کلیک بروی گزینه عملیات ویرایش در لیست بالا ، فرم ویرایش کارکنان برای کاربر نمایش داده می شود . بعد از submit داده های ویرایش شده فرم ، prepared Statement برای اجرای دستور update ساخته می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
<?php require_once("db.php"); if (isset($_POST['submit'])) { $sql = $conn->prepare("UPDATE tbl_emp_details SET department=? , name=? , email=? WHERE id=?"); $department=$_POST['department']; $name = $_POST['name']; $email= $_POST['email']; $sql->bind_param("sssi",$department, $name, $email,$_GET["id"]); if($sql->execute()) { $success_message = "Edited Successfully"; } else { $error_message = "Problem in Editing Record"; } } $sql = $conn->prepare("SELECT * FROM tbl_emp_details WHERE id=?"); $sql->bind_param("i",$_GET["id"]); $sql->execute(); $result = $sql->get_result(); if ($result->num_rows > 0) { $row = $result->fetch_assoc(); } $conn->close(); ?> <html> <head> <link href="style.css" rel="stylesheet" type="text/css" /> <style> .tbl-qa{border-spacing:0px;border-radius:4px;border:#6ab5b9 1px solid;} </style> <title>employee edit </title> </head> <body> <?php if(!empty($success_message)) { ?> <div class="success message"><?php echo $success_message; ?></div> <?php } if(!empty($error_message)) { ?> <div class="error message"><?php echo $error_message; ?></div> <?php } ?> <form name="frmUser" method="post" action=""> <div class="button_link"><a href="index.php" >Back to List </a></div> <table border="0" cellpadding="10" cellspacing="0" width="500" align="center" class="tbl-qa"> <thead> <tr> <th colspan="2" class="table-header">Employee Edit</th> </tr> </thead> <tbody> <tr class="table-row"> <td><label>Department</label></td> <td><input type="text" name="department" class="txtField" value="<?php echo $row["department"]?>"></td> </tr> <tr class="table-row"> <td><label>Name</label></td> <td><input type="text" name="name" class="txtField" value="<?php echo $row["name"]?>"></td> </tr> <tr class="table-row"> <td><label>Email</label></td> <td><input type="text" name="email" class="txtField" value="<?php echo $row["email"]?>"></td> </tr> <tr class="table-row"> <td colspan="2"><input type="submit" name="submit" value="Submit" class="demo-form-submit"></td> </tr> </tbody> </table> </form> </body> </html> |
حذف توسط prepared Statement
در این قسمت از کد php اتصال به دیتابیس با mysqli ، به شما ساخت کوئری delete برای حذف یک سطر از جدول با استفاده از دستورات prepare شده را نشان می دهیم . این صفحه زمانی اجرا می شود که گزینه delete در لیست بالا انتخاب شده باشد . ID کارمند مورد با استفاده از متد GET به این صفحه ارسال می شود . این آی دی در کوئری مورد نظر برای حذف یک سطر مشخص استفاده می شود.
1 2 3 4 5 6 7 8 9 10 |
<?php require_once("db.php"); $sql = $conn->prepare("DELETE FROM tbl_emp_details WHERE id=?"); $sql->bind_param("i", $_GET["id"]); $sql->execute(); $sql->close(); $conn->close(); header('location:index.php'); ?> |
امیدوارم از آموزش اتصال به دیتابیس با mysqli لذت برده باشید.
برای دانلود سورس کد اتصال به دیتابیس با mysqli از قسمت زیر اقدام کنید
هر سوالی داشتید, از طریق قسمت نظرات ارسال کنید. سریعا, پاسخگوی سوالات شما هستیم.
موفق و پیروز باشید.
سلام
خیلی ممنونن بابت آموزش عالیتون یک سوال برام پیش اگر بخوایم تعدا ردیف هایی که در پایگاه داده mysqli دخیره شده (منظورم تمامی اطلاعات هستش که در یک table ذخیره شده) راه به صورت عدد نمایش دهیم از چه کد php باید استفاده کنیم؟
سلام. خوشحالیم که مفید واقع شده.
از mysqli_num_rows استفاده کنید :
موفق باشید.
سلام من میخوام یه بخش توی سایتم درست کنم که این سیستم اول به دیتابیس وصل بشه بعد به جدولی که میخوام متصل بشه
بعد با اچ تی ام ال یک فرم بنویسم که از کاربر کد ملی شو بگیر وقتی کد ملی وارد شد سیستم توی اون جدولی که مشخص کردیم اگر اون کد ملی و پیدا کرد اطلاعاتش و نشون بده مثلا بگه نام شما فلان هست و نام خانوادکی شما فلانه . آموزششو دارید توی سایت؟
سلام. باید با ترکیب این آموزش با آموزش https://netparadis.com/post-get-variables-php , اسکریپت موردنظر رو بنویسید.
موفق باشید.
سلام خسته نباشید
من یه منو با html ساختم که میخوام وقتی روی هر کدوم از optionها کلیک میکنم عکس های مربوط به اون موضوع خاص رو نمایش بده میشه لطفا راهنمایی کنین ممنون.
سلام . ممنون نیاز است که از جاواسکریپت بهره ببرید.
موفق باشید.
سلام
برای جلوگیری ازsql injection در mysqli کد خاصی باید نوشت چون دستورات جلوگیری از injection در mysql تو mysqli کار نمیکنه و خطا میده
سلام . برای جلوگیری از sql injection در استفاده از اکستنشن mysqli هنگام اتصال به دیتابیس بهتر است که مقادیر را مستقیما در کویری خود استفاده نکنید و برای همین کویری sql خود را prepare کنید تا در هنگام bind کردن داده های کاربر در کویری موارد غیرضروری که باعث break شدن دستور sql و بروز باگ sqli میشود جلوگیره بشه .
به عنوان مثال میتوانید به اینصورت کویری خود را اجرا کنید تا جلوی باگ sql injection گرفته بشه .
همچنین میتوانید در هنگام دریافت مقادیر عددی از دستور intval و شرط های مربوط استفاده کنید تا ورودی های غیر ضروری از داده های دریافتی حذف بشه .
یکی دیگر از توابع پر کاربر filter_var است که بطور کامل میتوانید ورودی ها را کنترل و حتی قبل از استفاده در کویری sanitize یا همان پاکسازی کنید
اعتبار سنجی فرم ها در php
موفق و پیروز باشید
سلام و خسته نباشید.
من با استفاده از دستور زیر میام و تعداد تیکت های یک یوزر رو میکشم بیرون :
و با این دستور میگم اگه برابر صفر نبود چاپ کنه :
ولی فقط متن و موضوع اولی رو نشون میده و بقیه رو نشون نمیده.
چجوری باید ای دی هر کدوم رو جدا دریافت یا در رشته ای بریزم؟
با تشکر از سایت خوبتون و خودتون 🙂
سلام . مرسی . برای اینکار شما باید از حلقه ها استفاده کنید . مثلا من از حلقه while استفاده می کنم و میگم تا زمانی که سطری در جدول بود حلقه ادامه پیدا کنه که در اینصورت همه ی سطر های مربوط به اون یوزر رو میکشه بیرون
ممنونم . موفق باشید