Я пытаюсь создать простой расширенный поиск с помощью PHP, но не понимаю, почему он не дает никаких результатов! Он также не показывает никаких ошибок!
Я ищу со всеми невыполненными условиями, поэтому это будет примерно так:
SELECT id,img_url1,price,type,status_prop,title,bedrooms,bathrooms,garages,sqft,address,LEFT(description, 215) AS description_preview
FROM alreemisland
WHERE price BETWEEN 0 AND 10000000
and type like '%'
and status_prop like '%'
and bedrooms BETWEEN 0 and 9
and bathrooms BETWEEN 0 and 9
И я получил его правильно, так что это должно быть связано с моим кодом!
Вот мой код:
$type_search_final=mysqli_real_escape_string($con,$_POST['type_search']);
$status_prop_final=mysqli_real_escape_string($con,$_POST['status_prop']);
$min_bedrooms_final=mysqli_real_escape_string($con,$_POST['min_bedrooms']);
$min_bathrooms_final=mysqli_real_escape_string($con,$_POST['min_bathrooms']);
$min_price_final=mysqli_real_escape_string($con,$_POST['min_price']);
$max_price_final=mysqli_real_escape_string($con,$_POST['max_price']);
//============ For Pagination ============
if ($type_search_final){
$query_type_search_final .= "type LIKE '$type_search_final'";
}
else {$query_type_search_final = "type LIKE '%'";}
if ($status_prop_final){
$query_status_prop_final .= "status_prop LIKE '$status_prop_final'";
}
else {$query_status_prop_final = "status_prop LIKE '%'";}
if ($min_bedrooms_final){
$query_min_bedrooms_final .= "bedrooms BETWEEN $min_bedrooms_final and 9'";
}
else {$query_min_bedrooms_final = "bedrooms BETWEEN 0 and 9";}
if ($min_bathrooms_final){
$query_min_bathrooms_final .= "bathrooms BETWEEN $min_bathrooms_final and 9'";
}
else {$query_min_bathrooms_final = "bathrooms BETWEEN 0 and 9";}
$sql_search= "SELECT id,img_url1,price,type,status_prop,title,bedrooms,bathrooms,garages,sqft,address,LEFT(description, 215) AS description_preview FROM $from_section WHERE price BETWEEN $min_price_final AND $max_price_final and ? and ? and ? and ? order by id desc";
$stmt_search = mysqli_stmt_init ($con);
if (!mysqli_stmt_prepare($stmt_search,$sql_search)) {
echo "SQL FAILED";
}
else {
mysqli_stmt_bind_param($stmt_search, "ssss", $query_type_search_final,$query_status_prop_final,$query_min_bedrooms_final,$query_min_bathrooms_final);
mysqli_stmt_execute($stmt_search);
mysqli_stmt_store_result($stmt_search);
mysqli_stmt_bind_result($stmt_search, $id,$img_url1,$price,$type,$status_prop,$title,$bedrooms,$bathrooms,$garages,$sqft,$address,$description_preview);
$count_search = mysqli_stmt_num_rows($stmt_search);
}
$row_search= mysqli_stmt_fetch($stmt_search);
echo $row_search['img_url1'];
На самом деле это не лень, я искал по всему интернету и все перепробовал, но не могу заставить работать. Я знаю, что скучаю что-то, но я не мог знать часами. Итак, если бы второй глаз мог видеть то, что я не мог видеть, и указать мне, где я пропустил, я буду очень признателен.
РЕДАКТИРОВАТЬ: Я обновил свой код, но все равно ничего не получил!
$where = "price BETWEEN $min_price_final AND $max_price_final";
if ($type_search_final){
$where .= " and type LIKE $type_search_final";
}
if ($status_prop_final){
$where .= " and status_prop LIKE $status_prop_final'";
}
if ($min_bedrooms_final){
$where .= " and bedrooms BETWEEN $min_bedrooms_final and 9'";
}
if ($min_bathrooms_final){
$where .= " and bathrooms BETWEEN $min_bathrooms_final and 9'";
}
$sql_search= "SELECT id,img_url1,price,type,status_prop,title,bedrooms,bathrooms,garages,sqft,address,LEFT(description, 215) AS description_preview FROM $from_section where ? order by id desc";
$stmt_search = mysqli_stmt_init ($con);
if (!mysqli_stmt_prepare($stmt_search,$sql_search)) {
echo "SQL FAILED";
}
else {
mysqli_stmt_bind_param($stmt_search, "s", $where);
mysqli_stmt_execute($stmt_search);
mysqli_stmt_store_result($stmt_search);
mysqli_stmt_bind_result($stmt_search, $id,$img_url1,$price,$type,$status_prop,$title,$bedrooms,$bathrooms,$garages,$sqft,$address,$description_preview);
$count_search = mysqli_stmt_num_rows($stmt_search);
}
$row_search= mysqli_stmt_fetch($stmt_search);
echo $row_search['img_url1'];
ОБНОВЛЕНИЕ - Теперь это сработало .. это последний код:
$where = "price BETWEEN ? AND ?";
$params[] = $min_price_final;
$params[] = $max_price_final;
$type_string = "ss";
if ($type_search_final){
$where .= " and type LIKE ?";
$params[] = $type_search_final;
$type_string . = "s";
}
if ($status_prop_final){
$where .= " and status_prop LIKE ?";
$params[] = $status_prop_final;
$type_string . = "s";
}
if ($min_bedrooms_final){
$where .= " and bedrooms BETWEEN ? and 9'";
$params[] = $min_bedrooms_final;
$type_string . = "s";
}
if ($min_bathrooms_final){
$where .= " and bathrooms BETWEEN ? and 9";
$params[] = $min_bathrooms_final;
$type_string . = "s";
}
$sql_search= "SELECT id,img_url1,price,type,status_prop,title,bedrooms,bathrooms,garages,sqft,address,LEFT(description, 215) AS description_preview
FROM $from_section
where $where
order by id desc";
$stmt_search = mysqli_stmt_init ($con);
if (!mysqli_stmt_prepare($stmt_search,$sql_search)) {
echo "SQL FAILED";
}
else {
mysqli_stmt_bind_param($stmt_search,$type_string, ...$params);
mysqli_stmt_execute($stmt_search);
mysqli_stmt_store_result($stmt_search);
mysqli_stmt_bind_result($stmt_search, $id,$img_url1,$price,$type,$status_prop,$title,$bedrooms,$bathrooms,$garages,$sqft,$address,$description_preview);
$count_search = mysqli_stmt_num_rows($stmt_search);
}
$row_search= mysqli_stmt_fetch($stmt_search);
echo $img_url1.'<br>'.$type_string;
ОБНОВЛЕНИЕ # 2: я пропустил целочисленный тип в последних двух условиях, и я пропустил (') около 9
$where = "price BETWEEN ? AND ?";
$params[] = $min_price_final;
$params[] = $max_price_final;
$type_string = "ss";
if ($type_search_final){
$where .= " and type LIKE ?";
$params[] = $type_search_final;
$type_string . = "s";
}
if ($status_prop_final){
$where .= " and status_prop LIKE ?";
$params[] = $status_prop_final;
$type_string . = "s";
}
if ($min_bedrooms_final){
$where .= " and bedrooms BETWEEN ? and 9";
$params[] = $min_bedrooms_final;
$type_string . = "i";
}
if ($min_bathrooms_final){
$where .= " and bathrooms BETWEEN ? and 9";
$params[] = $min_bathrooms_final;
$type_string . = "i";
}
$sql_search= "SELECT id,img_url1,price,type,status_prop,title,bedrooms,bathrooms,garages,sqft,address,LEFT(description, 215) AS description_preview
FROM $from_section
where $where
order by id desc";
$stmt_search = mysqli_stmt_init ($con);
if (!mysqli_stmt_prepare($stmt_search,$sql_search)) {
echo "SQL FAILED";
}
else {
mysqli_stmt_bind_param($stmt_search,$type_string, ...$params);
mysqli_stmt_execute($stmt_search);
mysqli_stmt_store_result($stmt_search);
mysqli_stmt_bind_result($stmt_search, $id,$img_url1,$price,$type,$status_prop,$title,$bedrooms,$bathrooms,$garages,$sqft,$address,$description_preview);
$count_search = mysqli_stmt_num_rows($stmt_search);
}
$row_search= mysqli_stmt_fetch($stmt_search);
echo $img_url1.'<br>'.$type_string;
@ Script47 я пытаюсь игнорировать его, если он не выбран в раскрывающемся списке выбора HTML






