0

以下は、カスタムクラスの検索シナリオを処理するために設計された関数です。

PDOがデフォルトでパラメータを文字列としてバインドし、適切でない場合でも整数->文字列変換を引き起こすという事実にすでにつまずきました。ご覧のとおり、型が整数かどうかを手動でチェックし、その場合はintの使用を強制することで修正しました。問題は、私の解決策は「開始」値が0の場合にのみ機能することです。これより高いエラーが発生すると、理由がわかりません。開始/カウント値を適切な値に手動で設定した場合(つまり、:countの代わりに{$ count}を使用)、すべてが正常に機能するため、バインディングがまだ混乱しているように見えます。

どのように?または私が間違っている場合...何が正しいのですか?

    /*Query is:  
    SELECT tutor_school.id 
    FROM tutor_school, tutor_states 
    WHERE tutor_states.stateName=:state AND tutor_states.id=tutor_school.state 
    GROUP BY tutor_school.id order by tutor_school.name asc 
    LIMIT :start, :count*/

    $db = Database::get_user_db();
    $statement = $db->prepare($query);
    foreach ($executeArray as $key => $value)
    {
        if (getType($value) == 'integer')
        {
            $statement->bindParam($key, $executeArray[$key], PDO::PARAM_INT);
        }
        else
        {
            $statement->bindParam($key, $value);
        }
    }
    var_dump($executeArray);//count and start are still ints
    if ($statement->execute())
    {
        var_dump($executeArray);//start and count are now strings
        var_dump($statement->errorInfo());
        var_dump($query);
        $values = $statement->fetchAll();
        $return = array();
        foreach ($values as $row)
        {
            $school = School::schoolWithId($row[0]);
            if (!empty($school))
            {
                $return[] = $school;
            }
        }
        return $return;
    }
4

1 に答える 1

0

メタデータ (LIMIT引数など) はパラメーター化できません。代わりに (適切にサニタイズされた) 補間を使用する必要があります。

于 2012-07-17T04:58:37.147 に答える