方法 bindParam() 和 bindValue() 非常相似。
10年積累的網(wǎng)站設計、成都網(wǎng)站設計經(jīng)驗,可以快速應對客戶對網(wǎng)站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡服務。我雖然不認識你,你也不認識我。但先網(wǎng)站設計后付款的網(wǎng)站建設流程,更有洛陽免費網(wǎng)站建設讓你可以放心的選擇與我們合作。
唯一的區(qū)別就是前者使用一個PHP變量綁定參數(shù),而后者使用一個值。
所以使用bindParam是第二個參數(shù)只能用變量名,而不能用變量值,而bindValue至可以使用具體值。
復制代碼 代碼如下:
$stm = $pdo-prepare("select * from users where user = :user");
$user = "jack";
//正確
$stm-bindParam(":user",$user);
//錯誤
//$stm-bindParam(":user","jack");
//正確
$stm-bindValue(":user",$user);
//正確
$stm-bindValue(":user","jack");
另外在存儲過程中,bindParam可以綁定為input/output變量,如下面:
復制代碼 代碼如下:
$stm = $pdo-prepare("call func(:param1)");
$param1 = "abcd";
$stm-bindParam(":param1",$param1); //正確
$stm-execute();
存儲過程執(zhí)行過后的結果可以直接反應到變量上。
對于那些內(nèi)存中的大數(shù)據(jù)塊參數(shù),處于性能的考慮,應優(yōu)先使用前者。
--------------------------------------------------
參數(shù)化查詢
參數(shù)化查詢(Parameterized Query 或 Parameterized Statement)是指在設計與數(shù)據(jù)庫連結并訪問數(shù)據(jù)時,在需要填入數(shù)值或數(shù)據(jù)的地方,使用參數(shù) (Parameter) 來給值,這個方法目前已被視為最有效可預防SQL注入攻擊 (SQL Injection) 的攻擊手法的防御方式。有部份的開發(fā)人員可能會認為使用參數(shù)化查詢,會讓程序更不好維護,或者在實現(xiàn)部份功能上會非常不便[來源請求],然而,使用參數(shù)化查詢造成的額外開發(fā)成本,通常都遠低于因為SQL注入攻擊漏洞被發(fā)現(xiàn)而遭受攻擊,所造成的重大損失。
除了安全因素,相比起拼接字符串的 SQL 語句,參數(shù)化的查詢往往有性能優(yōu)勢。因為參數(shù)化的查詢能讓不同的數(shù)據(jù)通過參數(shù)到達數(shù)據(jù)庫,從而公用同一條 SQL 語句。大多數(shù)數(shù)據(jù)庫會緩存解釋 SQL 語句產(chǎn)生的字節(jié)碼而省下重復解析的開銷。如果采取拼接字符串的 SQL 語句,則會由于操作數(shù)據(jù)是 SQL 語句的一部分而非參數(shù)的一部分,而反復大量解釋 SQL 語句產(chǎn)生不必要的開銷。
目錄
* 1 原理
* 2 SQL 指令撰寫方法
o 2.1 Microsoft SQL Server
o 2.2 Microsoft Access
o 2.3 MySQL
o 2.4 PostgreSQL/SQLite
* 3 客戶端程序撰寫方法
o 3.1 ADO.NET
o 3.2 PDO
o 3.3 JDBC
o 3.4 Cold Fusion
[編輯] 原理
在使用參數(shù)化查詢的情況下,數(shù)據(jù)庫服務器不會將參數(shù)的內(nèi)容視為SQL指令的一部份來處理,而是在數(shù)據(jù)庫完成 SQL 指令的編譯后,才套用參數(shù)運行,因此就算參數(shù)中含有具破壞性的指令,也不會被數(shù)據(jù)庫所運行。
[編輯] SQL 指令撰寫方法
在撰寫 SQL 指令時,利用參數(shù)來代表需要填入的數(shù)值,例如:
[編輯] Microsoft SQL Server
Microsoft SQL Server 的參數(shù)格式是以 "@" 字符加上參數(shù)名稱而成,SQL Server 亦支持匿名參數(shù) "?"。
SELECT * FROM myTable WHERE myID = @myID
INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)
[編輯] Microsoft Access
Microsoft Access 不支持具名參數(shù),只支持匿名參數(shù) "?"。
UPDATE myTable SET c1 = ?, c2 = ?, c3 = ? WHERE c4 = ?
[編輯] MySQL
MySQL 的參數(shù)格式是以 "?" 字符加上參數(shù)名稱而成。
UPDATE myTable SET c1 = ?c1, c2 = ?c2, c3 = ?c3 WHERE c4 = ?c4
[編輯] PostgreSQL/SQLite
PostgreSQL 和 SQLite 的參數(shù)格式是以 “:” 加上參數(shù)名而成。當然,也支持類似 Access 的匿名參數(shù)。
UPDATE "myTable" SET "c1" = :c1, "c2" = :c2, "c3" = :c3 WHERE "c4" = :c4
[編輯] 客戶端程序撰寫方法
在客戶端代碼中撰寫使用參數(shù)的代碼,例如:
[編輯] ADO.NET
ADO.NET用于ASP.NET之內(nèi)。
SqlCommand sqlcmd = new SqlCommand("INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)", sqlconn);
sqlcmd.Parameters.AddWithValue("@c1", 1); // 設定參數(shù) @c1 的值。
sqlcmd.Parameters.AddWithValue("@c2", 2); // 設定參數(shù) @c2 的值。
sqlcmd.Parameters.AddWithValue("@c3", 3); // 設定參數(shù) @c3 的值。
sqlcmd.Parameters.AddWithValue("@c4", 4); // 設定參數(shù) @c4 的值。
sqlconn.Open();
sqlcmd.ExecuteNonQuery();
sqlconn.Close();
[編輯] PDO
PDO用于PHP之內(nèi)。 在使用 PDO 驅(qū)動時,參數(shù)查詢的使用方法一般為:
復制代碼 代碼如下:
// 實例化數(shù)據(jù)抽象層對象
$db = new PDO('pgsql:host=127.0.0.1;port=5432;dbname=testdb');
// 對 SQL 語句執(zhí)行 prepare,得到 PDOStatement 對象
$stmt = $db-prepare('SELECT * FROM "myTable" WHERE "id" = :id AND "is_valid" = :is_valid');
// 綁定參數(shù)
$stmt-bindValue(':id', $id);
$stmt-bindValue(':is_valid', true);
// 查詢
$stmt-execute();
// 獲取數(shù)據(jù)
foreach($stmt as $row) {
var_dump($row);
}
[code]
對于 MySQL 的特定驅(qū)動,也可以這樣使用:
$db = new mysqli("localhost", "user", "pass", "database");
$stmt = $mysqli - prepare("SELECT priv FROM testUsers WHERE username=? AND password=?");
$stmt - bind_param("ss", $user, $pass);
$stmt - execute();
值得注意的是,以下方式雖然能有效防止 SQL注入 (歸功于 mysql_real_escape_string 函數(shù)的轉(zhuǎn)義),但并不是真正的參數(shù)化查詢。其本質(zhì)仍然是拼接字符串的 SQL 語句。
[code]
$query = sprintf("SELECT * FROM Users where UserName='%s' and Password='%s'",
mysql_real_escape_string($Username),
mysql_real_escape_string($Password));
mysql_query($query);
[編輯] JDBC
JDBC用于Java之內(nèi)。
java.sql.PreparedStatement prep = connection.prepareStatement(
"SELECT * FROM `users` WHERE USERNAME = ? AND PASSWORD = ?");
prep.setString(1, username);
prep.setString(2, password);
prep.executeQuery();
[編輯] Cold Fusion
cfquery name="Recordset1" datasource="cafetownsend"
SELECT *
FROM COMMENTS
WHERE COMMENT_ID =cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric"
/cfquery
數(shù)組表單后面不需要加數(shù)字標簽,會自動編碼。
見以下代碼:
!DOCTYPE?html
html?lang="zh-CN"
head
meta?charset="utf-8"
titleTest/title
/head
body
form?method="post"
input?type="text"?name="age[]"
textarea?name="name[]"/textarea
hr
input?type="text"?name="age[]"
textarea?name="name[]"/textarea
hr
input?type="text"?name="age[]"
textarea?name="name[]"/textarea
hr
input?type="text"?name="age[]"
textarea?name="name[]"/textarea
hr
input?type="text"?name="age[]"
textarea?name="name[]"/textarea
hr
button?type="submit"提交/button
/form
?php
if(!empty($_POST)){
$pdo???=?new?PDO("mysql:host=localhost;dbname=t1","root","");
$stmt??=?$pdo-prepare("insert?into?t2(age,name)values(:age,:name)");
$ages??=?$_POST['age'];
$names?=?$_POST['name'];
foreach($ages?as?$key?=?$age){
if(trim($age)?||?trim($names[$key])){
$stmt-execute(array(':age'=$age,':name'=$names[$key]));
}
}
}
?
/body
/html
ini_set('max_execution_time','0');
$pdo = new PDO("mysql:host=localhost;dbname=test","root","123456");
$sql = "insert into test(name,age,state,created_time) values";
for($i=0; $i100000; $i++){
$sql .="('zhangsan',21,1,'2015-09-17')";
}
$sql = substr($sql,0,strlen($sql)-1);
var_dump($sql);
if($pdo - exec($sql)){
echo "插入成功!";
echo $pdo - lastinsertid();
}
試試吧。10萬條1分鐘多,我覺得還行
本文實例講述了PHP實現(xiàn)的pdo連接數(shù)據(jù)庫并插入數(shù)據(jù)功能。分享給大家供大家參考,具體如下:
創(chuàng)建配置文件
pdo_config.php
?php
$db_Type
=
"mysql";//數(shù)據(jù)庫類型
$host
=
"localhost";//主機名
$dbName
=
"test";//數(shù)據(jù)庫名
$userName
=
"root";//用戶名
$password
=
"root";//密碼
$dsn
=
"{$db_Type}:host={$host};dbname={$dbName}";
?
pdo插入數(shù)據(jù)庫
pdo_insert.php
?php
header('Content-type:text/html;
charset=utf-8');
require
'pdo_config.php';
try{
$pdo
=
new
PDO
($dsn,$userName,$password);//創(chuàng)建一個連接對象
$pdo-exec('set
names
utf8');//設置編碼
$sql
=
"INSERT
student
(name,email)
VALUES
('李四','123@qq.com')";
$pdo-exec($sql);
}catch
(PDOException
$e){
die('操作失敗'.$e-getMessage());
}
//關閉連接
$pdo
=
null;
?
更多關于PHP相關內(nèi)容感興趣的讀者可查看本站專題:《PHP基于pdo操作數(shù)據(jù)庫技巧總結》、《php+mysqli數(shù)據(jù)庫程序設計技巧總結》、《php面向?qū)ο蟪绦蛟O計入門教程》、《php字符串(string)用法總結》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設計有所幫助。
您可能感興趣的文章:關于php連接mssql:pdo
odbc
sql
serverPHP5中使用PDO連接數(shù)據(jù)庫的方法PHP中PDO連接數(shù)據(jù)庫中各種DNS設置方法小結ThinkPHP框架基于PDO方式連接數(shù)據(jù)庫操作示例PHP使用ODBC連接數(shù)據(jù)庫的方法tp5(thinkPHP5)框架連接數(shù)據(jù)庫的方法示例PHP7使用ODBC連接SQL
Server2008
R2數(shù)據(jù)庫示例【基于thinkPHP5.1框架】tp5(thinkPHP5)操作mongoDB數(shù)據(jù)庫的方法thinkPHP5實現(xiàn)數(shù)據(jù)庫添加內(nèi)容的方法tp5(thinkPHP5)框架數(shù)據(jù)庫Db增刪改查常見操作總結PHP利用pdo_odbc實現(xiàn)連接數(shù)據(jù)庫示例【基于ThinkPHP5.1搭建的項目】
首先是向了解PHP呢還是大數(shù)據(jù)呢?不過想都拿下的話,不是一朝一夕的,步子邁得太大,不好,技在于精而后于多。
先說PHP:最基本其實就是web前端基礎;第二的話包括PHP語言基礎、Ajax、數(shù)據(jù)庫強化、運行環(huán)境及配置、面向?qū)ο驩OADUML等;第三就是主流框架的掌握了,Smarty、PDO等
再說大數(shù)據(jù):
基礎階段:Linux、Docker、KVM、MySQL基礎、Oracle基礎、MongoDB、redis。
hadoop mapreduce hdfs yarn:hadoop:Hadoop 概念、版本、歷史,HDFS工作原理,YARN介紹及組件介紹。
大數(shù)據(jù)存儲階段:hbase、hive、sqoop。
大數(shù)據(jù)架構設計階段:Flume分布式、Zookeeper、Kafka。
大數(shù)據(jù)實時計算階段:Mahout、Spark、storm。
大數(shù)據(jù)數(shù)據(jù)采集階段:Python、Scala。
大數(shù)據(jù)商業(yè)實戰(zhàn)階段:實操企業(yè)大數(shù)據(jù)處理業(yè)務場景,分析需求、解決方案實施,綜合技術實戰(zhàn)應用。
當前名稱:phppdo大數(shù)據(jù) php轉(zhuǎn)大數(shù)據(jù)
標題URL:http://muchs.cn/article46/docohhg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供響應式網(wǎng)站、移動網(wǎng)站建設、關鍵詞優(yōu)化、網(wǎng)站內(nèi)鏈、App開發(fā)、外貿(mào)網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)