'《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7'

數據庫 PHP 腳本語言 SQL 兄弟連IT教育 2019-08-26
"

"

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

18.6 PDO對預處理語句的支持

在生成網頁時,許多PHP腳本通常都會執行除參數外其他部分完全相同的查詢語句。針對這種重複執行一個查詢,但每次迭代使用不同參數的情況,PDO提供了一種名為預處理語句(Prepared Statement)的機制,如圖18-6所示。它可以將整個SQL命令向數據庫服務器發送一次,以後如果參數發生變化,數據庫服務器只需對命令的結構做一次分析就夠了,即編譯一次,可以多次執行。它會在服務器上緩存查詢的語句和執行過程,只在服務器和客戶端之間傳輸有變化的列值,以此消除額外的開銷。這不僅大大減少了需要傳輸的數據量,還提高了命令的處理效率,可以有效防止SQL注入,在執行單個查詢時快於直接使用query()或exec()方法,而且安全。

"

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

18.6 PDO對預處理語句的支持

在生成網頁時,許多PHP腳本通常都會執行除參數外其他部分完全相同的查詢語句。針對這種重複執行一個查詢,但每次迭代使用不同參數的情況,PDO提供了一種名為預處理語句(Prepared Statement)的機制,如圖18-6所示。它可以將整個SQL命令向數據庫服務器發送一次,以後如果參數發生變化,數據庫服務器只需對命令的結構做一次分析就夠了,即編譯一次,可以多次執行。它會在服務器上緩存查詢的語句和執行過程,只在服務器和客戶端之間傳輸有變化的列值,以此消除額外的開銷。這不僅大大減少了需要傳輸的數據量,還提高了命令的處理效率,可以有效防止SQL注入,在執行單個查詢時快於直接使用query()或exec()方法,而且安全。

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

圖18-6 預處理語句的機制

18.6.1 瞭解PDOStatement對象

PDO對預處理語句的支持需要使用PDOStatement類對象,但該類的對象並不是通過NEW關鍵字實例化出來的,而是通過執行PDO對象中的prepare()方法,在數據庫服務器中準備好一個預處理的SQL語句後直接返回的。如果通過之前執行PDO對象中的query()方法返回的PDOStatement類對象,代表的只是一個結果集對象;那麼通過執行PDO對象中的prepare()方法產生的PDOStatement類對象,則為一個查詢對象,能定義和執行參數化的SQL命令。PDOStatement類中的全部成員方法如表18-5所示。

表18-5 PDOStatement類中的全部成員方法(共18個)

"

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

18.6 PDO對預處理語句的支持

在生成網頁時,許多PHP腳本通常都會執行除參數外其他部分完全相同的查詢語句。針對這種重複執行一個查詢,但每次迭代使用不同參數的情況,PDO提供了一種名為預處理語句(Prepared Statement)的機制,如圖18-6所示。它可以將整個SQL命令向數據庫服務器發送一次,以後如果參數發生變化,數據庫服務器只需對命令的結構做一次分析就夠了,即編譯一次,可以多次執行。它會在服務器上緩存查詢的語句和執行過程,只在服務器和客戶端之間傳輸有變化的列值,以此消除額外的開銷。這不僅大大減少了需要傳輸的數據量,還提高了命令的處理效率,可以有效防止SQL注入,在執行單個查詢時快於直接使用query()或exec()方法,而且安全。

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

圖18-6 預處理語句的機制

18.6.1 瞭解PDOStatement對象

PDO對預處理語句的支持需要使用PDOStatement類對象,但該類的對象並不是通過NEW關鍵字實例化出來的,而是通過執行PDO對象中的prepare()方法,在數據庫服務器中準備好一個預處理的SQL語句後直接返回的。如果通過之前執行PDO對象中的query()方法返回的PDOStatement類對象,代表的只是一個結果集對象;那麼通過執行PDO對象中的prepare()方法產生的PDOStatement類對象,則為一個查詢對象,能定義和執行參數化的SQL命令。PDOStatement類中的全部成員方法如表18-5所示。

表18-5 PDOStatement類中的全部成員方法(共18個)

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

18.6.2 準備語句

重複執行一個SQL查詢,每次迭代使用不同的參數,這種情況使用預處理語句運行效率最高。使用預處理語句,首先需要在數據庫服務器中準備好“一條SQL語句”,但並不需要馬上執行。PDO支持使用“佔位符”語法,將變量綁定到這條預處理的SQL語句中。另外,PDO幾乎為支持的所有數據庫提供了命名佔位符模擬,甚至為生來就不支持該概念的數據庫模擬預處理語句和綁定參數。這是PHP向前邁進的積極一步,因為這樣可以使開發人員能夠用PHP編寫“企業級”的數據庫應用程序,而不必特別關注數據庫平臺的能力。

