-1

私のサイトが SQL インジェクション攻撃に対して脆弱であることに気づいたので、標準の mysqli 接続プロトコルの使用から PDO に切り替えました。

新しい接続スクリプトとクエリ スクリプトを作成して以来、このエラーが継続的にスローされます

警告: PDOStatement::execute(): SQLSTATE[HY093]: 無効なパラメーター番号: パラメーターが D:\wamp\www\Kerr Pumps\includes\product_data.php 行 31 で定義されていません

また、他のフォーラムの投稿にアクセスしたにもかかわらず、問題の解決策を見つけることができませんでした.

// Get a list of all the pumps in the database
function get_pumps( $pType, $pVal, $gVal, $class_style ) {


    // PDO DB CONNECTION AS OF VERSION 1.1

    // Check whether correct data is passed into function...
    echo var_dump($pType);
    echo var_dump($pVal);
    echo var_dump($gVal);   

    // Local connection variables
    $db_user = "root";
    $db_pass = "root";

    // Connect to the database
    try 
    {
        $connection = new PDO('mysql:host=localhost;dbname=kerrpumps', $db_user, $db_pass );
        $stmt = $connection->prepare('SELECT * FROM pumps WHERE pump_type = :pType AND flow_psi = :pVal AND flow_gpm = :gVal AND high_psi = :pVal AND high_gpm = :gVal');
        $stmt->execute(array( 'pump_type' => $pVal, 
                              'flow_psi'  => $pVal, 
                              'flow_gpm'  => $gVal, 
                              'high_psi'  => $pVal, 
                              'high_gpi'  => $gVal ));

        $result = $stmt->fetchAll();

        // If there are results...
        if ( count($result) )
        {
            foreach($result as $row){
                $link = '#';
                echo '<tr onclick="'."$link; window.location='$link'".'" class="'.($class_style %2 == 0 ? "row_dark" : "row_light").'">';
                echo '<a href="#">';
                include("grid_data.php"); 
                echo '</a>';
                $class_style++;
                echo "</tr>"; 
            }
        }

        // Else there are no results which match the query...
        else {
            echo "<tr class='styleOff'>
                    <td class='styleOff'>We're sorry, but there are no pumps which fit the given search criteria. Please try again.</td>
                </tr>";
        }


    } 

    // Error handling
    catch(PDOException $e) {
       echo 'ERROR: ' . $e->getMessage();
    }

}

上で述べたように、私は PDO を初めて使用し、簡単なことを見逃している可能性があります。フィードバックや指針をいただければ幸いです。ありがとうございます。

4

1 に答える 1

2

呼び出しに渡す配列キー->execute()は、プレースホルダーが比較されているフィールドではなく、使用しているプレースホルダーの名前と一致する必要があります。

SELECT * FROM pumps WHERE pump_type = :pType AND flow_psi = :pVal AND flow_gpm = :gVal AND high_psi = :pVal AND high_gpm = :gVal
                                       ^^^^^---- use this instead

$stmt->execute(array('pType' => 'foo', ....));
                      ^^^^^--- use the placeholder name, NOT the field name
于 2013-08-16T15:15:13.260 に答える