9

コードサンプル

$query = $this->db->prepare( $sql );                  // prepare sql
$query->bindParam( 'start', $start, PDO::PARAM_INT ); // bind start
$query->bindParam( 'end', $end, PDO::PARAM_INT );     // bind end
$query->bindParam( 'language', $this->language );     // bind language
$query->bindValue( 'keyword', "%$keyword%" );         // bind keyword

var_dump( $end );
$query->execute();
var_dump( $end );

出力

int 2
string '2' (length=1)

しかし...バインドの順序を切り替えると...

$query = $this->db->prepare( $sql );                  // prepare sql
$query->bindParam( 'language', $this->language );     // bind language
$query->bindValue( 'keyword', "%$keyword%" );         // bind keyword
$query->bindParam( 'start', $start, PDO::PARAM_INT ); // bind start
$query->bindParam( 'end', $end, PDO::PARAM_INT );     // bind end

var_dump( $end );
$query->execute();
var_dump( $end );

出力

int 2
int 2

PHPバージョン:Windowsでは5.3.8

なぜこれが起こっているのか誰かが説明できますか?

4

3 に答える 3

1

ステートメントを準備するためのエミュレーションを回してみてください

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

于 2012-07-31T03:39:52.287 に答える
1

これをPHP 5.3.13でチェックしました-コードの2つのバージョンが私に与えます:

int 2
string '2' (length=1)

さらに、bindParam() の代わりに bindValue() を使用すると、2 つのバージョンのコードが得られます。

int 2
int 2

ps bindValue() で作業することを好み、bindParam() と混合しないことを好みます。bindParam() を使用してもパフォーマンスは向上しません。PHP の値渡しとポインタ渡しは C/C++ と同じように機能すると考える人もいますが、これは間違った考え方です。bindParam() を使用すると、発生時に見つけにくいバグが発生する可能性があります。

于 2015-03-30T17:11:23.650 に答える
-1

これは以前にも言われたことですが、心に留めておくことが重要だと思うので、それについてもメモを書きます。

PDO bindParam を使用して LIKE 条件で検索を行う場合、パーセンテージと引用符を param プレースホルダーに入れることはできません%:keyword%

これは間違っています:

"SELECT * FROM `users` WHERE `firstname` LIKE '%:keyword%'";

正しい解決策は、次のようにプレースホルダーをきれいなままにすることです。

"SELECT * FROM `users` WHERE `firstname` LIKE :keyword";

And then add the percentages to the php variable where you store the keyword:
$keyword = "%".$keyword."%";

最後に、クエリの実行時に引用符が PDO によって自動的に追加されるため、心配する必要はありません。

したがって、完全な例は次のようになります。

<?php
    // Get the keyword from query string
    $keyword = $_GET['keyword'];
    // Prepare the command
    $sth = $dbh->prepare('SELECT * FROM `users` WHERE `firstname` LIKE :keyword');
    // Put the percentage sing on the keyword
    $keyword = "%".$keyword."%";
    // Bind the parameter
    $sth->bindParam(':keyword', $keyword, PDO::PARAM_STR);
?>
于 2015-03-30T13:04:55.473 に答える