首頁 後端開發 php教程 PDO預處理語句PDOStatement對象

PDO預處理語句PDOStatement對象

Jul 03, 2018 pm 04:53 PM
pdo 預處理語句

這篇文章主要介紹了PDO預處理語句PDOStatement物件使用總結,本文介紹了PDOStatement的方法及常用方法的使用範例,需要的朋友可以參考下

PDO對預處理語句的支持需要使用PDOStatement類別對象,但該類別物件並不是透過NEW關鍵字實例化出來的,而是透過PDO對像中的prepare()方法,在資料庫伺服器中準備好一個預處理的SQL語句後直接傳回的。如果透過先前執行PDO對像中的query()方法傳回的PDOStatement類別對象,只代表的是一個結果集物件。而如果透過執行PDO對像中的prepare()方法所產生的PDOStatement類別對象,則為一個查詢對象,能定義並執行參數化的SQL指令。 PDOStatement類別中的全部成員方法如下所示:

PDOStatement::bindColumn — 绑定一列到一个 PHP 变量
PDOStatement::bindParam — 绑定一个参数到指定的变量名
PDOStatement::bindValue — 把一个值绑定到一个参数
PDOStatement::closeCursor — 关闭游标,使语句能再次被执行。
PDOStatement::columnCount — 返回结果集中的列数
PDOStatement::debugDumpParams — 打印一条 SQL 预处理命令
PDOStatement::errorCode — 获取跟上一次语句句柄操作相关的 SQLSTATE
PDOStatement::errorInfo — 获取跟上一次语句句柄操作相关的扩展错误信息
PDOStatement::execute — 执行一条预处理语句
PDOStatement::fetch — 从结果集中获取下一行
PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组
PDOStatement::fetchColumn — 从结果集中的下一行返回单独的一列。
PDOStatement::fetchObject — 获取下一行并作为一个对象返回。
PDOStatement::getAttribute — 检索一个语句属性
PDOStatement::getColumnMeta — 返回结果集中一列的元数据
PDOStatement::nextRowset — 在一个多行集语句句柄中推进到下一个行集
PDOStatement::rowCount — 返回受上一个 SQL 语句影响的行数
PDOStatement::setAttribute — 设置一个语句属性
PDOStatement::setFetchMode — 为语句设置默认的获取模式。
登入後複製

1、準備語句

重複執行一個SQL查詢,透過每次迭代使用不同的參數,這種情況使用預處理語句運作效率最高。使用預處理語句,首先需要在資料庫伺服器中先準備好“一個SQL語句”,但並不需要馬上執行。 PDO支援使用「佔位符」語法,將變數綁定到這個預處理的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類別物件。

2、綁定參數

當SQL語句透過PDO物件中的prepare()方法在資料庫伺服器端準備好了以後,如果使用了佔位符,就需要在每次執行時取代輸入的參數。可以透過PDOStatement物件中的bindParam()方法,把參數變數綁定到準備好的佔位符上(位置或名字要對應)。方法bindParame()的原型如下所示:

bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, 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是可選項,透過此參數提供任何資料庫驅動程式特定的選項。
使用命名參數作為佔位符的參數綁定範例:

<?php
//...省略PDO连接数据库代码
$query = "insert into contactinfo (name,address,phone) values(:name,:address,:phone)";
$stmt = $dbh->prepare($query);          //调用PDO对象中的prepare()方法
 
