溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

php中PDO對(duì)象如何安裝配置與使用

發(fā)布時(shí)間:2021-12-21 09:32:53 來(lái)源:億速云 閱讀:143 作者:小新 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)php中PDO對(duì)象如何安裝配置與使用,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

對(duì)PDO對(duì)象的認(rèn)識(shí)

1.1 簡(jiǎn)介

PHP 數(shù)據(jù)對(duì)象 (PDO) 擴(kuò)展為PHP訪問(wèn)數(shù)據(jù)庫(kù)定義了一個(gè)輕量級(jí)的一致接口。實(shí)現(xiàn) PDO 接口的每個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)可以公開(kāi)具體數(shù)據(jù)庫(kù)的特性作為標(biāo)準(zhǔn)擴(kuò)展功能。 注意利用 PDO 擴(kuò)展自身并不能實(shí)現(xiàn)任何數(shù)據(jù)庫(kù)功能;必須使用一個(gè) 具體數(shù)據(jù)庫(kù)的 PDO 驅(qū)動(dòng) 來(lái)訪問(wèn)數(shù)據(jù)庫(kù)服務(wù)。
       PDO 提供了一個(gè) 數(shù)據(jù)訪問(wèn) 抽象層,這意味著,不管使用哪種數(shù)據(jù)庫(kù),都可以用相同的函數(shù)(方法)來(lái)查詢和獲取數(shù)據(jù)。 PDO 不提供 數(shù)據(jù)庫(kù) 抽象層;它不會(huì)重寫(xiě) SQL,也不會(huì)模擬缺失的特性。如果需要的話,應(yīng)該使用一個(gè)成熟的抽象層。

1.2 安裝配置方法

  • PDO 和所有主要的驅(qū)動(dòng)作為共享擴(kuò)展隨 PHP 一起發(fā)布,要激活它們只需簡(jiǎn)單地編輯 php.ini 文件:

extension=php_pdo.dll

注意:這一步在 PHP 5.3及更高版本中不是必須的,對(duì)于 PDO 不再需要做為一個(gè) DLL 文件。

  • 若要連接數(shù)據(jù)庫(kù),還需要去掉與PDO相關(guān)的數(shù)據(jù)庫(kù)擴(kuò)展前面的”;"號(hào),然后重啟Apache服務(wù)器即可。

extension=php_pdo.dll
extension=php_pdo_firebird.dll
extension=php_pdo_informix.dll
extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll
extension=php_pdo_oci.dll
extension=php_pdo_oci8.dll
extension=php_pdo_odbc.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll

1.3 PDO類(lèi)

1.3.1 PDO::__construct

PDO::__construct — 創(chuàng)建一個(gè)表示數(shù)據(jù)庫(kù)連接的 PDO 實(shí)例

  • 說(shuō)明

PDO::__construct ( string $dsn , string $username = ? , string $password = ? , array $driver_options = ? )
  • 參數(shù)

    • dsn
      數(shù)據(jù)源名稱或叫做 DSN,包含了請(qǐng)求連接到數(shù)據(jù)庫(kù)的信息。 通常,一個(gè) DSN 由 PDO 驅(qū)動(dòng)名、緊隨其后的冒號(hào)、以及具體 PDO 驅(qū)動(dòng)的連接語(yǔ)法組成。示例:

      mysql:host=localhost;dbname=pxscj

    • username
      DSN字符串中的用戶名。對(duì)于某些PDO驅(qū)動(dòng),此參數(shù)為可選項(xiàng)。

    • password
      DSN字符串中的密碼。對(duì)于某些PDO驅(qū)動(dòng),此參數(shù)為可選項(xiàng)。

    • driver_options
      一個(gè)具體驅(qū)動(dòng)的連接選項(xiàng)的鍵=>值數(shù)組。

  • 返回值
    成功則返回一個(gè)PDO對(duì)象。

  • 示例

<?php/* Connect to an ODBC database using driver invocation */$dsn = 'mysql:host=localhost;dbname=pxscj';$user = 'user';$password = '123456';try {
    $dbh = new PDO($dsn, $user, $password);} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();}?>
1.3.2 PDO::exec

PDO::exec — 執(zhí)行一條 SQL 語(yǔ)句,并返回受影響的行數(shù)

  • 說(shuō)明

PDO::exec ( string $statement ) : int
  • 參數(shù)

    • statement
      要被預(yù)處理和執(zhí)行的 SQL 語(yǔ)句。

      見(jiàn)解:此處statement應(yīng)妥善處理用戶的輸入防止被SQL注入

  • 返回值
    PDO::exec() 返回受修改或刪除 SQL 語(yǔ)句影響的行數(shù)。如果沒(méi)有受影響的行,則 PDO::exec() 返回 0。

  • 示例

