آموزش pdo

امین موسائی

کاربر عضو
در ادامه میخوایم شمارو با pdo اشنا کنیم و ببینیم چطور میشه ازش استفاده کرد

pdo یک افزونه بسیار قدرتمند و سبک برای اتصال به دیتابیس در php هست

ازخصوصیاتش میشه به پشتیبانی از دیتابیسهای مختلف اشاره کرد مثل mysql , sqlite , mssql وغیره تقریبا از ده دوازده تا دیتابیس پشتیبانی میکنه

وامکانی فوق العاده که میشه با تعقیر یه تیکه کد دیتابیس تونو تعقیر بدید اگه سینتکس کدهاتون مشکلی ایجاد نکنه

پشتیبانی از excaptionها نیز میتونه مزیت مهمی باشه که مدیریت خطاهای رخ داده رو راحت میکنه

و میشه pdo رو شخصی سازی کرد و بهش تابع اضافه کنید و رفتار توابعش رو تعقیر بدید و تمام امکانات شی گرائی رو داشته باشید

pdo از سه تا کلاس تشکیل شده

کلاس اصلی pdo که دارای توابع اصلی مثل اجرای کوئری ها و اتصال است

کلاس pdostatement که حاوی توابع پردازش و استفاده از کوئری های اجرا شده مثل fetch

کلاس pdoexcaption که برای مدیریت خطاها مورد استفاده قرار میگیره

خب بریم سر اصل مطلب

اتصال به دیتابیس

یه فایل درست میکنیم به نام connect.php برای اینکه کدهای مربوط به اتصال به دیتابیس در اون ذخیره بشه


کد:
<?php
    $servername = "localhost";
    $serveruser = "root";
    $serverpass = "";
    $dbname = "newsdb";
    $dsn ="mysql:host=$servername;dbname=$dbname";
    try
    {
        $connect = new PDO($dsn,$serveruser,$serverpass);
        $connect->exec("set character set utf8");
        $connect->exec("set names utf8");
    }
    catch(PDOException $error)
    {
        echo $error->__toString();
    }
?>
توضیحات

خط دوم هست که نوع هاست رو در خودش ذخیره میکنه

متغیرخط سوم یوزر نیم پایگاه داده رو داره که بطور پیشفرض root هست اگه تعقیر نداده باشید

متغیرخط چهارم پسورد پایگاه داده رو داره که بطور پیشفرض خالی هست اگه تعقیر نداده باشید

متغیرخط پنجم نام پایگاه داده رو داره

متغیر خط ششم این متغیر حاوی نوع پایگاه داده مون هست :)mysql) چون که pdo از چندین نوع پایگاه داده پشتیبانی میکنه مشخص میکند ما از چه نوع پایکاه داداه ای استفاده میکنیم و نوع هاستی که استفاده میکنیم(host=$servername) و نام دیتابیس(dbname=$dbname)

خط هفتم رو اخر توضیح میدم

خط نهم باید از کلاس pdo یه شئ ایجاد کنیم و در یه متغیر نگه داریم تا ازش در عملیات درج حذف و اپدیت استفاده کنیم خب با دستور new pdo یه شئ از کلاس pdo ایجاد کردیم و در متغیر connect گذاشتیم این شئ سه تا ورودی داره اولیش که میشه dsn که خودش سه تا ورودی داره که در بالا توضیحاتش رو دادم دومین ورودیش یوزرنیم پایگاه داده هست که در اول داخل متغیر نگهش داشتیم همون متغیر رو اینجا میزاریم و سومین ورودی پسوردپایگاه داده هست که اونم داخل متغیر هست واینم مثل دومی متغیرش رو میزاریم.

و دو خط بعدی اومدیم از متغیر connect که شئ اتصال رو در خودش داره استفاده کردیم و با دستور exec یه کوئری رو اجرا کردیم تا موقع درج در دیتابیس با حروف فارسی مشکلی نداشته باشیم

