2013-08-16 4 views
-1

Поскольку я был доволен до моего сведения, что мой сайт был уязвим для атаки SQL-инъекций, я перешел от использования стандартного протокола подключения mysqli к PDO.Что не так с моим подготовленным заявлением PDO?

Поскольку строительство новых скриптов соединения и запросов я постоянно выброшен этой ошибке

Предупреждения: PDOStatement :: Execute(): SQLSTATE [HY093]: Неверный номер параметра: параметр не был определен в D: \ wamp \ www \ Kerr Pumps \ includes \ product_data.php on line 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 и, вероятно, пропустил что-то простое, любая обратная связь или указатели будут высоко оценили, спасибо-вам.

+0

В массиве, что вы передаете для 'execute', вам нужно указать ключи с тем же именем, что и параметры, включая начальный двоеточие. Итак, первый должен быть ': pType' и т. Д. – andrewsi

+0

Ahh Я вижу, это имеет смысл! Дурак я. – Alex

ответ

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 
+0

Спасибо, первый раз, используя PDO. Мне казалось, что мне нужно передать имена полей клавишам! – Alex

Смежные вопросы