<?php$db=new PDO("mysql:host=localhost;dbname=PXSCJ","user","123456");$delete_sql="delete from userinfo where username='user1'";    //注銷(xiāo)自己的SQL語(yǔ)句$affected=$db->exec($delete_sql);              //執(zhí)行沒(méi)有返回的sql語(yǔ)句$delete_sqlif($affected)                                  //如果受影響記錄數(shù)不為0
    echo "注銷(xiāo)用戶成功!";else
    echo "注銷(xiāo)用戶失敗!";?>
1.3.3 PDO::query

PDO::query — 執(zhí)行 SQL 語(yǔ)句,以 PDOStatement 對(duì)象形式返回結(jié)果集

  • 說(shuō)明

public PDO::query ( string $statement ) : PDOStatement
  • 參數(shù)

    • statement
      需要準(zhǔn)備、執(zhí)行的 SQL 語(yǔ)句。

  • 返回值
    PDO::query() 返回 PDOStatement 對(duì)象,或在失敗時(shí)返回 false。

  • 示例

<?php$db=new PDO("mysql:host=localhost;dbname=pxscj","user","123456");$query="select * from kcb";                 //SQL語(yǔ)句foreach($db->query($query) as $row) {       //執(zhí)行SQL語(yǔ)句$query--執(zhí)行有結(jié)果集的SQL語(yǔ)句
    echo "課程號(hào):".$row[0]."<br>";          //返回的是一個(gè)PDOStatement類(lèi)(型)的對(duì)象
    echo "課程名:".$row[1]."<br>";          //還可以用PDOStatement類(lèi)的方法fetch()行讀
    echo "開(kāi)課日期:".$row[2]."<br>"; 
    echo "學(xué)時(shí):".$row[3]."<br><br>";}?>
1.3.4 PDO::prepare

PDO::prepare — 準(zhǔn)備要執(zhí)行的語(yǔ)句,并返回語(yǔ)句對(duì)象

  • 說(shuō)明

public PDO::prepare ( string $statement , array $driver_options = array() ) : PDOStatement

為PDOStatement::execute() 方法準(zhǔn)備待執(zhí)行的 SQL 語(yǔ)句。 SQL 語(yǔ)句可以包含零個(gè)或多個(gè)參數(shù)占位標(biāo)記,格式是命名(:name)或問(wèn)號(hào)(?)的形式,當(dāng)它執(zhí)行時(shí)將用真實(shí)數(shù)據(jù)取代。 在同一個(gè) SQL 語(yǔ)句里,命名形式和問(wèn)號(hào)形式不能同時(shí)使用;只能選擇其中一種參數(shù)形式。 注:用參數(shù)形式綁定用戶輸入的數(shù)據(jù),不要直接字符串拼接到查詢里,防SQL注入

  • 參數(shù)

    • statement
      必須是對(duì)目標(biāo)數(shù)據(jù)庫(kù)服務(wù)器有效的 SQL 語(yǔ)句模板。

    • driver_options
      數(shù)組包含一個(gè)或多個(gè) key=>value 鍵值對(duì),為返回的 PDOStatement 對(duì)象設(shè)置屬性。

  • 返回值
    如果數(shù)據(jù)庫(kù)服務(wù)器完成準(zhǔn)備了語(yǔ)句, PDO::prepare() 返回 PDOStatement 對(duì)象。 如果數(shù)據(jù)庫(kù)服務(wù)器無(wú)法準(zhǔn)備語(yǔ)句, PDO::prepare() 返回 false 或拋出 PDOException (取決于 錯(cuò)誤處理器)。
    注:模擬模式下的 prepare 語(yǔ)句不會(huì)和數(shù)據(jù)庫(kù)服務(wù)器交互,所以 PDO::prepare() 不會(huì)檢查語(yǔ)句。

  • 示例

$db=new PDO("mysql:host=localhost;dbname=pxscj","user","123456");$in_sql="insert into userinfo(username,password,sex,age,email) values(?,?,?,?,?)";  $in_result=$db->prepare($in_sql);                                                   //預(yù)處理SQL語(yǔ)句$in_sql$userid="php3"; $pwd1="111111"; $sex=0; $age=36; $email="php3@qq.com";$in_result->bindParam(1, $userid);   //PDOStatement的bindParam()的作用是綁定參數(shù)給execute()$in_result->bindParam(2, $pwd1);    //SQL語(yǔ)句使用問(wèn)號(hào)參數(shù)時(shí)--bindParam()第一個(gè)參數(shù)是問(wèn)號(hào)索引偏移(第幾個(gè))$in_result->bindParam(3, $sex);     //bindParam()第二個(gè)參數(shù)是賦值給SQL語(yǔ)句參數(shù)(問(wèn)號(hào))的變量$in_result->bindParam(4, $age);          $in_result->bindParam(5, $email);$in_result->execute();             //執(zhí)行經(jīng)過(guò)預(yù)處理的SQL語(yǔ)句$in_resultif($in_result->rowCount()==0)     //用PDOStatement的rowCount()返回結(jié)果集行的總數(shù)
    echo "插入記錄失敗!";else
    echo "插入記錄成功!";