برای مدیریت خطاها باید از try catch استفاده کنیم که در خط هفتم از try استفاده کردیم try یعنی تلاش کردن میگیم اگه به دیتابیس متصل نشدی دوباره تلاش کن و دوباره , اگه در نهایت اتصال ممکن نبود میره و خط سیزدهم رو اجرا میکنه یعنی catch

در خط سیزدهم ازکلاس pdoexcaption برای مدیریت خطا استفاده کردیم


کد:
catch(PDOException $error)
متغیر


کد:
$error
خطای رخ داده رو نگه میداره و در نهایت با دستور echo خطا رو چاپ میکنیم


کد:
__toString()
این دستور جزئیات خط رو میگه یعنی نشون میده که کدوم قسمت و کدوم خط چه اروری وجود داره دقیق میگه ها

البته این بجای این میشه از این دستورات نیز استفاده کرد که جزئیات کمتری رو نشون میدن


کد:
getLine()
getMessage()
getMessage()
وغیره
خب کار اتصال تمومه

من اولین اموزشم بود اگه کم و کاستی داشت به بزرگی خودتون ببخشید

جلسه بعد درج در دیتابیس رو میگم

بای...

 
آخرین ویرایش توسط مدیر:

امین موسائی

کاربر عضو
سلام به خاطر وقفه به وجود امده پوزش می طلبم

خب در این جلسه درج در دیتابیس را با هم انجام میدیم

برای درج یه فایل ایجاد میکنیم به نام insert.php

داخل این فایل یه فرم و دوتا تکست باکس و یه عدد دکمه میزاریم به صورت زیر


کد:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<form id="form1" name="form1" method="post" action="">
  <p>
    <label for="username">username:</label>
    <input type="text" name="username" id="username" />
  </p>
  <p>
    <label for="password">password:</label>
    <input type="password" name="password" id="password" />
  </p>
  <p>
    <input type="submit" name="insert" id="insert" value="insert" />
  </p>
</form>
</body>
</html>
اکشن این فرم رو خالی میزاریم تا به همین صفحه ارسال بشه و متد ارسال رو post انتخاب میکنیم

خب حالا نوبت به php میرسه تا درج انجام بشه

اول یه چیزی بگم من تو phpmyadmin یه دیتابیس ایجاد کردم که سه تا فیلد داره id , username , password

که id به طور خودکار مقدار دهی میشه

دوتای دیگه رو باید کاربر وارد کنه

خب میریم سراغ بررسی فرم

اول کار باید فایل connect.php رو با استفاده از دستور include فراخونی میکنیم. اینکار رو بالای صفحه انجام میدیم

کد فراخوانی


کد:
<?php
    include 'connect.php';
?>
بعد بررسی میکنیم ایا فرم ارسال شده یانه اینکار با دستور شرط انجام میشه اگه فرستاده شده بود دستورات داخل بلاک رو انجام میده وگرنه هیچ کاری نمیکنه

کد بررسی فرم


کد:
if(isset($_POST['insert']))
    {

    }
بعدشم برسی خالی بودن فیلدها رو انجام میدیم


کد:
if(empty($_POST['username']) || empty($_POST['password']))
        {
            echo 'لففا همه فیلدها را تکمیل کنید';
        }
بعد از اینکه بررسی کردیم باید دستور sqlمون رو بنویسیم

خب در pdo دو روش داریم تا عمل درج انجام بشه

یکی bindParam و bindValue

ما این جلسه از bindParam استفاده کردیم

خط اولش یه دستور sql هست که دستور درج هست. جایی که


کد:
(:username , :password)
هست این دونقطه اشاره داره به روش bindParam و یوزرنیم و پسورد هم به فیلدهای مربوطه اشاره داره.

