0

やあみんな私はここでこの小さな関数を実行しています

function getBeaches() {

$request=Slim::getInstance()->request();

$args=filter_var_array(func_get_args(),FILTER_SANITIZE_STRING); 
$sql="SELECT * FROM beaches WHERE state=:state AND city=:city"; 

    //  var_export($args); die();
    //  array ( 0 => 'wa', 1 => 'seattle', )

try {
    $db         = getConnection();
    $stmt       = $db->prepare($sql);


        $stmt->bindValue('state',   $args[0], PDO::PARAM_STR); //should bind wa 
        $stmt->bindValue('city',    $args[1], PDO::PARAM_STR); //should bind seattle
        $stmt->execute();

    $stmt       = $db->query($sql);
    $beaches    = $stmt->fetchObject();
    $db         = null;

    echo '{"map": ' . stripslashes(json_encode($beaches)) . '}';
} catch(PDOException $e) {
    echo '{"error":{"text":'. $e->getMessage() .'}}';
}

    /* {"error":{"text":SQLSTATE[42000]: Syntax error or access violation: 
     * 1064 You have an error in your SQL syntax; check the manual that  
     * corresponds to your MySQL server version for the right syntax to use 
     * near ':state AND city=:city' at line 1}}
     */

}

そして、私が下部にコメントしたエラーが発生し、このように実行しようとしています

mysql$ SELECT * FROM beaches WHERE state='wa' AND city='seattle';

これはいくつかの鐘を鳴らしているのでしょうか?

4

2 に答える 2

3

パラメータ名の前にセミコロンが必要です: (100%真ではない、編集を参照)

$stmt->bindValue(':state',   $args[0], PDO::PARAM_STR); //should bind wa 
$stmt->bindValue(':city',    $args[1], PDO::PARAM_STR); //should bind seattle

PDOStatement :: bindValue()のPHPドキュメントから:

パラメータ識別子。名前付きプレースホルダーを使用するプリペアドステートメントの場合、これは:nameの形式のパラメーター名になります。疑問符のプレースホルダーを使用して準備されたステートメントの場合、これはパラメーターの1インデックスの位置になります。

編集@jeroenが問題(ペーストビン内の同じ問題)を指摘しているので、変数からデータを取得する前に変数を上書きし ます$stmt。あなたのコードでは、問題は17行目あたりにあります。

$stmt->execute();  // $stmt now has query results (from the query with parameters bounded)

$stmt       = $db->query($sql); // You redo the query. Now $stmt has no query results and no parameters are bound
$beaches    = $stmt->fetchObject(); // Statement assumes you want to execute query and does so but not parameters are bound

上記の行を次のように変更することで、これを修正できます。

$stmt->execute();
$beaches = $stmt->fetchObject();
于 2012-07-17T00:45:59.327 に答える
0

それが役立つかどうかはわかりませんが、私はいつも使いbindParamすぎましたbindValue。そうすることを選択した場合は、バインダーを次のように変更します。

$stmt->bindParam(':state', $args[0], PDO::PARAM_STR);
$stmt->bindParam(':city', $args[1], PDO::PARAM_STR);

それ以外は、あなたがしていることはすべて私にはうまく見えます。

于 2012-07-17T00:52:58.807 に答える