3

pdo からのこの予期しない動作に当惑しています。

私が書いたこの簡単なクエリを考えてみましょう:

    $username = "vidhu";
    $numResults = 10;

    $db_vc = new PDO(DB_ADDRESS, DB_USER, DB_PASS);
    $stmt = $db_vc->prepare("SELECT username, email FROM users WHERE username = :username LIMIT :numResults");
    $stmt->bindParam(':username', $username, PDO::PARAM_STR);
    $stmt->bindParam(':numResults', $numResults, PDO::PARAM_INT);
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    print_r($result);

これにより、期待される出力が得られます。

Array ( [0] => Array ( [username] => vidhu [email] => someone@gmail.com) )

ここで私を困惑させます。クエリを正確にコピーして貼り付けると、

    $username = "vidhu";
    $numResults = 10;       
    $db_vc = new PDO(DB_ADDRESS, DB_USER, DB_PASS);
    $stmt = $db_vc->prepare("SELECT username, email FROM users WHERE username = :username LIMIT :numResults");
    $stmt->bindParam(':username', $username, PDO::PARAM_STR);
    $stmt->bindParam(':numResults', $numResults, PDO::PARAM_INT);
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    print_r($result);

    echo "<br />";        

    $username = "vidhu";
    $numResults = 10;   
    $db_vc = new PDO(DB_ADDRESS, DB_USER, DB_PASS);
    $stmt = $db_vc->prepare("SELECT username, email FROM users WHERE username = :username LIMIT :numResults");
    $stmt->bindParam(':username', $username, PDO::PARAM_STR);
    $stmt->bindParam(':numResults', $numResults, PDO::PARAM_INT);
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    print_r($result);

出力も複製されると思いますか?以下のようなので:

Array ( [0] => Array ( [username] => vidhu [email] => someone@gmail.com ) )
Array ( [0] => Array ( [username] => vidhu [email] => someone@gmail.com) )

しかし、それはその出力を生成しません!. 2 番目のクエリは、次のように表示されるものを返しません。

Array ( [0] => Array ( [username] => vidhu [email] => xx.vidhuxx@gmail.com ) ) 
Array ( )

どうしてこれなの?誰か説明できますか?


編集

オリジナルとコピーの両方でパラメーターを削除:numResultsし、クエリで 10 をハードコードすると、完全に機能します!

4

1 に答える 1

0

わかりましたので、問題を発見したと思います。

私が追加した最初のコピーと2番目のコピーの間var_dump($numResults)。ページが読み込まれると、クエリの最初のコピーが実行された後、変数が文字列に変換されたことが示されます。なぜそれが起こるのか本当にわかりません。

Array ( [0] => Array ( [username] => vidhu [email] => someone@gmail.com ) ) 
string(2) "10" 
Array ( )

だから私がそれを修正した方法は、私が$stmt->bindParam使用したものを使用する代わりに$stmt->bindValue 、メカニズムや何が起こっているのかわかりませんが、うまくいきます。

このタイプの動作が発生する理由、つまり変数が整数から文字列に変更される理由を誰かが説明できればいいでしょう。

于 2012-12-15T23:39:27.270 に答える