Как использовать функцию sqlsrv_prepare - PullRequest
0 голосов
/ 04 мая 2018

Я делаю сайт с функцией поиска с базой данных, на которой работает SQL-сервер. Таким образом, я решил использовать функции sqlsrv для использования базы данных. Поскольку я хочу обезопасить свой php-код от атак SQL-инъекций, я решил использовать функцию sqlsrv_prepare, как предложил один из сотрудников stackoverflower. Моя проблема заключается в том, что я не могу обернуть голову вокруг функции. Это мой php-код, который я сделал с помощью примера и заметок с php.net.

    <?php
$search = $_POST["search"];
$search = "%$search%";
$sql = "SELECT table1.column1, table1.column2, table1.column3, table2.column1, table2.column2
        FROM table1
        INNER JOIN table2 ON table1.column1 = table2.column3
        WHERE column1 LIKE ?
        ORDER BY den_produs ASC";
$params= array(&$search);
var_dump($sql, $params);
$stmt = sqlsrv_prepare($conn, $sql, $params);
if( !$stmt ) {
    die( print_r( sqlsrv_errors(), true));
}

while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) { 
    if (sqlsrv_execute($stmt)) {
        echo $row['column1']."--> ".$row['column2']."--> ".$row['column3']."|| ".$row['column1'].$row['column2']."<br />";
    }
}
?>

По сути, у меня есть база данных с продуктами (поскольку это веб-сайт электронной коммерции), и я хочу искать названия продуктов. Код SQL работает (имена столбцов и таблиц были введены в общем, так как они имеют странные имена и являются длинными и ненужными), так как я проверил его при поиске непосредственно с помощью переменной $search (что, конечно, небезопасно). Спасибо за ваше время!

РЕДАКТИРОВАТЬ: Если я удаляю предложение WHERE, я получаю тот же результат, даже если я удаляю только первую часть или оба. Вывод var_dump:

введите cstring (425) "ВЫБЕРИТЕ table1.column1, table1.column2, table1.column3, table2.column1, table2.column2 FROM table1 INNER JOINtable2 ON table1.column1 = table2.column3 WHERE column4 = 'значение, данное мной' AND column1 LIKE? ORDER BY column1 ASC "array (2) {[0] => & string (12)"% searchtest% "[1] => int (4)}

1 Ответ

0 голосов
/ 07 мая 2018

После еще нескольких копаний я нашел сообщение на форуме Microsoft, в котором приведен лучший пример. Проблема заключалась в том, что после подготовки параметров я не выполнял SQL-код, как я предполагал при использовании параметров. Я также перестал использовать переменную для вызова массива. Вот рабочий код:

    <?php
        $search = $_POST["search"];
        $search = "%$search%";
        $sql = "SELECT table1.column1, table1.column2, table1.column3, table2.column1, table2.column2
                FROM table1
                INNER JOIN table2 ON table1.column1 = table2.column3
                WHERE column1 LIKE ?
                ORDER BY den_produs ASC";
        $stmt = sqlsrv_prepare($conn, $sql, array($search));
        if( !$stmt ) {
            die( print_r( sqlsrv_errors(), true));
        }
        sqlsrv_execute($stmt);
    if(sqlsrv_execute($stmt)){
      while($row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)){
        echo $row['column1']."--> ".$row['column2']."--> ".$row['column3']."|| ".$row['column1'].$row['column2']."
";
      }
    }else{
      die( print_r( sqlsrv_errors(), true));
    } 
    ?>

Если у кого-то есть реальное объяснение относительно проблемы, я был бы более чем счастлив поставить его как одобренный ответ, так как я не знаю много php и sqlsrv.

...