PHPは5.1.*および5.2.*間のPDOデータベース操作の違い!

4483 ワード

<!--
.c_head{background-color: gray; padding-left: 5px; color: white; font-size: 20px; font-weight: bold;}
.c_nb{border:1px dotted #999;margin:10px;padding:5px;}
.c_body td{border:1px solid blue;align:center;text-align:center;font-size:12px;}
.c_body strong{display:block;height:27px;line-height:27px;background-color:#CCC;font-weight:300;text-indent:10px;}
-->
紹介する
 
今日php 5を発見しました.1.*とphp 5.2.*データベースプリコンパイルコードの実行時に差異が発生しました.
 
プリコンパイルの利点
1.文字ごとにSQLにデータを入力しないように、プレースホルダを使用します.引用符や反斜線などの文字のエスケープを自動的に処理することで、セキュリティが向上します.
2.文を事前に「準備」し、実行するたびに異なる値をバインドして再利用します.-後で複数回実行される文でよく使用されます.
3.可読性が高い.
 
コード#コード#
データベース接続コードは同じです.
 
$protol = 'mysql:host=localhost;dbname=test';
$username = 'monty';
$passwd = '0818';
$dbh = new PDO($protol, $username, $passwd);

以下はいくつかのテストです.SQLとforまたはforeach文に注意!
テスト1(key値でバインド)
$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;

結論:
PHP 5.1.*
PHP 5.2.*
正常に実行
正常に実行
$params['name']='rentao'と$params[':name']='rentao'の両方が実行でき、「:」に制限されないことを示します.
テスト2(数字の下にバインドされていますが、バインドの開始パラメータは1です)——「:key」はphp 5.2.*上は数字の下付きでバインドできません
$stmt = $dbh->prepare('select * from t1 where name=:name limit 2');
$params = array();
$params[] = 'rentao';//      ":"      


for($i=0,$iLen = count($params); $i < $iLen; $i++){
    $k = $i+1;
    $stmt->bindParam($k, $params[$i]);
}
echo "HERE1
"; $stmt->execute(); echo "HERE2
"; $item = array();

紹介する
 
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
    var_dump($row);
}
$stmt = null;
$dbh = null;

結論:
php 5.1.*
PHP 5.2.*
正常に実行
エラー:「PHP Warning:PDOStatement::execute():SQLSTATE[HY 093]:Invalid parameter number:parameter was not defined」
「:name」を「?」に変更すると、では、両方ともスムーズに進行します.
2つの記号を同時に使用することはできません.select*from t 2 where name=?limit :page
 
テスト3(limitバインド:page)
$stmt = $dbh->prepare('select * from t2 where name=:name  limit :page');
$params = array();
$params['name'] = 'rentao';//      ":"      
$params['page'] = 2;

foreach($params as $k=>$v){
    $stmt->bindParam($k, $v);
}
$stmt->execute();
echo "HERE1
"; $item = array(); while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ var_dump($row); } echo "HERE2
"; $stmt = null; $dbh = null;

 
結論:
PHP 5.1.*
PHP 5.2.*
$stmt->execute()まで実行すると、プロセスは待機中です.
正常に実行:結果が印刷されません
 
 
テスト4(limitでプリコンパイル操作:page)-「?」を使用メカニズム運転
$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.*
正常に実行
正常に実行:結果が印刷されません
テスト5---order by)
PHP 5.1.*
PHP 5.2.*
結果は印刷されますが、order byでソートされません.
正常に実行:結果が印刷されません
 
 
問題を書く
 
データベースの書き込み操作は、数値の下付きバインド方法(function execute(){})を使用します.だから、書き込み操作をするには「?に表示されます.
 
まとめ
PHPはPDOを用いてデータベースのプリコンパイル操作を行う場合,limit,order by,group byを用いたプリコンパイル処理をできるだけ避ける.バインド変数はできるだけ統一基準を使用します.そうしないと「?」を使用します.そうでなければ「:key」を使います.
 
役に立つコマンド、php 5にいます.1.*はテストを行って、テストが終わって、私はscpを通じてファイルをphp 5に転送します.2.*サーバ
scp -P9888 index.php [email protected]:/home/rentao