對於一條準備好的SQL語句,如果在每次執行時都要改變一些列值,則必須使用“佔位符號”而不是具體的列值;或者只要有需要使用變量作為值的地方,就先使用佔位符號替代。準備一條沒有傳遞值的SQL語句,在數據庫服務器的緩存區等待處理,然後再單獨賦給佔位符號具體的值,再通知這條準備好的預處理語句執行。在PDO中有兩種使用佔位符的語法:“命名參數”和“問號參數”,使用哪種語法可以看個人的喜好。

Ø 使用命名參數作為佔位符的INSERT查詢如下所示:

$dbh->prepare("INSERT INTO contactInfo (name, address, phone) VALUES (:name, :address, :phone)");

需要自定義一個字符串作為“命名參數”,每個命名參數需要以冒號(:)開始,參數的命名一定要有意義,最好和對應的字段名稱相同。

Ø 使用問號(?)參數作為佔位符的INSERT查詢如下所示:

$dbh->prepare("INSERT INTO contactInfo (name, address, phone) VALUES (?, ?, ?)");

問號參數一定要和字段的位置順序對應。

不管使用哪種參數作為佔位符構成的查詢,語句中有沒有用到佔位符,都需要使用PDO對象中的prepare()方法去準備這個將要用於迭代的查詢,並返回PDOStatement類對象。

18.6.3 綁定參數

當SQL語句通過PDO對象中的prepare()方法,在數據庫服務器端準備好之後,如果使用了佔位符,就需要在每次執行時替換輸入的參數。可以通過PDOStatement對象中的bindParam()方法,把參數變量綁定到準備好的佔位符上(位置或名字要對應)。bindParam()方法的原型如下所示:

bindParam ( mixed parameter, mixed &variable [, int data_type [, int length [, mixed driver_options]]] )

第一個參數parameter是必選項。如果在準備好的查詢中,佔位符語法使用名字參數,那麼將名字參數字符串作為bindParam()方法的第一個參數提供。如果佔位符語法使用問號參數,那麼將準備好的查詢中列值佔位符的索引偏移量作為該方法的第一個參數提供。

第二個參數variable也是必選項,提供賦給第一個參數所指定佔位符的值。因為該參數是按引用傳遞的,所以只能提供變量作為參數,不能直接提供數值。

第三個參數data_type是可選項,顯式地為當前被綁定的參數設置數據類型。可以為以下值。

Ø PDO::PARAM_BOOL:代表boolean數據類型。

Ø PDO::PARAM_NULL:代表SQL中NULL類型。

Ø PDO::PARAM_INT:代表SQL中INTEGER數據類型。

Ø PDO::PARAM_STR:代表SQL中CHAR、VARCHAR和其他字符串數據類型。

Ø PDO::PARAM_LOB:代表SQL中大對象數據類型。

第四個參數length是可選項,用於指定數據類型的長度。

第五個參數driver_options是可選項,通過該參數提供數據庫驅動程序特定的選項。

將上一節中用兩種佔位符語法準備的SQL查詢,使用bindParam()方法分別綁定對應的參數。查詢中使用命名參數的綁定示例如下所示:

"

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

18.6 PDO對預處理語句的支持

在生成網頁時,許多PHP腳本通常都會執行除參數外其他部分完全相同的查詢語句。針對這種重複執行一個查詢,但每次迭代使用不同參數的情況,PDO提供了一種名為預處理語句(Prepared Statement)的機制,如圖18-6所示。它可以將整個SQL命令向數據庫服務器發送一次,以後如果參數發生變化,數據庫服務器只需對命令的結構做一次分析就夠了,即編譯一次,可以多次執行。它會在服務器上緩存查詢的語句和執行過程,只在服務器和客戶端之間傳輸有變化的列值,以此消除額外的開銷。這不僅大大減少了需要傳輸的數據量,還提高了命令的處理效率,可以有效防止SQL注入,在執行單個查詢時快於直接使用query()或exec()方法,而且安全。

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

圖18-6 預處理語句的機制

18.6.1 瞭解PDOStatement對象