1.3.5 PDO::beginTransaction

PDO::beginTransaction — 啟動(dòng)一個(gè)事務(wù)

  • 說(shuō)明

PDO::beginTransaction():bool
  • 返回值
    成功時(shí)返回 true, 或者在失敗時(shí)返回 false。

1.3.6 PDO::rollBack

PDO::rollBack — 回滾一個(gè)事務(wù)

  • 說(shuō)明

PDO::rollBack():bool

回滾由 PDO::beginTransaction() 發(fā)起的當(dāng)前事務(wù)。如果沒(méi)有事務(wù)激活,將拋出一個(gè) PDOException 異常。
如果數(shù)據(jù)庫(kù)被設(shè)置成自動(dòng)提交模式,此函數(shù)(方法)在回滾事務(wù)之后將恢復(fù)自動(dòng)提交模式。

  • 返回值
    成功時(shí)返回 true, 或者在失敗時(shí)返回 false。

  • 示例

<?php/* 開(kāi)始一個(gè)事務(wù),關(guān)閉自動(dòng)提交 */$dbh->beginTransaction();/* 更改數(shù)據(jù)庫(kù)架構(gòu)和數(shù)據(jù)  */$sth = $dbh->exec("DROP TABLE fruit");$sth = $dbh->exec("UPDATE dessert
    SET name = 'hamburger'");/*  識(shí)別錯(cuò)誤且回滾更改  */$dbh->rollBack();/*  此時(shí)數(shù)據(jù)庫(kù)連接恢復(fù)到自動(dòng)提交模式  */?>
1.3.7 內(nèi)部函數(shù)說(shuō)明
PDO::beginTransaction — 啟動(dòng)一個(gè)事務(wù)
PDO::commit — 提交一個(gè)事務(wù)
PDO::__construct — 創(chuàng)建一個(gè)表示數(shù)據(jù)庫(kù)連接的 PDO 實(shí)例
PDO::errorCode — 獲取跟數(shù)據(jù)庫(kù)句柄上一次操作相關(guān)的 SQLSTATE
PDO::errorInfo — Fetch extended error information associated with the last operation on the database handle
PDO::exec — 執(zhí)行一條 SQL 語(yǔ)句,并返回受影響的行數(shù)
PDO::getAttribute — 取回一個(gè)數(shù)據(jù)庫(kù)連接的屬性
PDO::getAvailableDrivers — 返回一個(gè)可用驅(qū)動(dòng)的數(shù)組
PDO::inTransaction — 檢查是否在一個(gè)事務(wù)內(nèi)
PDO::lastInsertId — 返回最后插入行的ID或序列值
PDO::prepare — 準(zhǔn)備要執(zhí)行的語(yǔ)句,并返回語(yǔ)句對(duì)象
PDO::query — 執(zhí)行 SQL 語(yǔ)句,以 PDOStatement 對(duì)象形式返回結(jié)果集
PDO::quote — 為 SQL 查詢里的字符串添加引號(hào)
PDO::rollBack — 回滾一個(gè)事務(wù)
PDO::setAttribute — 設(shè)置屬性

1.4 PDOStatement類(lèi)

1.4.1 PDOStatement::bindParam

PDOStatement::bindParam — 綁定一個(gè)參數(shù)到指定的變量名

  • 說(shuō)明

PDOStatement::bindParam ( mixed $parameter , mixed &$variable , int $data_type = PDO::PARAM_STR , int $length = ? , mixed $driver_options = ? ):bool

綁定一個(gè)PHP變量到用作預(yù)處理的SQL語(yǔ)句中的對(duì)應(yīng)命名占位符或問(wèn)號(hào)占位符。 不同于 PDOStatement::bindValue() ,此變量作為引用被綁定,并只在 PDOStatement::execute() 被調(diào)用的時(shí)候才取其值。

  • 返回值
    成功時(shí)返回 true, 或者在失敗時(shí)返回 false。

  • 參數(shù)

    • parameter
      參數(shù)標(biāo)識(shí)符。對(duì)于使用命名占位符的預(yù)處理語(yǔ)句,應(yīng)是類(lèi)似 :name 形式的參數(shù)名。對(duì)于使用問(wèn)號(hào)占位符的預(yù)處理語(yǔ)句,應(yīng)是以1開(kāi)始索引的參數(shù)位置。

    • variable
      綁定到 SQL 語(yǔ)句參數(shù)的 PHP 變量名。

    • data_type
      使用 PDO::PARAM_* 常量明確地指定參數(shù)的類(lèi)型。要從一個(gè)存儲(chǔ)過(guò)程中返回一個(gè) INOUT 參數(shù),需要為 data_type 參數(shù)使用按位或操作符去設(shè)置 PDO::PARAM_INPUT_OUTPUT 位。

    • length
      數(shù)據(jù)類(lèi)型的長(zhǎng)度。為表明參數(shù)是一個(gè)存儲(chǔ)過(guò)程的 OUT 參數(shù),必須明確地設(shè)置此長(zhǎng)度。

    • driver_options

  • 示例

<?php/* 通過(guò)綁定的 PHP 變量執(zhí)行一條預(yù)處理語(yǔ)句  */$calories = 150;$colour = 'red';$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');$sth->bindParam(':calories', $calories, PDO::PARAM_INT);$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);$sth->execute();?>
1.4.2 PDOStatement::execute

PDOStatement::bindParam — 綁定一個(gè)參數(shù)到指定的變量名

  • 說(shuō)明

PDOStatement::execute ( array $input_parameters = ? ) : bool

執(zhí)行預(yù)處理過(guò)的語(yǔ)句。如果預(yù)處理過(guò)的語(yǔ)句含有參數(shù)標(biāo)記,必須選擇下面其中一種做法:

1)調(diào)用 PDOStatement::bindParam() 綁定 PHP 變量到參數(shù)標(biāo)記:如果有的話,通過(guò)關(guān)聯(lián)參數(shù)標(biāo)記綁定的變量來(lái)傳遞輸入值和取得輸出值
2)或傳遞一個(gè)只作為輸入?yún)?shù)值的數(shù)組

  • 返回值
    成功時(shí)返回 true, 或者在失敗時(shí)返回 false。

  • 參數(shù)

    • input_parameters

  • 示例