Заполнитель ? заменяется связанным значением и экранируется. Так что ваши
mysqli_stmt_bind_param($stmt_search, "s", $where);
просто будет привязать SQL как строку, а не как SQL. Вам нужно использовать заполнитель для каждого значения, а затем привязать каждое из них.
Ваш запрос в том виде, в каком он написан прямо сейчас, будет выглядеть примерно так:
SELECT id,img_url1,price,type,status_prop,title,bedrooms,bathrooms,garages,sqft,address,LEFT(description, 215) AS description_preview
FROM SomeTable
where 'price BETWEEN \'somevalue\' AND \'some other value\'' order by id desc
Поэтому вместо этого вы должны сделать что-то вроде:
$where = "price BETWEEN ? AND ?";
$params[] = $min_price_final;
$params[] = $max_price_final;
if ($type_search_final){
$where .= " and type LIKE ?";
$params[] = $type_search_final;
}
if ($status_prop_final){
$where .= " and status_prop LIKE ?";
$params[] = $status_prop_final;
}
if ($min_bedrooms_final){
$where .= " and bedrooms BETWEEN ? and 9'";
$params[] = $min_bedrooms_final;
}
if ($min_bathrooms_final){
$where .= " and bathrooms BETWEEN ? and 9";
$params[] = $min_bathrooms_final;
}
$sql_search= "SELECT id,img_url1,price,type,status_prop,title,bedrooms,bathrooms,garages,sqft,address,LEFT(description, 215) AS description_preview
FROM $from_section
where $where
order by id desc";
Вы должны использовать белый список для $from_section, чтобы он также был безопасным. Вы не можете привязать столбец / таблицу.
Затем вам просто нужно привязать все значения $params. С PDO это будет просто execute($params), с mysqli это сложнее.
Возможно, этот поток будет полезен для динамической привязки Как динамически связать аргументы mysqli bind_param в PHP?.
mysqli_stmt_bind_param ($ stmt_search, "ssssss", $ params); mysqli_stmt_execute ($ stmt_search); mysqli_stmt_store_result ($ stmt_search); mysqli_stmt_bind_result ($ stmt_search, $ id, $ img_url1, $ price, $ type, $ status_prop, $ title, $ bedroom, $ ba throoms, $ garages, $ sq ft, $ address, $ description_preview); $ count_search = mysqli_stmt_num_rows ($ stmt_search);
это мой код, который нужно выполнить, но, к сожалению, он не работает ... я попытаюсь заставить его работать с call_user_func_array
Большое спасибо
Да, к сожалению, mysqli_stmt_bind_param не поддерживает массивы. Похоже, твой собственный правильный путь. Удачи. Также больше не используйте mysqli_real_escape_string. С параметризованными запросами, которые могут выглядеть странно, потому что вы будете дважды экранировать.
о, спасибо, я удалю его сразу .. по поводу выполнения .. Я попробовал с ... operator ("spread operator"), и он работал нормально! но, к сожалению, когда min_bedrooms_final имеет значение с номером, выполнение завершилось неудачно ... я сейчас выясняю ... и вы забыли добавить тип s в каждом условии ... я не знаю, правильно ли я делаю ... мог Вы, пожалуйста, посмотрите на это и скажите мне, все ли в порядке .. Я опубликую, что это за код сейчас и как он работал, благодаря вам и вашему шаблону .. Большое спасибо
Может быть, перебрать массив и создать цепочку из i и s. Первый параметр должен быть строкой всех типов данных. Вы должны использовать i для целых чисел.
ooooooh yeaaah, я забыл целочисленный тип .. Большое спасибо .. вы действительно спасли мне день .. Спасибо .. еще раз большое спасибо
Вы уверены, что правильно используете
LIKE? Разве вы не должны передавать что-то в следующую строку, а не только в%.