PDO對預處理語句的支持需要使用PDOStatement類對象,但該類的對象並不是通過NEW關鍵字實例化出來的,而是通過執行PDO對象中的prepare()方法,在數據庫服務器中準備好一個預處理的SQL語句後直接返回的。如果通過之前執行PDO對象中的query()方法返回的PDOStatement類對象,代表的只是一個結果集對象;那麼通過執行PDO對象中的prepare()方法產生的PDOStatement類對象,則為一個查詢對象,能定義和執行參數化的SQL命令。PDOStatement類中的全部成員方法如表18-5所示。

表18-5 PDOStatement類中的全部成員方法(共18個)

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

18.6.2 準備語句

重複執行一個SQL查詢,每次迭代使用不同的參數,這種情況使用預處理語句運行效率最高。使用預處理語句,首先需要在數據庫服務器中準備好“一條SQL語句”,但並不需要馬上執行。PDO支持使用“佔位符”語法,將變量綁定到這條預處理的SQL語句中。另外,PDO幾乎為支持的所有數據庫提供了命名佔位符模擬,甚至為生來就不支持該概念的數據庫模擬預處理語句和綁定參數。這是PHP向前邁進的積極一步,因為這樣可以使開發人員能夠用PHP編寫“企業級”的數據庫應用程序,而不必特別關注數據庫平臺的能力。

對於一條準備好的SQL語句,如果在每次執行時都要改變一些列值,則必須使用“佔位符號”而不是具體的列值;或者只要有需要使用變量作為值的地方,就先使用佔位符號替代。準備一條沒有傳遞值的SQL語句,在數據庫服務器的緩存區等待處理,然後再單獨賦給佔位符號具體的值,再通知這條準備好的預處理語句執行。在PDO中有兩種使用佔位符的語法:“命名參數”和“問號參數”,使用哪種語法可以看個人的喜好。

Ø 使用命名參數作為佔位符的INSERT查詢如下所示:

$dbh->prepare("INSERT INTO contactInfo (name, address, phone) VALUES (:name, :address, :phone)");

需要自定義一個字符串作為“命名參數”,每個命名參數需要以冒號(:)開始,參數的命名一定要有意義,最好和對應的字段名稱相同。

Ø 使用問號(?)參數作為佔位符的INSERT查詢如下所示:

$dbh->prepare("INSERT INTO contactInfo (name, address, phone) VALUES (?, ?, ?)");

問號參數一定要和字段的位置順序對應。

不管使用哪種參數作為佔位符構成的查詢,語句中有沒有用到佔位符,都需要使用PDO對象中的prepare()方法去準備這個將要用於迭代的查詢,並返回PDOStatement類對象。

18.6.3 綁定參數

當SQL語句通過PDO對象中的prepare()方法,在數據庫服務器端準備好之後,如果使用了佔位符,就需要在每次執行時替換輸入的參數。可以通過PDOStatement對象中的bindParam()方法,把參數變量綁定到準備好的佔位符上(位置或名字要對應)。bindParam()方法的原型如下所示:

bindParam ( mixed parameter, mixed &variable [, int data_type [, int length [, mixed driver_options]]] )

第一個參數parameter是必選項。如果在準備好的查詢中,佔位符語法使用名字參數,那麼將名字參數字符串作為bindParam()方法的第一個參數提供。如果佔位符語法使用問號參數,那麼將準備好的查詢中列值佔位符的索引偏移量作為該方法的第一個參數提供。

第二個參數variable也是必選項,提供賦給第一個參數所指定佔位符的值。因為該參數是按引用傳遞的,所以只能提供變量作為參數,不能直接提供數值。

第三個參數data_type是可選項,顯式地為當前被綁定的參數設置數據類型。可以為以下值。

Ø PDO::PARAM_BOOL:代表boolean數據類型。

Ø PDO::PARAM_NULL:代表SQL中NULL類型。

Ø PDO::PARAM_INT:代表SQL中INTEGER數據類型。

Ø PDO::PARAM_STR:代表SQL中CHAR、VARCHAR和其他字符串數據類型。

Ø PDO::PARAM_LOB:代表SQL中大對象數據類型。

第四個參數length是可選項,用於指定數據類型的長度。

第五個參數driver_options是可選項,通過該參數提供數據庫驅動程序特定的選項。

將上一節中用兩種佔位符語法準備的SQL查詢,使用bindParam()方法分別綁定對應的參數。查詢中使用命名參數的綁定示例如下所示:

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

查詢中使用問號(?)參數的綁定示例如下所示,並在綁定時通過第三個參數顯式地指定數據類型。當然,使用名字參數一樣可以通過第三個參數指定類型並通過第四個參數指定長度。

"

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

