Код будет выглядеть следующим образом:
$sql = 'SELECT * FROM TABLE WHERE ';
$first = true;
foreach($_POST as $paramName => $value) {
if ($first) {
$sql .= "{$paramName}='{$value}'";
$first = false;
continue;
}
$sql .= " AND {$paramName}='{$value}'";
}
Поскольку $ _POST - это массив входящих переменных, вы можете go через него с помощью простого цикла foreach и присоединить его к SQL Строка запроса. Первый возможный параметр не будет нуждаться в операторе AND, поэтому вам придется обрабатывать его по-другому, поэтому переменная $first
предназначена для.
Однако этот код имеет SQL уязвимости инъекций, поэтому лучше прикрепить имя параметра и значение в строке SQL, например:
$sql .= ' AND ' . mysqli_real_escape_string($connection, htmlspecialchars($paramName)) . "='" . mysqli_real_escape_string($connection, htmlspecialchars($value)) . "'";
Вы также получите пустые значения, которые вы не хотели бы присоединять к строке запроса SQL. Таким образом, окончательный код также должен обработать это, и после небольшого форматирования он будет выглядеть так:
$sql = 'SELECT * FROM TABLE WHERE ';
$first = true;
foreach($_POST as $paramName => $value) {
$protectedParamName = mysqli_real_escape_string($connection, htmlspecialchars($paramName));
$protectedValue = mysqli_real_escape_string($connection, htmlspecialchars($value));
if (empty($value)) {
continue;
}
if ($first) {
$sql .= "{$protectedParamName}='{$protectedValue}'";
$first = false;
continue;
}
$sql .= " AND {$protectedParamName}='{$protectedValue}'";
}
В этом примере переменная $connection
является объектом mysqli:
$connection = new mysqli(
$dbConfig['host'],
$dbConfig['user'],
$dbConfig['password'],
$dbConfig['databaseName'],
$dbConfig['port']
);
foreach($_POST as $paramName => $value)
проходит по всем значениям массива $ _POST, поэтому, если вы не хотите, чтобы некоторые поля использовались в запросе SQL, вы можете использовать фильтрацию черного списка, где вы указываете, если $ paramName находится в черном списке, то вы не будете прикреплять его к запросу SQL.
Например:
$blackList = [
'action'
];
foreach($_POST as $paramName => $value) {
if (in_array($paramName, $blackList)) {
continue;
}
}