<?php/* 通過(guò)傳遞一個(gè)含有插入值的數(shù)組執(zhí)行一條預(yù)處理語(yǔ)句 */$calories = 150;$colour = 'red';$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');$sth->execute(array(':calories' => $calories, ':colour' => $colour));?>
1.4.3 PDOStatement::fetch

PDOStatement::fetch — 從結(jié)果集中獲取下一行

  • 說(shuō)明

PDOStatement::fetch ( int $fetch_style = ? , int $cursor_orientation = PDO::FETCH_ORI_NEXT , int $cursor_offset = 0 ):mixed

從一個(gè) PDOStatement 對(duì)象相關(guān)的結(jié)果集中獲取下一行。fetch_style 參數(shù)決定 POD 如何返回行。

  • 返回值
    此函數(shù)(方法)成功時(shí)返回的值依賴于提取類(lèi)型。在所有情況下,失敗都返回 false 。

  • 參數(shù)

  • fetch_style
    控制下一行如何返回給調(diào)用者。此值必須是 PDO::FETCH_* 系列常量中的一個(gè),缺省為 PDO::ATTR_DEFAULT_FETCH_MODE 的值 (默認(rèn)為 PDO::FETCH_BOTH )。

PDO::FETCH_ASSOC:返回一個(gè)索引為結(jié)果集列名的數(shù)組
PDO::FETCH_BOTH(默認(rèn)):返回一個(gè)索引為結(jié)果集列名和以0開(kāi)始的列號(hào)的數(shù)組
PDO::FETCH_BOUND:返回 true ,并分配結(jié)果集中的列值給 PDOStatement::bindColumn() 方法綁定的 PHP 變量。
PDO::FETCH_CLASS:返回一個(gè)請(qǐng)求類(lèi)的新實(shí)例,映射結(jié)果集中的列名到類(lèi)中對(duì)應(yīng)的屬性名。如果 fetch_style 包含 PDO::FETCH_CLASSTYPE(例如:PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE),則類(lèi)名由第一列的值決定
PDO::FETCH_INTO:更新一個(gè)被請(qǐng)求類(lèi)已存在的實(shí)例,映射結(jié)果集中的列到類(lèi)中命名的屬性
PDO::FETCH_LAZY:結(jié)合使用 PDO::FETCH_BOTH 和 PDO::FETCH_OBJ,創(chuàng)建供用來(lái)訪問(wèn)的對(duì)象變量名
PDO::FETCH_NUM:返回一個(gè)索引為以0開(kāi)始的結(jié)果集列號(hào)的數(shù)組
PDO::FETCH_OBJ:返回一個(gè)屬性名對(duì)應(yīng)結(jié)果集列名的匿名對(duì)象
  • cursor_orientation
    對(duì)于 一個(gè) PDOStatement 對(duì)象表示的可滾動(dòng)游標(biāo),該值決定了哪一行將被返回給調(diào)用者。此值必須是PDO::FETCH_ORI_* 系列常量中的一個(gè),默認(rèn)為 PDO::FETCH_ORI_NEXT。

  • offset
    對(duì)于一個(gè) cursor_orientation 參數(shù)設(shè)置為 PDO::FETCH_ORI_ABS 的PDOStatement 對(duì)象代表的可滾動(dòng)游標(biāo),此值指定結(jié)果集中想要獲取行的絕對(duì)行號(hào)。

  • 示例