18.6 PDO對預處理語句的支持

在生成網頁時,許多PHP腳本通常都會執行除參數外其他部分完全相同的查詢語句。針對這種重複執行一個查詢,但每次迭代使用不同參數的情況,PDO提供了一種名為預處理語句(Prepared Statement)的機制,如圖18-6所示。它可以將整個SQL命令向數據庫服務器發送一次,以後如果參數發生變化,數據庫服務器只需對命令的結構做一次分析就夠了,即編譯一次,可以多次執行。它會在服務器上緩存查詢的語句和執行過程,只在服務器和客戶端之間傳輸有變化的列值,以此消除額外的開銷。這不僅大大減少了需要傳輸的數據量,還提高了命令的處理效率,可以有效防止SQL注入,在執行單個查詢時快於直接使用query()或exec()方法,而且安全。

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

圖18-6 預處理語句的機制

18.6.1 瞭解PDOStatement對象

PDO對預處理語句的支持需要使用PDOStatement類對象,但該類的對象並不是通過NEW關鍵字實例化出來的,而是通過執行PDO對象中的prepare()方法,在數據庫服務器中準備好一個預處理的SQL語句後直接返回的。如果通過之前執行PDO對象中的query()方法返回的PDOStatement類對象,代表的只是一個結果集對象;那麼通過執行PDO對象中的prepare()方法產生的PDOStatement類對象,則為一個查詢對象,能定義和執行參數化的SQL命令。PDOStatement類中的全部成員方法如表18-5所示。

表18-5 PDOStatement類中的全部成員方法(共18個)

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

18.6.2 準備語句

重複執行一個SQL查詢,每次迭代使用不同的參數,這種情況使用預處理語句運行效率最高。使用預處理語句,首先需要在數據庫服務器中準備好“一條SQL語句”,但並不需要馬上執行。PDO支持使用“佔位符”語法,將變量綁定到這條預處理的SQL語句中。另外,PDO幾乎為支持的所有數據庫提供了命名佔位符模擬,甚至為生來就不支持該概念的數據庫模擬預處理語句和綁定參數。這是PHP向前邁進的積極一步,因為這樣可以使開發人員能夠用PHP編寫“企業級”的數據庫應用程序,而不必特別關注數據庫平臺的能力。

對於一條準備好的SQL語句,如果在每次執行時都要改變一些列值,則必須使用“佔位符號”而不是具體的列值;或者只要有需要使用變量作為值的地方,就先使用佔位符號替代。準備一條沒有傳遞值的SQL語句,在數據庫服務器的緩存區等待處理,然後再單獨賦給佔位符號具體的值,再通知這條準備好的預處理語句執行。在PDO中有兩種使用佔位符的語法:“命名參數”和“問號參數”,使用哪種語法可以看個人的喜好。

Ø 使用命名參數作為佔位符的INSERT查詢如下所示:

$dbh->prepare("INSERT INTO contactInfo (name, address, phone) VALUES (:name, :address, :phone)");

需要自定義一個字符串作為“命名參數”,每個命名參數需要以冒號(:)開始,參數的命名一定要有意義,最好和對應的字段名稱相同。

Ø 使用問號(?)參數作為佔位符的INSERT查詢如下所示:

$dbh->prepare("INSERT INTO contactInfo (name, address, phone) VALUES (?, ?, ?)");

問號參數一定要和字段的位置順序對應。

不管使用哪種參數作為佔位符構成的查詢,語句中有沒有用到佔位符,都需要使用PDO對象中的prepare()方法去準備這個將要用於迭代的查詢,並返回PDOStatement類對象。

18.6.3 綁定參數

當SQL語句通過PDO對象中的prepare()方法,在數據庫服務器端準備好之後,如果使用了佔位符,就需要在每次執行時替換輸入的參數。可以通過PDOStatement對象中的bindParam()方法,把參數變量綁定到準備好的佔位符上(位置或名字要對應)。bindParam()方法的原型如下所示:

bindParam ( mixed parameter, mixed &variable [, int data_type [, int length [, mixed driver_options]]] )

第一個參數parameter是必選項。如果在準備好的查詢中,佔位符語法使用名字參數,那麼將名字參數字符串作為bindParam()方法的第一個參數提供。如果佔位符語法使用問號參數,那麼將準備好的查詢中列值佔位符的索引偏移量作為該方法的第一個參數提供。

第二個參數variable也是必選項,提供賦給第一個參數所指定佔位符的值。因為該參數是按引用傳遞的,所以只能提供變量作為參數,不能直接提供數值。

