[PDO绑定参数]使用PHP的PDO扩展进行批量更新操作,pdo绑定_PHP教程
[PDO绑定参数]使用PHP的PDO扩展进行批量更新操作,pdo绑定
最近有一个批量更新数据库表中某几个字段的需求,在做这个需求的时候,使用了PDO做参数绑定,其中遇到了一个坑。
方案选择
笔者已知的做批量更新有以下几种方案:
1、逐条更新
这种是最简单的方案,但无疑也是效率最低的方案。
2、CASE WHEN
类似如下的语句
<span>UPDATE</span> tbl_test <span>SET</span> val <span>=</span> <span>CASE</span> id <span>WHEN</span> <span>1</span> <span>THEN</span> <span>2</span> <span>WHEN</span> <span>2</span> <span>THEN</span> <span>3</span> <span>END</span> <span>WHERE</span> id <span>IN</span>(<span>1</span>, <span>2</span>);
PDO绑定参数
为了防止SQL注入,使用了PDO扩展绑定参数。上面的数字在一般情况下是变量,那么就需要做参数绑定。刚开始是想着在IN的时候将id组成的字符串作为变量绑定过去,第一次实现的代码如下:
<span> 1</span> <?<span>php </span><span> 2</span> <span>$data</span> = <span>array</span>(<span>array</span>('id' => 1, 'val' => 2), <span>array</span>('id' => 2, 'val' => 3<span>)); </span><span> 3</span> <span>$ids</span> = <span>implode</span>(',', <span>array_map</span>(<span>function</span>(<span>$v</span>) {<span>return</span> <span>$v</span>['id'];}, <span>$data</span>)); <span>//</span><span>获取ID数组</span> <span> 4</span> <span>$update_sql</span> = 'UPDATE tbl_test SET val = CASE id'<span>; </span><span> 5</span> <span>$params</span> = <span>array</span><span>(); </span><span> 6</span> <span>$params</span>[":ids"] = <span>$ids</span><span>; </span><span> 7</span> <span>foreach</span>(<span>$data</span> <span>as</span> <span>$key</span> => <span>$item</span><span>) { </span><span> 8</span> <span>$update_sql</span> .= "WHEN :id_" . <span>$key</span> . "THEN :val_" . <span>$key</span> . " "<span>; </span><span> 9</span> <span>$params</span>[":id_" . <span>$key</span>] = <span>$item</span>['id'<span>]; </span><span>10</span> <span>$params</span>[":val_" . <span>$key</span>] = <span>$item</span>['val'<span>]; </span><span>11</span> <span> } </span><span>12</span> <span>$update_sql</span> .= "END WHERE id IN (:_ids)"<span>; </span><span>13</span> <span>TEST::</span>execute(<span>$update_sql</span>, <span>$params</span>);//此处会调用bindParam绑定参数
后来发现这样是行不通的,而且比较诡异的是这样只能更新第一条记录。查阅资料后,发现这样的绑定方式是不行的,IN语句的参数应该一个一个地绑定。看看文档中对bindParam函数的描述:
可以看到,说明里写的是会绑定一个PHP变量到占位符里,所以如果绑定了:ids为1, 2的字符串,那么MySQL解析语句的时候会将1,2解析为单个的变量,而不会当作一串。这也是PDO防SQL注入的原理,通过占位符的绑定,只将绑定的值当作一个值,而不是语句之类的其它东西,这样MySQL只会把传递过去的值当作一个变量的值。
修改后的写法:
<span> 1</span> <?<span>php </span><span> 2</span> <span>$data</span> = <span>array</span>(<span>array</span>('id' => 1, 'val' => 2), <span>array</span>('id' => 2, 'val' => 3<span>)); </span><span> 3</span> <span>$update_sql</span> = 'UPDATE tbl_test SET val = CASE id'<span>; </span><span> 4</span> <span>$params</span> = <span>array</span><span>(); </span><span> 5</span> <span>$params</span>[":ids"] = <span>$ids</span><span>; </span><span> 6</span> <span>$in_arr</span> = <span>array</span><span>(); </span><span> 7</span> <span> 8</span> <span>foreach</span>(<span>$data</span> <span>as</span> <span>$key</span> => <span>$item</span><span>) { </span><span> 9</span> <span>$update_sql</span> .= "WHEN :id_" . <span>$key</span> . "THEN :val_" . <span>$key</span> . " "<span>; </span><span>10</span> <span>$params</span>[":id_" . <span>$key</span>] = <span>$item</span>['id'<span>]; </span><span>11</span> <span>$params</span>[":val_" . <span>$key</span>] = <span>$item</span>['val'<span>]; </span><span>12</span> <span>$params</span>[":ids_" . <span>$key</span>] = <span>$item</span>['id'<span>]; </span><span>13</span> <span>array_push</span>(<span>$in_arr</span>, ":id_" . <span>$key</span><span>); </span><span>14</span> <span> } </span><span>15</span> <span>$update_sql</span> .= "END WHERE id IN (" . <span>implode</span>(',' <span>$in_arr</span>) . ")"<span>; </span><span>16</span> TEST::execute(<span>$update_sql</span>, <span>$params</span>);<span>//</span><span>此处会调用bindParam绑定参数</span>
总结
这是最近遇到的一个小问题,其实更多的是说明在MySQL的IN语句里面做参数绑定时应该一个一个的绑定。
参考链接:
mysql语句:批量更新多条记录的不同值
Can I bind an array to an IN() condition?
原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。
如果本文对你有帮助,请点下推荐,写文章不容易。

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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

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