خط بعدش از اون متغیری که در فایل connect.php شئ pdo رو در اون نگه داری کردیم استفاده میکنیم به اینصورت که میگیم متغیر connect اشاره کن به توابع مربوطه مثل query , prepare و غیره و خروجیش رو داخل یه متغیر نگهداری میکنیم تا ازش استفاده کنیم ما در اینجا در متغیر result نگه داشتیم

تابع query امنیت رو برقرار نمیکنه ولی prepare تا یه حدی امنیت sqlinjection و xss رو برقرار میکنه

پس ما هم از prepare استفاده میکنیم و prepare یه ورودی میگیره که همون دستور sql هست پس ماهم برای ورودی همون متغیرsql رو بهش میدیم

حالا باید بگیم متغیر result اشاره کن به bindParam اینجادوتا ورودی داره که اول میشه


کد:
:username
که همون فیلد دیتابیس هست و


کد:
$_POST['username']
که ورودی کاربر است برای پسورد هم مثل یوزر نیم عمل میکنیم


کد:
            $result->bindParam(":username",$_POST['username']);
            $result->bindParam(":password",$_POST['password']);
حالا باید این کوئری رو اجرا کنیم تابع query خودش خودکار اجرا میشد ولی prepare باید اجرابشه که برای این کار میگیم


کد:
$result->execute()
همینجا با استفاده از شرط بررسی میکنیم که اگر execute انجام شد پیغام موفقیت رو چاپ کن در غیر اینصورت پیغام عدم موفقیت رو چاپ کن

کل کد فایل insert.php


کد:
<?php
    include 'connect.php';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<?php
    if(isset($_POST['insert']))
    {
        if(empty($_POST['username']) || empty($_POST['password']))
        {
            echo 'لطفا همه فیلدها را تکمیل کنید';
        }
        else
        {
            $sql ="INSERT INTO `tbl_list_user` (`username`, `password`) VALUES (:username , :password);";
            $result = $connect->prepare($sql);
            $result->bindParam(":username",$_POST['username']);
            $result->bindParam(":password",$_POST['password']);
            if($result->execute())
            {
                echo 'درج انجام شد';
            }
            else
            {
                echo 'درج انجام نشد';
            }
        }
    }
?>
<form id="form1" name="form1" method="post" action="">
  <p>
    <label for="username">username:</label>
    <input type="text" name="username" id="username" />
  </p>
  <p>
    <label for="password">password:</label>
    <input type="password" name="password" id="password" />
  </p>
  <p>
    <input type="submit" name="insert" id="insert" value="insert" />
  </p>
</form>
</body>
</html>
موفق باشید

لینک فایلها تا اینجا



 
آخرین ویرایش توسط مدیر:

امین موسائی

کاربر عضو
سلام بازم به خاطر وقفه به وجود امده پوزش می طلبم

خب در این جلسه خواندن و نمایش اطلاعات از دیتابیس را با هم انجام میدیم

برای نمایش اطلاعات یه فایل ایجاد میکنیم به نام show.php

داخل این فایل یه جدول میزاریم تا یکم مرتب بشه به صورت زیر


کد:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>

    <table width="331" border="1" align="center" dir="rtl">
        <tr>
            <td align="center">نام کاربری</td>
            <td align="center">رمزعبور</td>
        </tr>
        <tr>
            <td height="25" align="center"></td>
            <td align="center"></td>
      </tr>
    </table>
</body>
</html>
خب الان نوبت به نمایش اطلاعات میرسه

اولین کار باید فایل connect.php رو با استفاده از دستور include فراخونی کنیم. در بالای صفحه انجامش میدیم

کد فراخوانی


کد:
<?php
    include 'connect.php';
?>
همینجا بالای سطر دوم جدول این کار رو میکنیم


کد:
 <?php
        $sql = "SELECT * FROM `tbl_list_user`";
        $result = $connect->query($sql);
        while($rows = $result->fetch(PDO::FETCH_ASSOC))
        {
    ?>
        <tr>
            <td align="center"><?=$rows['username']?></td>
            <td align="center"><?=$rows['password']?></td>
      </tr>
      <?php
        }
      ?>