第三個參數data_type是可選項,顯式地為當前被綁定的參數設置數據類型。可以為以下值。

Ø PDO::PARAM_BOOL:代表boolean數據類型。

Ø PDO::PARAM_NULL:代表SQL中NULL類型。

Ø PDO::PARAM_INT:代表SQL中INTEGER數據類型。

Ø PDO::PARAM_STR:代表SQL中CHAR、VARCHAR和其他字符串數據類型。

Ø PDO::PARAM_LOB:代表SQL中大對象數據類型。

第四個參數length是可選項,用於指定數據類型的長度。

第五個參數driver_options是可選項,通過該參數提供數據庫驅動程序特定的選項。

將上一節中用兩種佔位符語法準備的SQL查詢,使用bindParam()方法分別綁定對應的參數。查詢中使用命名參數的綁定示例如下所示:

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

查詢中使用問號(?)參數的綁定示例如下所示,並在綁定時通過第三個參數顯式地指定數據類型。當然,使用名字參數一樣可以通過第三個參數指定類型並通過第四個參數指定長度。

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

"

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

18.6 PDO對預處理語句的支持

在生成網頁時,許多PHP腳本通常都會執行除參數外其他部分完全相同的查詢語句。針對這種重複執行一個查詢,但每次迭代使用不同參數的情況,PDO提供了一種名為預處理語句(Prepared Statement)的機制,如圖18-6所示。它可以將整個SQL命令向數據庫服務器發送一次,以後如果參數發生變化,數據庫服務器只需對命令的結構做一次分析就夠了,即編譯一次,可以多次執行。它會在服務器上緩存查詢的語句和執行過程,只在服務器和客戶端之間傳輸有變化的列值,以此消除額外的開銷。這不僅大大減少了需要傳輸的數據量,還提高了命令的處理效率,可以有效防止SQL注入,在執行單個查詢時快於直接使用query()或exec()方法,而且安全。

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

圖18-6 預處理語句的機制

18.6.1 瞭解PDOStatement對象

PDO對預處理語句的支持需要使用PDOStatement類對象,但該類的對象並不是通過NEW關鍵字實例化出來的,而是通過執行PDO對象中的prepare()方法,在數據庫服務器中準備好一個預處理的SQL語句後直接返回的。如果通過之前執行PDO對象中的query()方法返回的PDOStatement類對象,代表的只是一個結果集對象;那麼通過執行PDO對象中的prepare()方法產生的PDOStatement類對象,則為一個查詢對象,能定義和執行參數化的SQL命令。PDOStatement類中的全部成員方法如表18-5所示。

表18-5 PDOStatement類中的全部成員方法(共18個)

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

18.6.2 準備語句

重複執行一個SQL查詢,每次迭代使用不同的參數,這種情況使用預處理語句運行效率最高。使用預處理語句,首先需要在數據庫服務器中準備好“一條SQL語句”,但並不需要馬上執行。PDO支持使用“佔位符”語法,將變量綁定到這條預處理的SQL語句中。另外,PDO幾乎為支持的所有數據庫提供了命名佔位符模擬,甚至為生來就不支持該概念的數據庫模擬預處理語句和綁定參數。這是PHP向前邁進的積極一步,因為這樣可以使開發人員能夠用PHP編寫“企業級”的數據庫應用程序,而不必特別關注數據庫平臺的能力。

對於一條準備好的SQL語句,如果在每次執行時都要改變一些列值,則必須使用“佔位符號”而不是具體的列值;或者只要有需要使用變量作為值的地方,就先使用佔位符號替代。準備一條沒有傳遞值的SQL語句,在數據庫服務器的緩存區等待處理,然後再單獨賦給佔位符號具體的值,再通知這條準備好的預處理語句執行。在PDO中有兩種使用佔位符的語法:“命名參數”和“問號參數”,使用哪種語法可以看個人的喜好。

Ø 使用命名參數作為佔位符的INSERT查詢如下所示:

$dbh->prepare("INSERT INTO contactInfo (name, address, phone) VALUES (:name, :address, :phone)");

需要自定義一個字符串作為“命名參數”,每個命名參數需要以冒號(:)開始,參數的命名一定要有意義,最好和對應的字段名稱相同。

Ø 使用問號(?)參數作為佔位符的INSERT查詢如下所示:

$dbh->prepare("INSERT INTO contactInfo (name, address, phone) VALUES (?, ?, ?)");

問號參數一定要和字段的位置順序對應。

