Я делаю сайт с функцией поиска с базой данных, на которой работает 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)}