خب یکم توضیح بدم

به کدهای html کاری نداریم که خیلی واضحه

اول یه متغیر به نام sql تعریف کردم که حاوی دستوراته

بعد گفتیم متغیر connectمون از تابع query استفاده کنه و جوابش رو بریزه داخل متغیر result

بعدیه حلقه while هست داخلش یه متغیر بنام rows هست که نتیجه کشیدن اطلاعات توسط fetch رو نگه میداره

این fetch میاد اطلاعات رو سطر به سطر از دیتابیس میگیره و داخل متغیر rows میریزه

که باید داخل tdهای مربوطه چاپ بشه دیگه

درنهایت هم بعد از tr بلاک حلقه رو میبندیم به این شکل


کد:
 <?php
        }
      ?>
تموم شد دیکه بقیه تایپیک بعدی

کل کد این صفحه


کد:
<?php
    include 'connect.php';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>

    <table width="331" border="1" align="center" dir="rtl">
        <tr>
            <td align="center">نام کاربری</td>
            <td align="center">رمزعبور</td>
        </tr>
        <?php
        $sql = "SELECT * FROM `tbl_list_user`";
        $result = $connect->query($sql);
        while($rows = $result->fetch(PDO::FETCH_ASSOC))
        {
    ?>
        <tr>
            <td align="center"><?=$rows['username']?></td>
            <td align="center"><?=$rows['password']?></td>
      </tr>
      <?php
        }
      ?>
    </table>
</body>
</html>
 

امین موسائی

کاربر عضو
باسلام دوباره

این جلسه میخوایم حذف اطلاعات رو بگم

خب تایپیک قبلی نمایش اطلاعات رو گفتم همون فایل show.php روباز کنید و یه ستون به جدولش اضافه کنید عنوانش باشه عملیات و محتواش حذف , ویرایش به صورت زیر


کد:
<?php
    include 'connect.php';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<style type="text/css">
a { text-decoration:none;
}
</style>
</head>

<body>

    <table width="331" border="1" align="center" dir="rtl">
        <tr>
            <td align="center">نام کاربری</td>
            <td align="center">رمزعبور</td>
            <td align="center">عملیات</td>
        </tr>
        <?php
        $sql = "SELECT * FROM `tbl_list_user`";
        $result = $connect->query($sql);
        while($rows = $result->fetch(PDO::FETCH_ASSOC))
        {
    ?>
        <tr>
            <td align="center"><?=$rows['username']?></td>
            <td align="center"><?=$rows['password']?></td>
            <td align="center"><a href="delete.php?id=<?=$rows['id']?>">حذف</a> , <a href="update.php?id=<?=$rows['id']?>">ویرایش</a></td>
      </tr>
      <?php
        }
      ?>
    </table>
</body>
</html>
فقط (حذف) رو به صفحه delete.php و ویرایش رو به صفحه update.php لینک کنید و یک پارامتر یه نام id ارسال کنید به صورت زیر. این پارامتر id اون کاربر رو میفرسته که بر اساس اون id عمل حذف یا ویرایش انجام بشه


کد:
<a href="delete.php?id=<?=$rows['id']?>">حذف</a> , <a href="update.php?id=<?=$rows['id']?>">ویرایش</a>
در صفحه delete.php اول که فایل connect.php باید فراخوانی بشه و بررسی کنه که ایا اون پارامتر id به این صفحه فرستاده شده یانه اگه فرستاده شده بود عمل حذف براساس اون id انجام بشه اگرم id فرستاده نشده بود که برگرده به همون صفحه show.php

کدصفحه delete.php


کد:
<?php
    include 'connect.php';
    if(isset($_GET['id']))
    {
        $sql = "DELETE FROM `tbl_list_user` WHERE `id` = :id ";
        $result = $connect->prepare($sql);
        $result->bindParam(":id",$_GET['id']);
        if($result->execute())
        {
            header("location:show.php?delet=ok");
        }
        else
        {
            header("location:show.php?delete=error");
        }
    }
    else
    {
        header("location:show.php");
    }