不管使用哪種參數作為佔位符構成的查詢,語句中有沒有用到佔位符,都需要使用PDO對象中的prepare()方法去準備這個將要用於迭代的查詢,並返回PDOStatement類對象。

18.6.3 綁定參數

當SQL語句通過PDO對象中的prepare()方法,在數據庫服務器端準備好之後,如果使用了佔位符,就需要在每次執行時替換輸入的參數。可以通過PDOStatement對象中的bindParam()方法,把參數變量綁定到準備好的佔位符上(位置或名字要對應)。bindParam()方法的原型如下所示:

bindParam ( mixed parameter, mixed &variable [, int data_type [, int length [, mixed driver_options]]] )

第一個參數parameter是必選項。如果在準備好的查詢中,佔位符語法使用名字參數,那麼將名字參數字符串作為bindParam()方法的第一個參數提供。如果佔位符語法使用問號參數,那麼將準備好的查詢中列值佔位符的索引偏移量作為該方法的第一個參數提供。

第二個參數variable也是必選項,提供賦給第一個參數所指定佔位符的值。因為該參數是按引用傳遞的,所以只能提供變量作為參數,不能直接提供數值。

第三個參數data_type是可選項,顯式地為當前被綁定的參數設置數據類型。可以為以下值。

Ø PDO::PARAM_BOOL:代表boolean數據類型。

Ø PDO::PARAM_NULL:代表SQL中NULL類型。

Ø PDO::PARAM_INT:代表SQL中INTEGER數據類型。

Ø PDO::PARAM_STR:代表SQL中CHAR、VARCHAR和其他字符串數據類型。

Ø PDO::PARAM_LOB:代表SQL中大對象數據類型。

第四個參數length是可選項,用於指定數據類型的長度。

第五個參數driver_options是可選項,通過該參數提供數據庫驅動程序特定的選項。

將上一節中用兩種佔位符語法準備的SQL查詢,使用bindParam()方法分別綁定對應的參數。查詢中使用命名參數的綁定示例如下所示:

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

查詢中使用問號(?)參數的綁定示例如下所示,並在綁定時通過第三個參數顯式地指定數據類型。當然,使用名字參數一樣可以通過第三個參數指定類型並通過第四個參數指定長度。

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

"

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

18.6 PDO對預處理語句的支持

在生成網頁時,許多PHP腳本通常都會執行除參數外其他部分完全相同的查詢語句。針對這種重複執行一個查詢,但每次迭代使用不同參數的情況,PDO提供了一種名為預處理語句(Prepared Statement)的機制,如圖18-6所示。它可以將整個SQL命令向數據庫服務器發送一次,以後如果參數發生變化,數據庫服務器只需對命令的結構做一次分析就夠了,即編譯一次,可以多次執行。它會在服務器上緩存查詢的語句和執行過程,只在服務器和客戶端之間傳輸有變化的列值,以此消除額外的開銷。這不僅大大減少了需要傳輸的數據量,還提高了命令的處理效率,可以有效防止SQL注入,在執行單個查詢時快於直接使用query()或exec()方法,而且安全。

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

圖18-6 預處理語句的機制

18.6.1 瞭解PDOStatement對象

PDO對預處理語句的支持需要使用PDOStatement類對象,但該類的對象並不是通過NEW關鍵字實例化出來的,而是通過執行PDO對象中的prepare()方法,在數據庫服務器中準備好一個預處理的SQL語句後直接返回的。如果通過之前執行PDO對象中的query()方法返回的PDOStatement類對象,代表的只是一個結果集對象;那麼通過執行PDO對象中的prepare()方法產生的PDOStatement類對象,則為一個查詢對象,能定義和執行參數化的SQL命令。PDOStatement類中的全部成員方法如表18-5所示。

表18-5 PDOStatement類中的全部成員方法(共18個)

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

18.6.2 準備語句

重複執行一個SQL查詢,每次迭代使用不同的參數,這種情況使用預處理語句運行效率最高。使用預處理語句,首先需要在數據庫服務器中準備好“一條SQL語句”,但並不需要馬上執行。PDO支持使用“佔位符”語法,將變量綁定到這條預處理的SQL語句中。另外,PDO幾乎為支持的所有數據庫提供了命名佔位符模擬,甚至為生來就不支持該概念的數據庫模擬預處理語句和綁定參數。這是PHP向前邁進的積極一步,因為這樣可以使開發人員能夠用PHP編寫“企業級”的數據庫應用程序,而不必特別關注數據庫平臺的能力。

