Сортировка публикаций по данным из формы. Ошибка при запросе в базу данных (RedBeanPHP)
Нужно сделать сортировку публикаций по данным, которые получены из формы.
Получаю вот такую ошибку:
Fatal error: Uncaught [42000] - SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'sity = 'sity2' make = 'make3' model = 'model4' volume = '' mileage = '' numOfOwn' at line 1 trace: #0 D:\PHP\OSPanel\domains\test\libs\rb.php(1080): RedBeanPHP\Driver\RPDO->runQuery('SELECT * FROM p...', Array) #1 D:\PHP\OSPanel\domains\test\libs\rb.php(4245): RedBeanPHP\Driver\RPDO->GetAll('SELECT * FROM p...', Array) #2 D:\PHP\OSPanel\domains\test\libs\rb.php(12311): RedBeanPHP\Adapter\DBAdapter->get('SELECT * FROM p...', Array) #3 D:\PHP\OSPanel\domains\test\libs\rb.php(13324): RedBeanPHP\Facade::query('get', 'SELECT * FROM p...', Array) #4 D:\PHP\OSPanel\domains\test\index.php(31): RedBeanPHP\Facade::getAll('SELECT * FROM p...', Array) #5 {main} thrown in D:\PHP\OSPanel\domains\test\libs\rb.php on line 810
Вот сама форма(в index.php):
<form class="search_form">
<select name="region">
<option value="none" hidden="">Выберите область</option>
<option value="region1">Область№1</option>
<option value="region2">Область№2</option>
<option value="region3">Область№3</option>
<option value="region4">Область№4</option>
</select>
<select name="sity">
<option value="none" hidden="">Выберите город</option>
<option value="sity1">Город№1</option>
<option value="sity2">Город№2</option>
<option value="sity3">Город№3</option>
<option value="sity4">Город№4</option>
</select>
<select name="make">
<option value="none" hidden="">Выберите марку</option>
<option value="make1">Марка№1</option>
<option value="make2">Марка№2</option>
<option value="make3">Марка№3</option>
<option value="make4">Марка№4</option>
</select>
<select name="model">
<option value="none" hidden="">Выберите модель</option>
<option value="model1">Модель№1</option>
<option value="model2">Модель№2</option>
<option value="model3">Модель№3</option>
<option value="model4">Модель№4</option>
</select>
<input type="number" name="volume" min="0" step="any" placeholder="Введите объем двигателя">
<input type="number" name="mileage" min="0" placeholder="Введите пробег автомобиля">
<input type="number" name="numOfOwners" min="0" placeholder="Введите количество хозяев">
<button type="submit" class="btn btn-warning">Найти</button>
</form>
index.php:
$sql = "SELECT * FROM publication";
if(!empty($data)){
$sql .=" WHERE";
$bindings = [];
$i = 0;
foreach ($data as $key => $value) {
$bindings[$i] = $value;
$i++;
if($data->next){
$sql .= " $key = ? AND";
}else{
$sql .=" $key = ?";
}
}
$publications = R::getAll($sql, $bindings);
exit(json_encode($publications));
}else{
$publications = R::findAll('publication', "ORDER BY `id` DESC LIMIT ?, ?", array($from, $publication_on_page));
}
main.js:
$('.search-btn').click(function (e){
e.preventDefault();
let region = $('select[name="region"]').val(),
sity = $('select[name="sity"]').val(),
make = $('select[name="make"]').val(),
model = $('select[name="model"]').val(),
volume = $('input[name="volume"]').val(),
mileage = $('input[name="mileage"]').val(),
numOfOwners = $('input[name="mileage"]').val();
let formData = new FormData();
if(region != 'none'){
formData.append('region', region);
}
if(sity != 'none'){
formData.append('sity', sity);
}
if(make != 'none'){
formData.append('make', make);
}
if(model != 'none'){
formData.append('model', model);
}
if(volume != ''){
formData.append('volume', volume);
}
if(mileage != ''){
formData.append('mileage', mileage);
}
if(numOfOwners != ''){
formData.append('numOfOwners', numOfOwners);
}
$.ajax({
url: 'index.php',
type: 'GET',
dataType: 'json',
processData: false,
contentType: false,
cache: false,
data: formData,
success (data) {
$("#publ").html('');
for(value in data){
$("#publ").append(
'<div class="col-md-6" style="background-color: red;">' + data[value]['id'] + '</div>'
);
}
}
});
});
Подскажите, пожалуйста, как это пофиксить.
Ответы (1 шт):
$data->next здесь не работает(поскольку $data - массив). Вот решение:
$sql = "SELECT * FROM publication";
if(!empty($data)){
$filters = [];
$bindings = [];
foreach ($data as $key => $value){
$bindings[] = $value;
$filters[] = "$key = ?";
}
$sql .= ' WHERE ' . implode(' AND ', $filters);
$publications = R::getAll($sql, $bindings);
exit(json_encode($publications));
}else{
$publications = R::findAll('publication', "ORDER BY `id` DESC LIMIT ?, ?", array($from, $publication_on_page));
}