Я хотел бы создать таблицу диспетчеризации, которая вызывает функцию для каждого параметра запроса.Это позволяет вам создать белый список безопасных параметров запроса.Я бы также использовал параметризованные операторы для защиты от внедрения SQL (то, от чего ваш существующий код не защищен). PDO упрощает использование параметризованных операторов.
Поначалу создание отдельной функции для каждого параметра запроса может показаться ненужным, но это означает, что вы можете поместить все свои условия в отдельный файл, сохраняяВаша основная функция запроса Tidy.Это также делает будущие усовершенствования более легкими для реализации.
Ниже приведен грубый пример.Он не предназначен для того, чтобы быть готовым вырезать и вставить в приложение.Это просто, чтобы дать вам представление о том, что я имею в виду.В реальном приложении, помимо прочего, вам необходимо включить проверку ошибок и, скорее всего, переместить соединение с базой данных в другое место.
// ** query_params.php **
function query_brand () {
return "brand = ?";
}
function query_price () {
return "price BETWEEN ? AND ?";
}
function query_category () {
return "category = ?";
}
// ** product_search.php **
function search () {
// Build a test GET array.
$_GET = array(
'brand' => 'HTC',
'price' => array(100, 200),
'category' => 'Android Mobiles'
);
// Build a dispatch table of safe query parameters.
$dispatch = array(
'brand' => 'query_brand',
'price' => 'query_price',
'category' => 'query_category'
);
// An array to hold the conditions.
$cond = array();
// An array to hold the bind values.
$bind = array();
foreach ( $_GET as $param => $value ) {
if( isset($dispatch[$param]) ) {
$cond[] = call_user_func( $dispatch[$param] );
$bind[] = $value;
}
}
$sql = "SELECT item, brand, price, category " .
"FROM products";
if( count($cond) ) {
// Combine the conditions into a string.
$where = implode( ' OR ', $cond );
$sql .= " WHERE $where";
}
// Use PDO to connect to the database. This should
// probably be done somewhere else.
$dbh = new PDO(
"mysql:host=localhost;dbname=$dbname", $user, $pass,
);
// Prepare the SQL statement.
$stmt = $dbh->prepare( $sql );
// Execute the statement, passing the values to be
// bound to the parameter placeholders.
$stmt->execute( $bind );
// Fetch and return results...
}