對於一條準備好的SQL語句,如果在每次執行時都要改變一些列值,則必須使用“佔位符號”而不是具體的列值;或者只要有需要使用變量作為值的地方,就先使用佔位符號替代。準備一條沒有傳遞值的SQL語句,在數據庫服務器的緩存區等待處理,然後再單獨賦給佔位符號具體的值,再通知這條準備好的預處理語句執行。在PDO中有兩種使用佔位符的語法:“命名參數”和“問號參數”,使用哪種語法可以看個人的喜好。

Ø 使用命名參數作為佔位符的INSERT查詢如下所示:

$dbh->prepare("INSERT INTO contactInfo (name, address, phone) VALUES (:name, :address, :phone)");

需要自定義一個字符串作為“命名參數”,每個命名參數需要以冒號(:)開始,參數的命名一定要有意義,最好和對應的字段名稱相同。

Ø 使用問號(?)參數作為佔位符的INSERT查詢如下所示:

$dbh->prepare("INSERT INTO contactInfo (name, address, phone) VALUES (?, ?, ?)");

問號參數一定要和字段的位置順序對應。

不管使用哪種參數作為佔位符構成的查詢,語句中有沒有用到佔位符,都需要使用PDO對象中的prepare()方法去準備這個將要用於迭代的查詢,並返回PDOStatement類對象。

18.6.3 綁定參數

當SQL語句通過PDO對象中的prepare()方法,在數據庫服務器端準備好之後,如果使用了佔位符,就需要在每次執行時替換輸入的參數。可以通過PDOStatement對象中的bindParam()方法,把參數變量綁定到準備好的佔位符上(位置或名字要對應)。bindParam()方法的原型如下所示:

bindParam ( mixed parameter, mixed &variable [, int data_type [, int length [, mixed driver_options]]] )

第一個參數parameter是必選項。如果在準備好的查詢中,佔位符語法使用名字參數,那麼將名字參數字符串作為bindParam()方法的第一個參數提供。如果佔位符語法使用問號參數,那麼將準備好的查詢中列值佔位符的索引偏移量作為該方法的第一個參數提供。

第二個參數variable也是必選項,提供賦給第一個參數所指定佔位符的值。因為該參數是按引用傳遞的,所以只能提供變量作為參數,不能直接提供數值。

第三個參數data_type是可選項,顯式地為當前被綁定的參數設置數據類型。可以為以下值。

Ø PDO::PARAM_BOOL:代表boolean數據類型。

Ø PDO::PARAM_NULL:代表SQL中NULL類型。

Ø PDO::PARAM_INT:代表SQL中INTEGER數據類型。

Ø PDO::PARAM_STR:代表SQL中CHAR、VARCHAR和其他字符串數據類型。

Ø PDO::PARAM_LOB:代表SQL中大對象數據類型。

第四個參數length是可選項,用於指定數據類型的長度。

第五個參數driver_options是可選項,通過該參數提供數據庫驅動程序特定的選項。

將上一節中用兩種佔位符語法準備的SQL查詢,使用bindParam()方法分別綁定對應的參數。查詢中使用命名參數的綁定示例如下所示:

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

查詢中使用問號(?)參數的綁定示例如下所示,並在綁定時通過第三個參數顯式地指定數據類型。當然,使用名字參數一樣可以通過第三個參數指定類型並通過第四個參數指定長度。

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

"

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

18.6 PDO對預處理語句的支持

在生成網頁時,許多PHP腳本通常都會執行除參數外其他部分完全相同的查詢語句。針對這種重複執行一個查詢,但每次迭代使用不同參數的情況,PDO提供了一種名為預處理語句(Prepared Statement)的機制,如圖18-6所示。它可以將整個SQL命令向數據庫服務器發送一次,以後如果參數發生變化,數據庫服務器只需對命令的結構做一次分析就夠了,即編譯一次,可以多次執行。它會在服務器上緩存查詢的語句和執行過程,只在服務器和客戶端之間傳輸有變化的列值,以此消除額外的開銷。這不僅大大減少了需要傳輸的數據量,還提高了命令的處理效率,可以有效防止SQL注入,在執行單個查詢時快於直接使用query()或exec()方法,而且安全。

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

圖18-6 預處理語句的機制

18.6.1 瞭解PDOStatement對象

PDO對預處理語句的支持需要使用PDOStatement類對象,但該類的對象並不是通過NEW關鍵字實例化出來的,而是通過執行PDO對象中的prepare()方法,在數據庫服務器中準備好一個預處理的SQL語句後直接返回的。如果通過之前執行PDO對象中的query()方法返回的PDOStatement類對象,代表的只是一個結果集對象;那麼通過執行PDO對象中的prepare()方法產生的PDOStatement類對象,則為一個查詢對象,能定義和執行參數化的SQL命令。PDOStatement類中的全部成員方法如表18-5所示。