?>
خب کار تمام است و عمل حذف انجام میشه

چیز خاصی نداره امایه توضیح مختصری بدم

اول عمل hnclude انجام شده و بررسی کرده که ایا id ارسال شده یا نه

در خط پنجم به بعد یه دستور sql داریم که گفته حذف کن از جدول tbl_list_user به شرطی که idش برابر باشه با اون ایدی که به این صفحه فرستاده شده

به متغیر result رو مساوی قرار بده با متغیر connect و prepare کنه متغیر sql رو بعدشم گفتیم bindParam کنه اون id رو اگه عملexecute انجام شد برگرده به صفحه show.php و پارامتر delete=ok بفرسته درغیر این صورت پارامترdelete=error بفرسته

به همین سادگی به همین خوشمزگی

 

twitfa

کاربر عضو
دروود بر شما

اگه بخواهیم اطلاعاتی که از داخل بانکک اطلاعاتی می خونیم رو به ترتیب حروف الفبا فارسی بخونیم چه کار باید بکنیم ؟ یا از ترتیب های دیگه بچینیم باید چه کار کنیم ؟

با تشکر از اموزش خوبتون

 

امین موسائی

کاربر عضو
سلام خدمت دوستان عزیز

برای اینکار باید به دستور sql این کد رو اضافه کنید ORDER BY `title` ASC به صورت زیر

$sql = " SELECT * FROM `tbl_page` ORDER BY `title` ASC ";این `title` اسم اون فیلدی هست که میخواید چینش براساس اون انجام بشه

موفق باشید

 
آخرین ویرایش توسط مدیر:

امین موسائی

کاربر عضو
سلام خدمت دوستان باعرض معذرت از این که فراموش کردم این قسمت را بزارم

برای آپدیت کردن هم باید مثل حذف کردن id اون کاربر رو بفرستید

صفحه ویرایش هم مثل همون صفحه درج هست بای تعقیر کوچک اینکه یه متغیر برای نگه داشتن id کاربر

به اینصورت

        $id = $_POST["id"];اینم کدصفحه ویرایش

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Untitled Document</title></head><body><form id="form1" name="form1" method="post" action=""> <p> <label for="username">username:</label> <input type="text" name="username" id="username" /> </p> <p> <label for="password">password:</label> <input type="password" name="password" id="password" /> </p> <p> <input type="submit" name="update" id="update" value="update" /> </p></form></body></html>خب حالا باید اطلاعات رو از دیتابیس بخونیم و داخل این تکست باکسها نمایش بدیم تابعدش عمل ویرایش رو انجام بدیم

برای خوندن اطلاعات ونمایش دادن رو قبلا توضیح دادم

فقط برای نمایش داخل تکستها باید در قسمت value انها نمایش یابد

اینطوری

<input name="username" type="text" value="<?=$rows['username']?>" /><input name="username" type="text" value="<?=$rows['username']?>" />خب حالا نوبت به کدهای php میباشد که دربالای همین صفحه مینویسیم

اول: فراخونی فایل اتصال به دیتابیس

دوم: چک کردن id

سوم: اپدیت کردن

اینم کدش

<?php include "connect.php"; if(isset($_POST["update"])) { $id = $_POST["id"]; $username = $_POST["username"]; $password = $_POST["password"]; $sql = "UPDATE `tbl_list_user` SET (`username` = :username , password = :password) WHERE `id` = :id "; $result = $connect->prepare($sql); $result ->bindParam(":username",$username); $result -> bindParam(":password",$password); if($result ->execute()) { echo "آپدیت با موفقیت انجام شد"; } else { echo "آپدیت انجام نشد"; } }?>موفق و پیروز باشید

 
بالا