PHP 在5.1.* 和5.2.*之間 PDO數(shù)據(jù)庫操作中的不同之處小結(jié)
更新時(shí)間:2012年03月07日 23:32:02 作者:
今天發(fā)現(xiàn)php5.1.*和php5.2.*在數(shù)據(jù)庫預(yù)編譯代碼執(zhí)行的時(shí)候出現(xiàn)差異
介紹
今天發(fā)現(xiàn)php5.1.*和php5.2.*在數(shù)據(jù)庫預(yù)編譯代碼執(zhí)行的時(shí)候出現(xiàn)差異。
預(yù)編譯優(yōu)點(diǎn)
1.使用占位符,避免逐字輸入數(shù)據(jù)到SQL中。自動(dòng)處理引號(hào)和反斜線等字符的轉(zhuǎn)義——增加安全性。
2.預(yù)先“準(zhǔn)備”一條語句,然后在每次執(zhí)行時(shí)綁定不同值達(dá)到重用的目的?!S糜谝院蟊欢啻螆?zhí)行的語句。
3.可讀性強(qiáng)。
代碼
數(shù)據(jù)庫連接代碼都一樣.
$protol = 'mysql:host=localhost;dbname=test';
$username = 'monty';
$passwd = '0818';
$dbh = new PDO($protol, $username, $passwd);
以下是一些測試。注意里面的SQL和for或者foreach語句!
測試1(用key值進(jìn)行綁定)
$stmt = $dbh->prepare('select * from t1 where name=:name');
$params = array();
$params['name'] = 'rentao';
foreach($params as $k=>$v){
$stmt->bindParam($k, $v);
}
$stmt->execute();
$item = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
var_dump($row);
}
$stmt = null;
$dbh = null;
結(jié)論:
測試2(數(shù)字下標(biāo)去綁定,但是綁定的起始參數(shù)是1)——":key"在php5.2.*上不能用數(shù)字下標(biāo)綁定
$stmt = $dbh->prepare('select * from t1 where name=:name limit 2');
$params = array();
$params[] = 'rentao';// 這里加不加":"都能成功執(zhí)行
for($i=0,$iLen = count($params); $i < $iLen; $i++){
$k = $i+1;
$stmt->bindParam($k, $params[$i]);
}
echo "HERE1\n";
$stmt->execute();
echo "HERE2\n";
$item = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
var_dump($row);
}
$stmt = null;
$dbh = null;
結(jié)論:
測試3(limit綁定:page)
結(jié)論:
測試4(在limit下進(jìn)行預(yù)編譯操作:page)——使用“?”機(jī)制運(yùn)行
$stmt = $dbh->prepare('select * from t2 where name=? limit ?');
$params = array();
$params[] = 'rentao';
$params[] = 2;
for($i=0,$iLen = count($params); $i < $iLen; $i++){
$k = $i+1;
$stmt->bindParam($k, $params[$i]);
}
$stmt->execute();
$item = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
var_dump($row);
}
$stmt = null;
$dbh = null;
測試5---order by)
總結(jié)
PHP在使用PDO做數(shù)據(jù)庫預(yù)編譯操作的時(shí)候,盡量避免使用limit, order by, group by 做預(yù)編譯處理。綁定變量我們盡量使用統(tǒng)一標(biāo)準(zhǔn),要不然都使用“?”,要不然使用“:key”。
有用的命令,我在php5.1.*進(jìn)行測試,測試完了,我通過scp把文件傳輸?shù)絧hp5.2.*服務(wù)器上
今天發(fā)現(xiàn)php5.1.*和php5.2.*在數(shù)據(jù)庫預(yù)編譯代碼執(zhí)行的時(shí)候出現(xiàn)差異。
預(yù)編譯優(yōu)點(diǎn)
1.使用占位符,避免逐字輸入數(shù)據(jù)到SQL中。自動(dòng)處理引號(hào)和反斜線等字符的轉(zhuǎn)義——增加安全性。
2.預(yù)先“準(zhǔn)備”一條語句,然后在每次執(zhí)行時(shí)綁定不同值達(dá)到重用的目的?!S糜谝院蟊欢啻螆?zhí)行的語句。
3.可讀性強(qiáng)。
代碼
數(shù)據(jù)庫連接代碼都一樣.
復(fù)制代碼 代碼如下:
$protol = 'mysql:host=localhost;dbname=test';
$username = 'monty';
$passwd = '0818';
$dbh = new PDO($protol, $username, $passwd);
以下是一些測試。注意里面的SQL和for或者foreach語句!
測試1(用key值進(jìn)行綁定)
復(fù)制代碼 代碼如下:
$stmt = $dbh->prepare('select * from t1 where name=:name');
$params = array();
$params['name'] = 'rentao';
foreach($params as $k=>$v){
$stmt->bindParam($k, $v);
}
$stmt->execute();
$item = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
var_dump($row);
}
$stmt = null;
$dbh = null;
結(jié)論:
PHP 5.1.* | PHP 5.2.* |
執(zhí)行正常 | 執(zhí)行正常 |
$params['name'] = 'rentao' 和$params[':name']='rentao'這兩個(gè)都能執(zhí)行,說明不受“:”限制。 |
復(fù)制代碼 代碼如下:
$stmt = $dbh->prepare('select * from t1 where name=:name limit 2');
$params = array();
$params[] = 'rentao';// 這里加不加":"都能成功執(zhí)行
for($i=0,$iLen = count($params); $i < $iLen; $i++){
$k = $i+1;
$stmt->bindParam($k, $params[$i]);
}
echo "HERE1\n";
$stmt->execute();
echo "HERE2\n";
$item = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
var_dump($row);
}
$stmt = null;
$dbh = null;
結(jié)論:
php 5.1.* | PHP 5.2.* |
執(zhí)行正常 | 出現(xiàn)錯(cuò)誤:“PHP Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined” |
如果把":name"改成"?",那么兩個(gè)版本都可以順利進(jìn)行。 | |
不能同時(shí)使用兩種符號(hào)。如 select * from t2 where name=? limit :page |
復(fù)制代碼 代碼如下:
$stmt = $dbh->prepare('select * from t2 where name=:name limit :page');
$params = array();
$params['name'] = 'rentao';// 這里加不加":"都能成功執(zhí)行
$params['page'] = 2;
foreach($params as $k=>$v){
$stmt->bindParam($k, $v);
}
$stmt->execute();
echo "HERE1\n";
$item = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
var_dump($row);
}
echo "HERE2\n";
$stmt = null;
$dbh = null;
$params = array();
$params['name'] = 'rentao';// 這里加不加":"都能成功執(zhí)行
$params['page'] = 2;
foreach($params as $k=>$v){
$stmt->bindParam($k, $v);
}
$stmt->execute();
echo "HERE1\n";
$item = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
var_dump($row);
}
echo "HERE2\n";
$stmt = null;
$dbh = null;
結(jié)論:
PHP 5.1.* | PHP 5.2.* |
執(zhí)行到$stmt->execute()時(shí),進(jìn)程一直處于等待狀態(tài)中 | 執(zhí)行正常:打印不出結(jié)果 |
復(fù)制代碼 代碼如下:
$stmt = $dbh->prepare('select * from t2 where name=? limit ?');
$params = array();
$params[] = 'rentao';
$params[] = 2;
for($i=0,$iLen = count($params); $i < $iLen; $i++){
$k = $i+1;
$stmt->bindParam($k, $params[$i]);
}
$stmt->execute();
$item = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
var_dump($row);
}
$stmt = null;
$dbh = null;
PHP 5.1.* | PHP 5.2.* |
執(zhí)行正常 | 執(zhí)行正常:打印不出結(jié)果 |
PHP 5.1.* | PHP 5.2.* |
打印出結(jié)果,但未按order by進(jìn)行排序 | 執(zhí)行正常:打印不出結(jié)果 |
PHP在使用PDO做數(shù)據(jù)庫預(yù)編譯操作的時(shí)候,盡量避免使用limit, order by, group by 做預(yù)編譯處理。綁定變量我們盡量使用統(tǒng)一標(biāo)準(zhǔn),要不然都使用“?”,要不然使用“:key”。
有用的命令,我在php5.1.*進(jìn)行測試,測試完了,我通過scp把文件傳輸?shù)絧hp5.2.*服務(wù)器上
復(fù)制代碼 代碼如下:
scp -P9888 index.php rentao@192.168.10.4:/home/rentao
相關(guān)文章
php獲取$_POST同名參數(shù)數(shù)組的實(shí)現(xiàn)介紹
本篇文章是對php獲取$_POST同名參數(shù)數(shù)組的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06php中ftp_chdir與ftp_cdup函數(shù)用法
這篇文章主要介紹了php中ftp_chdir與ftp_cdup函數(shù)用法,以實(shí)例形式講述了PHP中的FTP目錄操作技巧,具有一定的借鑒價(jià)值,需要的朋友可以參考下2014-11-11PHP下操作Linux消息隊(duì)列完成進(jìn)程間通信的方法
當(dāng)我們開發(fā)的系統(tǒng)需要使用多進(jìn)程方式運(yùn)行時(shí),進(jìn)程間通信便成了至關(guān)重要的環(huán)節(jié)。消息隊(duì)列(message queue)是Linux系統(tǒng)進(jìn)程間通信的一種方式。2010-07-07PHP實(shí)現(xiàn)web socket長鏈接流程詳解
這篇文章主要介紹了PHP實(shí)現(xiàn)web socket長鏈接流程,了解內(nèi)部原理是為了幫助我們做擴(kuò)展,同時(shí)也是驗(yàn)證了一個(gè)人的學(xué)習(xí)能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會(huì)的2023-03-03PHP+Ajax 檢測網(wǎng)絡(luò)是否正常實(shí)例詳解
這篇文章主要介紹了PHP+Ajax 檢測網(wǎng)絡(luò)是否正常實(shí)例詳解的相關(guān)資料,這里附有實(shí)例代碼,需要的朋友可以參考下2016-12-12