$stmt->blinparam(&#39;:name&#39;,$name);        //将变量$name的引用绑定到准备好的查询名字参数":name"中
$stmt->blinparam(&#39;:address&#39;,$address);
$stmt->blinparam(&#39;:phone&#39;,phone);
//...
?>
登入後複製

使用問號(?)作為佔位符的參數綁定範例:

<?php
//...省略PDO连接数据库代码
$query = "insert into contactinfo (name,address,phone) values(?,?,?)";
$stmt = $dbh->prepare($query);          //调用PDO对象中的prepare()方法
 
$stmt->blinparam(1,$name,PDO::PARAM_STR);        //将变量$name的引用绑定到准备好的查询名字参数":name"中
$stmt->blinparam(2,$address,PDO::PARAM_STR);
$stmt->blinparam(3,phone,PDO::PARAM_STR,20);
//...
?>
登入後複製

3、執行準備語句

當準備語句完成,並綁定了對應的參數後,就可以透過呼叫PDOStatement類別物件中的execute()方法,重複執行在資料庫快取區準備好的語句了。在下面的範例中,向前面提供的contactinfo表中,使用預處理方式連續執行同一個INSERT語句,透過改變不同的參數來新增兩筆記錄。如下所示:

<?php 
try {
     $dbh = new PDO(&#39;mysql:dbname=testdb;host=localhost&#39;, $username, $passwd);
}catch (PDOException $e){
    echo &#39;数据库连接失败:&#39;.$e->getMessage();
    exit;
}
 
$query = "insert into contactinfo (name,address,phone) values(?,?,?)";
$stmt = $dbh->prepare($query);
 
$stmt->blinparam(1,$name);      
$stmt->blinparam(2,$address);
$stmt->blinparam(3,phone);
 
$name = "赵某某";
$address = "海淀区中关村";
$phone = "15801688348";
 
$stmt->execute();           //执行参数被绑定后的准备语句
?>
登入後複製

如果你只是要傳遞輸入參數,並且有許多這樣的參數要傳遞,那麼你會覺得下面所示的快捷方式語法非常有幫助。是透過在execute()方法中提供一個可選參數,該參數是由準備查詢中的命名參數佔位符組成的數組,這是第二種為預處理查詢在執行中替換輸入參數的方式。此語法使你能夠省去對$stmt->bindParam()的呼叫。將上面的範例做如下修改:

<?php 
//...省略PDO连接数据库代码
$query = "insert into contactinfo (name,address,phone) values(?,?,?)";
$stmt = $dbh->prepare($query); 
 
//传递一个数组为预处理查询中的命名参数绑定值,并执行一次。
$stmt->execute(array("赵某某","海淀区","15801688348"));
?>
登入後複製

另外,如果執行的是INSERT語句,且資料表中有自動成長的ID字段,可以使用PDO物件中的lastinsertId()方法取得最後插入資料表中的記錄ID。如果需要查看其他DML語句是否執行成功,可以透過PDOStatement類別物件中的rowCount()方法來取得影響記錄的行數。

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

thinkPHP2.1自訂標籤庫的導入方法的介紹

使用pthreads實作真正的PHP多執行緒的方法

#

以上是PDO預處理語句PDOStatement對象的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
PHP Fatal error: Call to undefined method PDO::prepare() in的解決方法 PHP Fatal error: Call to undefined method PDO::prepare() in的解決方法 Jun 22, 2023 pm 06:40 PM

PHP作為一種流行的Web開發語言,已經被使用很久了。 PHP中整合的PDO(PHP資料物件)類別是我們在開發Web應用程式過程中與資料庫互動的常用方法。但是,一些PHP開發者經常遇到的問題是,當使用PDO類別與資料庫互動時,他們會收到這樣的錯誤:PHPFatalerror:CalltoundefinedmethodPDO::prep

php如何使用PHP的PDO_PGSQL擴充? php如何使用PHP的PDO_PGSQL擴充? Jun 02, 2023 pm 06:10 PM

PHP作為一種流行的程式語言,在Web開發領域中有著廣泛的應用。其中,PHP的PDO_PGSQL擴展是一種常用的PHP擴展,它提供了與PostgreSQL資料庫的交互接口,可以實現PHP與PostgreSQL之間的資料傳輸和交互。本文將詳細介紹如何使用PHP的PDO_PGSQL擴充。一、什麼是PDO_PGSQL擴充? PDO_PGSQL是PHP的擴充庫,它

PHP和PDO: 如何執行批次插入和更新 PHP和PDO: 如何執行批次插入和更新 Jul 28, 2023 pm 07:41 PM

PHP和PDO:如何執行批次插入和更新導言:在使用PHP編寫資料庫相關的應用程式時,經常會遇到需要批次插入和更新資料的情況。傳統的做法是使用循環來執行多次資料庫操作,但這樣的方法效率較低。 PHP的PDO(PHPDataObject)提供了一種更有效率的方法來執行批次插入和更新操作,本文將介紹如何使用PDO來實現批次插入和更新。一、PDO簡介:PDO是PH

PHP和PDO: 如何進行分頁查詢和顯示數據 PHP和PDO: 如何進行分頁查詢和顯示數據 Jul 29, 2023 pm 04:10 PM

PHP和PDO:如何進行分頁查詢和顯示資料在開發網頁應用程式時,分頁查詢和顯示資料是一個非常常見的需求。透過分頁,我們可以一次顯示一定數量的數據,提高頁面載入速度和使用者體驗。在PHP中,使用PHP資料物件(PDO)函式庫可以輕鬆實現分頁查詢和顯示資料的功能。本文將介紹如何在PHP中使用PDO進行分頁查詢和顯示數據,並提供相應的程式碼範例。一、建立資料庫和資料表

PHP和PDO: 如何執行資料庫中的全文搜索 PHP和PDO: 如何執行資料庫中的全文搜索 Jul 30, 2023 pm 04:33 PM

PHP和PDO:如何執行資料庫中的全文搜尋在現代的Web應用程式中,資料庫是一個很重要的組成部分。當我們需要從大量的資料中搜尋特定的資訊時,全文搜尋是一種非常有用的功能。 PHP和PDO(PHPDataObjects)提供了一種簡單且強大的方法來執行資料庫中的全文搜尋。本文將介紹如何使用PHP和PDO來實現全文搜索,並提供一些範例程式碼來示範這個過程。首先

PHP和PDO: 如何處理資料庫中的JSON數據 PHP和PDO: 如何處理資料庫中的JSON數據 Jul 29, 2023 pm 05:17 PM

PHP和PDO:如何處理資料庫中的JSON資料在現代web開發中,處理和儲存大量資料是一個非常重要的任務。隨著行動應用和雲端運算的普及,越來越多的資料以JSON(JavaScriptObjectNotation)格式儲存在資料庫中。 PHP作為一種常用的伺服器端語言,它的PDO(PHPDataObject)擴充提供了一種方便的方式來處理和操作資料庫。本

PHP PDO 與 mysqli:比較和對比 PHP PDO 與 mysqli:比較和對比 Feb 19, 2024 pm 12:24 PM

PDOPDO是一個物件導向的資料庫存取抽象層,它為PHP提供了一個統一的接口,允許您使用相同的程式碼與不同的資料庫(如Mysql、postgresql、oracle)進行互動。 PDO隱藏了底層資料庫連線的複雜性,簡化了資料庫操作。優缺點優點:統一接口,支援多種資料庫簡化資料庫操作,降低開發難度提供預處理語句,提高安全性支援事務處理缺點:效能可能比原生擴充稍低依賴外部函式庫,可能會增加開銷演示程式碼使用PDO連線mysql資料庫:$db=newPDO("mysql:host=localhost;dbnam

PHP PDO教學:從基礎到精通的進階指南 PHP PDO教學:從基礎到精通的進階指南 Feb 19, 2024 pm 06:30 PM

1.PDO簡介PDO是PHP的擴充庫,它提供了一個物件導向的方式來操作資料庫。 PDO支援多種資料庫,包括Mysql、postgresql、oracle、SQLServer等。 PDO使開發人員能夠使用統一的api來操作不同的資料庫,這使得開發人員可以在不同的資料庫之間輕鬆切換。 2.PDO連接資料庫要使用PDO連接資料庫,首先需要建立一個PDO物件。 PDO物件的建構函式接收三個參數:資料庫類型、主機名稱、資料庫使用者名稱和密碼。例如,以下程式碼建立了一個連接到mysql資料庫的物件:$dsn="mysq

See all articles