<?php$sth = $dbh->prepare("SELECT name, colour FROM fruit");$sth->execute();/* 運(yùn)用 PDOStatement::fetch 風(fēng)格 */print("PDO::FETCH_ASSOC: ");print("Return next row as an array indexed by column name\n");$result = $sth->fetch(PDO::FETCH_ASSOC);print_r($result);print("\n");?>
1.4.4 PDOStatement::execute

PDOStatement::fetchAll — 返回一個(gè)包含結(jié)果集中所有行的數(shù)組

  • 說(shuō)明

PDOStatement::fetchAll ( int $fetch_style = ? , mixed $fetch_argument = ? , array $ctor_args = array() ):array
  • 返回值
    PDOStatement::fetchAll() 返回一個(gè)包含結(jié)果集中所有剩余行的數(shù)組。此數(shù)組的每一行要么是一個(gè)列值的數(shù)組,要么是屬性對(duì)應(yīng)每個(gè)列名的一個(gè)對(duì)象。
    注:使用此方法獲取大結(jié)果集將導(dǎo)致系統(tǒng)負(fù)擔(dān)加重且可能占用大量網(wǎng)絡(luò)資源。與其取回所有數(shù)據(jù)后用PHP來(lái)操作,倒不如考慮使用數(shù)據(jù)庫(kù)服務(wù)來(lái)處理結(jié)果集。例如,在取回?cái)?shù)據(jù)并通過(guò)PHP處理前,在 SQL 中使用 WHERE 和 ORDER BY 子句來(lái)限定結(jié)果。

  • 參數(shù)

    • fetch_style
      控制返回?cái)?shù)組的內(nèi)容如同 PDOStatement::fetch()一樣。默認(rèn)為 PDO::ATTR_DEFAULT_FETCH_MODE 的值( 其缺省值為 PDO::FETCH_BOTH )想要返回一個(gè)包含結(jié)果集中單獨(dú)一列所有值的數(shù)組,需要指定 PDO::FETCH_COLUMN 。通過(guò)指定 column-index 參數(shù)獲取想要的列。

    • fetch_argument
      根據(jù) fetch_style 參數(shù)的值,此參數(shù)有不同的意義:
      PDO::FETCH_COLUMN:返回指定以0開(kāi)始索引的列。
      PDO::FETCH_CLASS:返回指定類(lèi)的實(shí)例,映射每行的列到類(lèi)中對(duì)應(yīng)的屬性名。
      PDO::FETCH_FUNC:將每行的列作為參數(shù)傳遞給指定的函數(shù),并返回調(diào)用函數(shù)后的結(jié)果。

    • ctor_args
      當(dāng) fetch_style 參數(shù)為 PDO::FETCH_CLASS 時(shí),自定義類(lèi)的構(gòu)造函數(shù)的參數(shù)。

  • 示例

<?php$sth = $dbh->prepare("SELECT name, colour FROM fruit");$sth->execute();/* 獲取結(jié)果集中所有剩余的行 */print("Fetch all of the remaining rows in the result set:\n");$result = $sth->fetchAll();print_r($result);?>
1.4.5 PDOStatement::rowCount

PDOStatement::rowCount — 返回受上一個(gè) SQL 語(yǔ)句影響的行數(shù)

  • 說(shuō)明

PDOStatement::rowCount():int

PDOStatement::rowCount() 返回上一個(gè)由對(duì)應(yīng)的 PDOStatement 對(duì)象執(zhí)行DELETE、 INSERT、或 UPDATE 語(yǔ)句受影響的行數(shù)。
       如果上一條由相關(guān) PDOStatement 執(zhí)行的 SQL 語(yǔ)句是一條 SELECT 語(yǔ)句,有些數(shù)據(jù)可能返回由此語(yǔ)句返回的行數(shù)。但這種方式不能保證對(duì)所有數(shù)據(jù)有效,且對(duì)于可移植的應(yīng)用不應(yīng)依賴于此方式。

  • 返回值
    返回行數(shù)。

  • 示例