表18-5 PDOStatement類中的全部成員方法(共18個)

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

18.6.2 準備語句

重複執行一個SQL查詢,每次迭代使用不同的參數,這種情況使用預處理語句運行效率最高。使用預處理語句,首先需要在數據庫服務器中準備好“一條SQL語句”,但並不需要馬上執行。PDO支持使用“佔位符”語法,將變量綁定到這條預處理的SQL語句中。另外,PDO幾乎為支持的所有數據庫提供了命名佔位符模擬,甚至為生來就不支持該概念的數據庫模擬預處理語句和綁定參數。這是PHP向前邁進的積極一步,因為這樣可以使開發人員能夠用PHP編寫“企業級”的數據庫應用程序,而不必特別關注數據庫平臺的能力。

對於一條準備好的SQL語句,如果在每次執行時都要改變一些列值,則必須使用“佔位符號”而不是具體的列值;或者只要有需要使用變量作為值的地方,就先使用佔位符號替代。準備一條沒有傳遞值的SQL語句,在數據庫服務器的緩存區等待處理,然後再單獨賦給佔位符號具體的值,再通知這條準備好的預處理語句執行。在PDO中有兩種使用佔位符的語法:“命名參數”和“問號參數”,使用哪種語法可以看個人的喜好。

Ø 使用命名參數作為佔位符的INSERT查詢如下所示:

$dbh->prepare("INSERT INTO contactInfo (name, address, phone) VALUES (:name, :address, :phone)");

需要自定義一個字符串作為“命名參數”,每個命名參數需要以冒號(:)開始,參數的命名一定要有意義,最好和對應的字段名稱相同。

Ø 使用問號(?)參數作為佔位符的INSERT查詢如下所示:

$dbh->prepare("INSERT INTO contactInfo (name, address, phone) VALUES (?, ?, ?)");

問號參數一定要和字段的位置順序對應。

不管使用哪種參數作為佔位符構成的查詢,語句中有沒有用到佔位符,都需要使用PDO對象中的prepare()方法去準備這個將要用於迭代的查詢,並返回PDOStatement類對象。

18.6.3 綁定參數

當SQL語句通過PDO對象中的prepare()方法,在數據庫服務器端準備好之後,如果使用了佔位符,就需要在每次執行時替換輸入的參數。可以通過PDOStatement對象中的bindParam()方法,把參數變量綁定到準備好的佔位符上(位置或名字要對應)。bindParam()方法的原型如下所示:

bindParam ( mixed parameter, mixed &variable [, int data_type [, int length [, mixed driver_options]]] )

第一個參數parameter是必選項。如果在準備好的查詢中,佔位符語法使用名字參數,那麼將名字參數字符串作為bindParam()方法的第一個參數提供。如果佔位符語法使用問號參數,那麼將準備好的查詢中列值佔位符的索引偏移量作為該方法的第一個參數提供。

第二個參數variable也是必選項,提供賦給第一個參數所指定佔位符的值。因為該參數是按引用傳遞的,所以只能提供變量作為參數,不能直接提供數值。

第三個參數data_type是可選項,顯式地為當前被綁定的參數設置數據類型。可以為以下值。

Ø PDO::PARAM_BOOL:代表boolean數據類型。

Ø PDO::PARAM_NULL:代表SQL中NULL類型。

Ø PDO::PARAM_INT:代表SQL中INTEGER數據類型。

Ø PDO::PARAM_STR:代表SQL中CHAR、VARCHAR和其他字符串數據類型。

Ø PDO::PARAM_LOB:代表SQL中大對象數據類型。

第四個參數length是可選項,用於指定數據類型的長度。

第五個參數driver_options是可選項,通過該參數提供數據庫驅動程序特定的選項。

將上一節中用兩種佔位符語法準備的SQL查詢,使用bindParam()方法分別綁定對應的參數。查詢中使用命名參數的綁定示例如下所示:

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

查詢中使用問號(?)參數的綁定示例如下所示,並在綁定時通過第三個參數顯式地指定數據類型。當然,使用名字參數一樣可以通過第三個參數指定類型並通過第四個參數指定長度。

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

《細說PHP》第四版 樣章 第18章 數據庫抽象層PDO 7

"

相關推薦

推薦中...