Подготовленные операторы MySQLi выбирают не получение результата без ошибок

Я пытаюсь создать простой расширенный поиск с помощью 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;

Вы уверены, что правильно используете LIKE? Разве вы не должны передавать что-то в следующую строку, а не только в %.

Script47 07.06.2018 03:20

@ Script47 я пытаюсь игнорировать его, если он не выбран в раскрывающемся списке выбора HTML

belal 07.06.2018 03:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Заполнитель ? заменяется связанным значением и экранируется. Так что ваши

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, $ descrip‌tion_preview); $ count_search = mysqli_stmt_num_rows ($ stmt_search);

belal 07.06.2018 04:53

это мой код, который нужно выполнить, но, к сожалению, он не работает ... я попытаюсь заставить его работать с call_user_func_array

belal 07.06.2018 04:54

Большое спасибо

belal 07.06.2018 04:54

Да, к сожалению, mysqli_stmt_bind_param не поддерживает массивы. Похоже, твой собственный правильный путь. Удачи. Также больше не используйте mysqli_real_escape_string. С параметризованными запросами, которые могут выглядеть странно, потому что вы будете дважды экранировать.

user3783243 07.06.2018 04:57

о, спасибо, я удалю его сразу .. по поводу выполнения .. Я попробовал с ... operator ("spread operator"), и он работал нормально! но, к сожалению, когда min_bedrooms_final имеет значение с номером, выполнение завершилось неудачно ... я сейчас выясняю ... и вы забыли добавить тип s в каждом условии ... я не знаю, правильно ли я делаю ... мог Вы, пожалуйста, посмотрите на это и скажите мне, все ли в порядке .. Я опубликую, что это за код сейчас и как он работал, благодаря вам и вашему шаблону .. Большое спасибо

belal 07.06.2018 05:24

Может быть, перебрать массив и создать цепочку из i и s. Первый параметр должен быть строкой всех типов данных. Вы должны использовать i для целых чисел.

user3783243 07.06.2018 05:29

ooooooh yeaaah, я забыл целочисленный тип .. Большое спасибо .. вы действительно спасли мне день .. Спасибо .. еще раз большое спасибо

belal 07.06.2018 05:31

Другие вопросы по теме