<?php/*  從 FRUIT 數(shù)據(jù)表中刪除所有行 */$del = $dbh->prepare('DELETE FROM fruit');$del->execute();/*  返回被刪除的行數(shù) */print("Return number of rows that were deleted:\n");$count = $del->rowCount();print("Deleted $count rows.\n");?>
1.4.6 內(nèi)部函數(shù)說(shuō)明
PDOStatement::bindColumn — 綁定一列到一個(gè) PHP 變量
PDOStatement::bindParam — 綁定一個(gè)參數(shù)到指定的變量名
PDOStatement::bindValue — 把一個(gè)值綁定到一個(gè)參數(shù)
PDOStatement::closeCursor — 關(guān)閉游標(biāo),使語(yǔ)句能再次被執(zhí)行。
PDOStatement::columnCount — 返回結(jié)果集中的列數(shù)
PDOStatement::debugDumpParams — 打印一條 SQL 預(yù)處理命令
PDOStatement::errorCode — 獲取跟上一次語(yǔ)句句柄操作相關(guān)的 SQLSTATE
PDOStatement::errorInfo — 獲取跟上一次語(yǔ)句句柄操作相關(guān)的擴(kuò)展錯(cuò)誤信息
PDOStatement::execute — 執(zhí)行一條預(yù)處理語(yǔ)句
PDOStatement::fetch — 從結(jié)果集中獲取下一行
PDOStatement::fetchAll — 返回一個(gè)包含結(jié)果集中所有行的數(shù)組
PDOStatement::fetchColumn — 從結(jié)果集中的下一行返回單獨(dú)的一列。
PDOStatement::fetchObject — 獲取下一行并作為一個(gè)對(duì)象返回。
PDOStatement::getAttribute — 檢索一個(gè)語(yǔ)句屬性
PDOStatement::getColumnMeta — 返回結(jié)果集中一列的元數(shù)據(jù)
PDOStatement::nextRowset — 在一個(gè)多行集語(yǔ)句句柄中推進(jìn)到下一個(gè)行集
PDOStatement::rowCount — 返回受上一個(gè) SQL 語(yǔ)句影響的行數(shù)
PDOStatement::setAttribute — 設(shè)置一個(gè)語(yǔ)句屬性
PDOStatement::setFetchMode — 為語(yǔ)句設(shè)置默認(rèn)的獲取模式。

1.5 用法及小結(jié)

以上PDO類(lèi)及PDOStatement類(lèi)的說(shuō)明摘錄自php開(kāi)發(fā)手冊(cè),詳細(xì)描述只摘錄了常用的幾個(gè)內(nèi)部函數(shù)。實(shí)話實(shí)說(shuō)對(duì)于一個(gè)程序員最好的提升技術(shù)的方法之一就是看文檔,通過(guò)查閱文檔可以解決我們?cè)陂_(kāi)發(fā)中遇到的許多問(wèn)題,而且通過(guò)文檔我們可以知道很多api使用的細(xì)節(jié)和注意點(diǎn),幫助我們規(guī)避很多錯(cuò)誤??偠灾龅絾?wèn)題看文檔,多百度,多看博客,多總結(jié),這才是長(zhǎng)久的學(xué)習(xí)之道。
      多說(shuō)不做也是不行的,練習(xí)才是技術(shù)提升的必由之路,練習(xí)實(shí)踐才可以在其中發(fā)現(xiàn)問(wèn)題,提升自己,下面代碼是我對(duì)PDO的一些常見(jiàn)用法的整理:

try {	
    $db=new PDO("mysql:host=localhost;dbname=pxscj","user","123456"); }catch (PDOException $e) {       
    echo "數(shù)據(jù)庫(kù)連接失?。?quot;.$e->getMessage(); }$db->exec("set names utf-8");  //插入                             $query="insert into kcb values('606','PHP程序設(shè)計(jì)',6,48,3)";   if($affCount=$db->exec($query)) {                           
    echo "插入成功,受影響條數(shù)為:".$affCount."<br><br>";                }//查詢$query="select * from kcb";                                 foreach($db->query($query) as $row) {        
    echo "課程號(hào):".$row[0]."<br>";   
    echo "課程名:".$row[1]."<br>";  
    echo "開(kāi)課日期:".$row[2]."<br>"; 
    echo "學(xué)時(shí):".$row[3]."<br><br>";}//事務(wù)處理try {   
    $db->exec("set names utf-8");                           
    $db->beginTransaction();                                 
    $affrows=$db->exec("insert into kcb values('506','UML系統(tǒng)分析',5,48,3)");    
    if(!$affrows)
        throw new PDOException("插入失敗1");
    $affrows=$db->exec("insert into kcb values('606','PHP程序設(shè)計(jì)',6,32,2)");  
    if(!$affrows)
        throw new PDOException("插入失敗2");
    echo "插入成功!"; 
    $db->commit();                                         }catch (PDOException $e) {                                   
    echo $e->getMessage(); 
    $db->rollBack();   //回滾(要么成功要么失敗)}//prepare 可以防sql注入$in_sql="insert into userinfo(username,password,sex,age,email) values(?,?,?,?,?)"; $in_result=$db->prepare($in_sql); $userid="php3"; $pwd1="111111"; $sex=0; $age=36; $email="php3@qq.com";$in_result->bindParam(1, $userid); $in_result->bindParam(2, $pwd1);         $in_result->bindParam(3, $sex);       $in_result->bindParam(4, $age);       $in_result->bindParam(5, $email);$in_result->execute();    if($in_result->rowCount()==0)       
    echo "插入記錄失敗!";else
    echo "插入記錄成功!";//更新 改密碼$oldpwd=$_POST['oldpwd'];				                           //原密碼$newpwd=$_POST['newpwd'];				                           //新密碼$s_sql="select * from userinfo where username='$username'";                   //SQL語(yǔ)句$s_result=$db->query($s_sql);                                                list($username,$password,$sex,$age,$email)=$s_result->fetch(PDO::FETCH_NUM);if($password!=$oldpwd)					                   //判斷原密碼是否正確
    echo "原密碼錯(cuò)誤!";else {
    $checkpwd=preg_match('/^\w{6,20}$/',$newpwd);if(!$checkpwd)
    echo "新密碼格式不滿足要求!";else {
    $update_sql="update userinfo set password='$newpwd' where username='$username'";  
    $affected=$db->exec($update_sql); 
    if($affected)
        echo"密碼修改成功!";
    else
        echo "密碼修改失敗!";
    }}//刪除 注銷(xiāo)session_start();$username=@$_SESSION['userid'];$delete_sql="delete from userinfo where username='$username'";    //注銷(xiāo)自己的SQL語(yǔ)句$affected=$db->exec($delete_sql);                                if($affected)             
    echo "注銷(xiāo)用戶成功!";else
    echo "注銷(xiāo)用戶失敗!";

1.6 PDO與JPA閑談

軟件開(kāi)發(fā)框架總是有很多互通的地方,因?yàn)闊o(wú)論任何開(kāi)發(fā)語(yǔ)言,java或者php底層實(shí)現(xiàn)都離不開(kāi)數(shù)據(jù)結(jié)構(gòu),算法,還有軟件設(shè)計(jì)模式,而這些都是互通的,而好的軟件框架離不開(kāi)設(shè)計(jì)模式運(yùn)用.
自從學(xué)習(xí)php接觸了解到PDO對(duì)象擴(kuò)展時(shí)我便聯(lián)想到我曾使用的springboot JPA持久層框架,于是我查了些資料,以下便是我的個(gè)人理解:
       首先先解釋一下PDO和JPA的概念

  • PDO

PHP 數(shù)據(jù)對(duì)象(PHP Data Objects) 擴(kuò)展為PHP訪問(wèn)數(shù)據(jù)庫(kù)定義了一個(gè)輕量級(jí)的一致接口。
PDO 提供了一個(gè) 數(shù)據(jù)訪問(wèn) 抽象層,這意味著,不管使用哪種數(shù)據(jù)庫(kù),都可以用相同的函數(shù)(方法)來(lái)查詢和獲取數(shù)據(jù)。PDO 不提供 數(shù)據(jù)庫(kù) 抽象層;它不會(huì)重寫(xiě) SQL,也不會(huì)模擬缺失的特性。如果需要的話,應(yīng)該使用一個(gè)成熟的抽象層。

  • PDO架構(gòu)概念圖
    php中PDO對(duì)象如何安裝配置與使用

  • JPA

JPA是Java Persistence API的簡(jiǎn)稱,中文名Java持久層API,是JDK 5.0注解或XML描述對(duì)象-關(guān)系表的映射關(guān)系,并將運(yùn)行期的實(shí)體對(duì)象持久化到數(shù)據(jù)庫(kù)中。
JPA僅僅是一種規(guī)范,也就是說(shuō)JPA僅僅定義了一些接口,而接口是需要實(shí)現(xiàn)才能工作的。所以底層需要某種實(shí)現(xiàn),而Hibernate就是實(shí)現(xiàn)了JPA接口的ORM框架。

  • JPA 概念關(guān)系圖

php中PDO對(duì)象如何安裝配置與使用

