در این مقاله آموزشی PDO در PHP درباره احرای عملیات CRUD کار با دیتابیس ، ساخت (Create) ، خواندن (Read) ، بروزرسانی (Update) و حذف (ِDelete) مثال هایی را خواهیم دید .
در این مثال ، ما یک جدول posts برای انجام عملیات CRUD و کار با PDO در PHP داریم. اسکریپت SQL برای ساخت این جدول در سورس کد پایان این مقاله برای دانلود قرار داده شده است . ما یک اتصال PDO در فایل common ایجاد و این فایل را درجایی که نیاز به اتصال دیتابیس باشد include می کنیم.
ساخت اتصال دیتابیس با PDO در PHP
در کد زیر یک شئ از کلاس PDO ساختیم و در متغییر $pdo_conn ذخیره کرده ایم .
1 2 3 4 5 |
<?php $database_username = 'root'; $database_password = ''; $pdo_conn = new PDO( 'mysql:host=localhost;dbname=blog_samples', $database_username, $database_password ); ?> |
ساخت (Create) یک سطر جدید در جدول دیتابیس
کد زیر HTML را برای ساخت فرم و کد php را برای فراخوانی فایل اتصال به دیتابیس و انجام عملیات Create نمایش می دهد . با ارسال (submit) این فرم اطلاعات فیلد ها در یک سطر جدید اضافه می کند . این فرم ها برای ثبت یک خبر ، ثبت نام کاربر و ساخت فرم تماس با ما و… استفاده می شوند.
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 |
<?php if(!empty($_POST["add_record"])) { require_once("db.php"); $sql = "INSERT INTO posts ( post_title, description, post_at ) VALUES ( :post_title, :description, :post_at )"; $pdo_statement = $pdo_conn->prepare( $sql ); $result = $pdo_statement->execute( array( ':post_title'=>$_POST['post_title'], ':description'=>$_POST['description'], ':post_at'=>$_POST['post_at'] ) ); if (!empty($result) ){ header('location:index.php'); } } ?> <html> <head> <title>PHP PDO CRUD - Add New Record</title> </head> <body> <div style="margin:20px 0px;text-align:right;"><a href="index.php" class="button_link">Back to List</a></div> <div class="frm-add"> <h1 class="demo-form-heading">Add New Record</h1> <form name="frmAdd" action="" method="POST"> <div class="demo-form-row"> <label>Title: </label><br> <input type="text" name="post_title" class="demo-form-field" required /> </div> <div class="demo-form-row"> <label>Description: </label><br> <textarea name="description" class="demo-form-field" rows="5" required ></textarea> </div> <div class="demo-form-row"> <label>Date: </label><br> <input type="date" name="post_at" class="demo-form-field" required /> </div> <div class="demo-form-row"> <input name="add_record" type="submit" value="Add" class="demo-form-submit"> </div> </form> </div> </body> </html> |
خواندن داده ها از دیتابیس با PDO در PHP
بعد از ساختن یک سطر جدید در جدول دیتابیس ، قصد داریم همه اطلاعات سطر ها را با روش PDO در PHP بخوانیم (fetch) و در قالب یک لیست نمایش بدیم .
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 |
<?php require_once("db.php"); ?> <html> <head> <title>PHP PDO CRUD</title> <style> body{width:615px;font-family:arial;letter-spacing:1px;line-height:20px;} .tbl-qa{width: 100%;font-size:0.9em;background-color: #f5f5f5;} .tbl-qa th.table-header {padding: 5px;text-align: left;padding:10px;} .tbl-qa .table-row td {padding:10px;background-color: #FDFDFD;vertical-align:top;} .button_link {color:#FFF;text-decoration:none; background-color:#428a8e;padding:10px;} </style> </head> <body> <?php $pdo_statement = $pdo_conn->prepare("SELECT * FROM posts ORDER BY id DESC"); $pdo_statement->execute(); $result = $pdo_statement->fetchAll(); ?> <div style="text-align:right;margin:20px 0px;"><a href="add.php" class="button_link"><img src="crud-icon/add.png" title="Add New Record" style="vertical-align:bottom;" /> Create</a></div> <table class="tbl-qa"> <thead> <tr> <th class="table-header" width="20%">Title</th> <th class="table-header" width="40%">Description</th> <th class="table-header" width="20%">Date</th> <th class="table-header" width="5%">Actions</th> </tr> </thead> <tbody id="table-body"> <?php if(!empty($result)) { foreach($result as $row) { ?> <tr class="table-row"> <td><?php echo $row["post_title"]; ?></td> <td><?php echo $row["description"]; ?></td> <td><?php echo $row["post_at"]; ?></td> <td><a class="ajax-action-links" href='edit.php?id=<?php echo $row['id']; ?>'><img src="crud-icon/edit.png" title="Edit" /></a> <a class="ajax-action-links" href='delete.php?id=<?php echo $row['id']; ?>'><img src="crud-icon/delete.png" title="Delete" /></a></td> </tr> <?php } } ?> </tbody> </table> </body> </html> |
بروزرسانی سطرهای جدول دیتابیس
در فرم آپدیت ، ما مقادیر سطر خاصی را از دیتابیس خوانده و آنها را در فیلد های مشخص شده نمایش می دهیم . کد زیر به شما نحوه آپدیت یک سط از جدول را توسط PDO در PHP نمایش می دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php require_once("db.php"); if(!empty($_POST["save_record"])) { $pdo_statement=$pdo_conn->prepare("update posts set post_title='" . $_POST[ 'post_title' ] . "', description='" . $_POST[ 'description' ]. "', post_at='" . $_POST[ 'post_at' ]. "' where id=" . $_GET["id"]); $result = $pdo_statement->execute(); if($result) { header('location:index.php'); } } $pdo_statement = $pdo_conn->prepare("SELECT * FROM posts where id=" . $_GET["id"]); $pdo_statement->execute(); $result = $pdo_statement->fetchAll(); ?> |
حذف سطر توسط PDO
کد زیر به شما نمایش می دهد چگونه یک سطر از جدول را حذف کنید
1 2 3 4 5 6 |
<?php require_once("db.php"); $pdo_statement=$pdo_conn->prepare("delete from posts where id=" . $_GET['id']); $pdo_statement->execute(); header('location:index.php'); ?> |
دیدید به چه راحتی از PDO در PHP برای تمام عملیات های مربوط به دیتابیس استفاده کردیم . استفاده از PDO برای پروژه هایتان میتوانید تا حد بسیار زیادی امنیت کار با دیتابیس ، راحتی و سرعت را بالا ببرد .
هر گونه مشکلی در پیاده سازی این کد ها داشتید از بخش نطرات در ارتباط باشید در کمترین زمان به سوالتان پاسخ داده خواهد شد .مرسی
موفق باشید
برای دانلود سورس کامل عملیات CRUD با PDO در PHP از قسمت زیر اقدام کنید
سلام.
امکان ساخت دو current_timestamp() timestamp در دو زمان مختلف هست . وقتی اطلاعات وارد فیلد اول میشه هر دو زمان با هم ساخته میشه. راه دیگه ای هست بدون استفاده از ON UPDATE CURRENT_TIMESTAMP .
سلام آقای شفیعی
یه پست دارم که وقتی روش کلیک میشه میره صفحه سینگل پیج
اما مطلب رو کامل نمیبره
همش ازforeach خطا میگیره.
سلام. در مورد نمایش اطلاعات پست وردپرس با php جستجو کنید حتما جایی رو اشتباه زدید
آموزش : https://ghabchin.com/wordpress-template-files
سلام . من یک دیتابیس ایجاد کردم و روی utf8_persian_ci قرار دادم
وقتی با phpmyadmin کار می کنم و دیتا ذخیره می کنم ، درست است ،
ولی وقتی با php با PDO اتصال برقرار می کنم ، و کوئری را اجرا
می کنم ، حروف فارسی به شکل “؟” می آید ولی حروف انگلیسی یه خوبی
می آید .
– خروجی رو print_r هم کردم و مطمئنم
– نسخه php : 7.2.4 هست
– وقتی همان کوئری رو با phpmyadmin اجرا می کنم به درستی می آید
– مرورگر من chrome ، نسخه ۸۷ هست
ممنون می شوم راهنایی کنید
سلام.
کانکشن دیتابیستون رو به اینصورت بسازید :
$pdo_conn = new PDO( ‘mysql:host=localhost;dbname=DBNAME’, $database_username, $database_password ,
array(PDO::MYSQL_ATTR_INIT_COMMAND => “SET NAMES utf8”));
یعنی یک پارمتر بیشتر به نام array(PDO::MYSQL_ATTR_INIT_COMMAND => “SET NAMES utf8”) اضافه کنید تا مشکل اتصال utf8 حل بشه
خیلی ممنون ، مشکل رفع شد
سلام من این کدو نوشتم کار نمیکنه چرا؟
$sql = “INSERT INTO two (id, name , username ,password ) VALUES (NULL , ?, ?,?)”;
$result = $connect->prepare($sql);
$result->bindValue(1, $_POST[“name”]);
$result->bindValue(2, $_POST[“username”]);
$result->bindValue(3, $_POST[“password”]);
$result->execute();
سلام.
یکبار خروحی result رو var_dump کنید ببینید اوکی هست یا نه.
مقدار $_POST رو var_dump کنید تا مطمین بشید داده ای داخلش قرار داره یا خیر.
همچنین خود کویری را به جای ? ها مقدار واقعی بزارید مثلا ‘testt’ و بعد داخل phpmyadmin اجرا کنید تا ببینید ثبت میشه یا خیر.
سلام وقت بخیر
چطور میشه قبل از حذف تایید گرفت؟
سلام ممنون.
میتونید از جاواسکریپت و دستور confirm استفاده کنید.
موفق باشید.
سلام.قبلا روی کامپیوتر خودم با دستور get_result کار میکردم و مشکلی نداشتم.حالا که روی هاست میخوام اجرا کنم خطا میده که این دستور تعریف نشده است.پشتیبانی سایت هم میگه مشکل از برنامه شما است.تو اینترنت که سرچ میکنم میگه مشکل از نصب یا فعال نبودن mysqlnd روی هاست است.لطفا راهنمایی کنین
سلام . ورژن php رو چک کنید که روی ۵٫۳ به بالا باشد.
موفق باشید.
سلام
چرا در قسمت حذف کد pdo از $_get برای آیدی استفاده کردید این روش امن هست؟ دقیقا این کد👇
$pdo_statement=$pdo_conn->prepare(“delete from posts where id=” . $_GET[‘id’]
ممنون از توضیحات تون.
سلام . خیر باید مقادیر رو با bindValue یا bindParam به کویری اضافه کنید یا اینکه همان کد بالا رو استفاده کنید و با توابعی مثل intval مقدار عددی رو دریافت و استفاده کنید.
موفق باشیذ.
سلام من یه مشکلی دارم،زمانی که چند ردیف اظافه میکنم و کلی حذف یکی رو میزنم همه حذف میشن،ممکنه مشکل از اشتباه ساخته شدنid باشه؟
سلام . هنگام ساخت ستون id باید تیک گزینه Auto increament رو بزنید تا خودکار با هر insert مقدارش +۱ و یکتا باشه.
موفق باشید.
میزنم اما ارور Query error:
#۱۰۷۵ – Incorrect table definition; there can be only one auto column and it must be defined as a key میده
احتمالا یک ستون دیگر رو auto increament قرار دادید. بهتره یکبار جدول رو پاک کنید و مجددا ستون ها رو بسازید و دقت کنید ستون id را primary key و بصورت Auto increment قرار بدید و بقیه ستون ها را نوع varchar و تعداد کاراکتر ها رو تعیین و ساخت رو بزنید . مطمینا مشکل حل میشه .
موفق باشید.
سلام وقت بخیر
میشه یکم بیشتر توضیح بدید،الان اسم دیتابیس شما”blog_samples” انتخاب کردید،اسم جدولی که باید تو دیتابیس بسازیم چیه؟
سلام ممنون.
از کویری Insert مشخص است که چه جدولی باید ساخته بشه
جدول : posts
ستون های این جدول : id, post_title, description, post_at
موفق باشید.
تو جدولی که ساختیم id باید از چه نوعی باشه،یعنی type چی باید باشه،text,int,varcher?
بصورت int و auto increament قرار بدید.
باسلام
من برای شرکتی برنامه اندرویدی ساختم از من خواستن که با سیستم otp درون پرداخت برنامه ای ایجاد کنم
ممکنه راهنمایی کنید
باتشکر گل محمدی
سلام . پاسخ به ایمیل شما ارسال شد . موفق باشید