從上述概念和架構(gòu)圖可以看出PDO和JPA還是有一定區(qū)別的。首先PHP的PDO只是一個(gè)抽象的數(shù)據(jù)訪問(wèn)接口層,它對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)還要依賴相應(yīng)的數(shù)據(jù)庫(kù)驅(qū)動(dòng),而且需要自行編寫(xiě)操作數(shù)據(jù)的SQL語(yǔ)句。
      而java的JPA則是一個(gè)持久層規(guī)范,也就是說(shuō)JPA僅僅定義了一些接口,這些接口是關(guān)于類(lèi)和數(shù)據(jù)庫(kù)表的映射的,也就是說(shuō),JPA這個(gè)規(guī)范在數(shù)據(jù)訪問(wèn)接口層之上,而真正實(shí)現(xiàn)這個(gè)規(guī)范和底層數(shù)據(jù)訪問(wèn)接口是在如Hibernate的這些數(shù)據(jù)持久層框架內(nèi).
      以Hibernate這個(gè)持久層框架為例,它實(shí)現(xiàn)了對(duì)象和數(shù)據(jù)庫(kù)表的映射關(guān)系,僅需要操作相應(yīng)的訪問(wèn)DAO層接口即可實(shí)現(xiàn)數(shù)據(jù)庫(kù)的查詢并轉(zhuǎn)換為java對(duì)象內(nèi)部屬性數(shù)據(jù)。而Hibernate底層對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)還得依賴JDBC接口。
      由此可見(jiàn)PDO和JPA規(guī)范完全處于兩個(gè)不同層次,JPA是數(shù)據(jù)訪問(wèn)方法底層的高層次抽象,而PDO僅相當(dāng)于java的JDBC接口層。PDO的抽象層次相對(duì)較低,這也符合PHP的輕量級(jí)web開(kāi)發(fā)語(yǔ)言
的特點(diǎn),這也是它的一個(gè)優(yōu)點(diǎn),可以方便清晰地實(shí)現(xiàn)一些復(fù)雜的數(shù)據(jù)庫(kù)訪問(wèn)操作,但不利于復(fù)雜的高抽象度的大型項(xiàng)目的開(kāi)發(fā).
      以上內(nèi)容為個(gè)人對(duì)PHP PDO對(duì)象和java JPA規(guī)范的一些理解和比較,水平有限,可能會(huì)有不準(zhǔn)確的地方。

1.7 實(shí)驗(yàn)問(wèn)題與總結(jié)

1.7.1 mysql連接

php使用mysql原生密碼連接如

$conn=mysqli_connect('localhost','user','123456')or die('連接失敗');

會(huì)出現(xiàn)錯(cuò)誤:The server requested authentication method unknown to the client.
原因:
由于本地使用mysql版本在8.0以上,而mysql 8升級(jí)了密碼的驗(yàn)證方式 caching_sha2_password,所以原生連接會(huì)失敗,解決辦法使用sql修改用戶登錄驗(yàn)證方式:

use mysql;ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密碼';
1.7.2 sql注入總結(jié)

php使用mysqli或pdo的query方法查詢時(shí),如未對(duì)用戶表單輸入數(shù)據(jù)進(jìn)行處理可能會(huì)存在SQL注入隱患,如

$username=$_POST['username'];$password=$_POST['password']; //magic_quotes_gpc設(shè)為off的情況下//mysql$conn = mysqli_connect("localhost", "user" ,"123456") or die('連接失敗'); //mysql_connect()鏈接MySQL服務(wù)器mysqli_select_db($conn,'PXSCJ') or die('選擇數(shù)據(jù)庫(kù)失敗'); //mysql_select_db()選擇數(shù)據(jù)庫(kù)mysqli_query($conn,"SET NAMES utf-8");//設(shè)置字符集為utf-8$str="select * from userinfo where username='$username' and password='$password'";$result=mysqli_query($conn,$str); //PDO//連接數(shù)據(jù)庫(kù),新建PDO對(duì)象$pdo=new PDO("mysql:host=localhost;dbname=pxscj","user","123456");$str="select * from userinfo where username='$username' and password='$password'";$result=$pdo->query($str);

當(dāng)用戶輸入username值為user,password值為123 ' or 1=1,即查詢sql被轉(zhuǎn)義為:

select * from userinfo where username='user' and password='123 ' or ' 1=1'

則用戶將跳過(guò)密碼的查詢驗(yàn)證得到所有userinfo的數(shù)據(jù),并且還存在其他SQL語(yǔ)句越權(quán)執(zhí)行的風(fēng)險(xiǎn)
處理風(fēng)險(xiǎn)的方法有以下幾種:

  • addslashes()函數(shù)轉(zhuǎn)義

$password=addslashes($password);

addslashes() 函數(shù)返回在預(yù)定義字符之前添加反斜杠的字符串。預(yù)定義字符是:
單引號(hào)(')
雙引號(hào)(")
反斜杠(\)
NULL

  • 使用PDO對(duì)象的prepare()方法

$sql="select * from userinfo where username='$username' and password='$password'";//注意不是中文狀態(tài)下的問(wèn)號(hào)? $result=$pdo->prepare($sql); //按照?的順序綁定參數(shù)值 $result->bindParam(1,$username); $result->bindParam(2,$password); $result->execute();

關(guān)于“php中PDO對(duì)象如何安裝配置與使用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI