|
|
|
| Всем привет!
Никак не могу придумать, как извлечь данные из MySql при отсутствии одной или нескольких переменных.
Допустим есть поисковая форма с необязательными полями в которой заносятся значения переменных. Если переменная пустая (не заполнено поле в форме) то необходимо извлекать строки без учета пустой переменной и так все возможные варианты:
<?php
$tip="куплю";
$gorod="Москва";
?>
|
Из базы данных необходимо извлечь строки с указанными переменными (если есть), естественно можно сделать так:
<?php
if (!empty ($tip) and !empty ($gorod))
{
$result = mysql_query("SELECT * FROM tablica WHERE tip='$tip' AND gorod='$gorod'",$db);
}
if (!empty ($tip) and empty ($gorod))
{
$result = mysql_query("SELECT * FROM tablica WHERE tip='$tip'",$db);
}
if (empty ($tip) and !empty ($gorod))
{
$result = mysql_query("SELECT * FROM tablica WHERE gorod='$gorod'",$db);
}
if (empty ($tip) and empty ($gorod))
{
$result = mysql_query("SELECT * FROM tablica",$db);
}
?>
|
Т.е. для двух полей формы, в которых могут быть заданы, а могут быть не заданы значения переменных необходимо написать 4 условия.
А в моём реальном примере 10 полей поисковой формы которые могут быть заполнены а возможно и нет, т.е. получается необходимо написать 100 возможных вариантов условий.
Можно ли в PHP сделать скрипт как то по проще??? | |
|
|
|
|
|
|
|
для: sega_z
(25.04.2011 в 23:11)
| | Обычно поступают так
<?php
$where = array();
if(!empty($tip)) $where[] = "tip='$tip'";
if(!empty($gorod)) $where[] = "gorod='$gorod'";
if(!empty($where))
$query = "SELECT * FROM tablica WHERE ".implode(" AND ", $where);
else
$query = "SELECT * FROM tablica";
$result = mysql_query($query, $db);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(25.04.2011 в 23:27)
| | Спасибо, большое за подсказку!!! | |
|
|
|
|
|
|
|
для: cheops
(25.04.2011 в 23:27)
| | Извините, но ваш скрипт не работает. Помогите найти ошибку!
Мне кажется здесь не хватает двойных ковычек, только не знаю куда их поставить:
$query = "SELECT * FROM tablica WHERE ".implode(" AND ", $where);
|
| |
|
|
|
|
|
|
|
для: sega_z
(03.05.2011 в 19:03)
| | А "не работа" в чем заключается? Выводится ли какое-то сообщение об ошибке? | |
|
|
|
|
|
|
|
для: cheops
(03.05.2011 в 19:07)
| | Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource | |
|
|
|
|
|
|
|
для: sega_z
(03.05.2011 в 19:09)
| | Дело в том, что PHP и MySQL это разные среды, чтобы получить ошибки одной среды в другой - их необходимо запрашивать явно и всякий раз, даже если запрос статический, лучше осуществлить проверку после вызова mysql_query(), иначе совершенно не понятно, что случилось и в чем проблема
<?php
$result = mysql_query($query, $db);
if(!$result) exit("Ошибка - ".mysql_error()."<br>".$query);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(03.05.2011 в 19:42)
| | Ошибка -
SELECT COUNT(*) FROM doska WHERE marka='Mercedes' | |
|
|
|
|
|
|
|
для: sega_z
(03.05.2011 в 19:48)
| | Хм... интересно, ошибки нет, но дескриптор не возвращается. Запрос тоже нормальный, я так понимаю, выполнение его в phpMyAdmin ошибок не вызывает? Остается дескриптор $db - он точно рабочий? | |
|
|
|
|
|
|
|
для: cheops
(03.05.2011 в 20:17)
| | Да, рабочий!!! | |
|
|
|
|
|
|
|
для: cheops
(03.05.2011 в 19:42)
| | А если в массиве $where будет только одна переменная, как быть тогда?
Ведь разделитель "AND" в этом случае будет не нужен.
$query1 = "SELECT * FROM doska WHERE ".implode(" AND ", $where);
|
| |
|
|
|
|
|
|
|
для: sega_z
(03.05.2011 в 19:57)
| | Он в этом случае и не появится. | |
|
|
|
|
|
|
|
для: cheops
(03.05.2011 в 20:15)
| | >Хм... интересно, ошибки нет, но дескриптор не возвращается. Запрос тоже нормальный, я так понимаю, выполнение его в phpMyAdmin ошибок не вызывает? Остается дескриптор $db - он точно рабочий?<
Да, дескриптор $db рабочий! | |
|
|
|
|
|
|
|
для: cheops
(03.05.2011 в 19:07)
| | Если это поможет, то вот весь скрипт, составленный мной на основании вашего кода:
<?php
$where = array();
if(!empty($tip)) $where[] = "tip='$tip'";
if(!empty($marka)) $where[] = "marka='$marka'";
if(!empty($model)) $where[] = "model='$model'";
if(!empty($dvizhok)) $where[] = "dvizhok='$dvizhok'";
if(!empty($year)) $where[] = "year='$year'";
if(!empty($probeg)) $where[] = "probeg='$probeg'";
if(!empty($ruly)) $where[] = "ruly='$ruly'";
if(!empty($korobka)) $where[] = "korobka='$korobka'";
if(!empty($region)) $where[] = "region='$region'";
if(!empty($gorod)) $where[] = "gorod='$gorod'";
//Постраничная навигация!
//Задаём число текстовых блоков на странице
$num = 20;
// Извлекаем из URL текущую страницу
@$page = $_GET['page'];
if(!empty($where))
{
$query = "SELECT COUNT(*) FROM doska WHERE ".implode(" AND ", $where);
}
else
{
$query = "SELECT COUNT(*) FROM doska";
$result00 = mysql_query($query, $db);
}
$temp = mysql_fetch_array($result00);
$posts = $temp[0];
// Находим общее число страниц
$total = (($posts - 1) / $num) + 1;
$total = intval($total);
// Определяем начало сообщений для текущей страницы
$page = intval($page);
// Если значение $page меньше единицы или отрицательно
// переходим на первую страницу
// А если слишком большое, то переходим на последнюю
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// Вычисляем начиная с какого номера
// следует выводить сообщения
$start = $page * $num - $num;
// Выбираем $num сообщений начиная с номера $start
if(!empty($where))
{
$query1 = "SELECT * FROM doska WHERE ".implode(" AND ", $where);
}
else
{
$query1 = "SELECT * FROM doska ORDER BY id DESC LIMIT $start, $num";
$result = mysql_query($query1, $db);
}
?>
|
И сервер пишет, что ошибка "Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in..." в строке:
$total = (($posts - 1) / $num) + 1;
|
| |
|
|
|
|
|
|
|
для: sega_z
(03.05.2011 в 19:19)
| | Ваще-то если глазками прочесть, то видно, что ВАЩЕ не в этой строчке ругается. А как минимум в
$temp = mysql_fetch_array($result00);
Ошибка значит то, что у вас НЕТ данных для фетча (м.б. result~a).
По крайней мере в коде лично я не вижу конекта к базе. А сразу ее использование. :)
Или что таблица пустая. Или запрос некорректен и возвращается 0 строк.
Данные таблицы имеют большое значение | |
|
|
|
|
|
|
|
для: Xenos
(03.05.2011 в 19:48)
| | Извиняюсь не прав, теперь видно что ошибка в конкретно в моём коде!!! | |
|
|
|
|
|
|
|
для: sega_z
(03.05.2011 в 19:51)
| | А как в это выражение:
$query1 = "SELECT * FROM doska WHERE ".implode(" AND ", $where);
|
добавить:
ORDER BY id DESC LIMIT $start, $num
|
| |
|
|
|
|
|
|
|
для: sega_z
(03.05.2011 в 19:54)
| | Брат, надо учить РНР.
:)
$query1 = "SELECT * FROM doska WHERE ".implode(" AND ", $where)." ORDER BY id DESC LIMIT $start, $num";
|
| |
|
|
|
|
|
|
|
для: Xenos
(03.05.2011 в 20:02)
| | Спасибо!
А если в массиве $where будет только одна переменная, как быть тогда?
Ведь разделитель "AND" в этом случае будет не нужен и сервер выдаст ошибку.
$query1 = "SELECT * FROM doska WHERE ".implode(" AND ", $where);
|
| |
|
|
|
|
|
|
|
для: Xenos
(03.05.2011 в 20:02)
| | Но почему ... выдается:
Ошибка -
SELECT COUNT(*) FROM doska WHERE tip='Продам'
|
У меня в таблице есть много записей с $tip="продам". | |
|
|
|
|
|
|
|
для: sega_z
(03.05.2011 в 20:18)
| | на мой взгля - нет подключения к базе, т.к. mysql_error = 0, если код описания ошибок испозован от cheops | |
|
|
|
|
|
|
|
для: sega_z
(03.05.2011 в 19:54)
| | так и добавить.
$query1 = "SELECT * FROM doska WHERE ".implode(" AND ", $where)." ORDER BY id DESC LIMIT $start, $num"; | |
|
|
|
|
|
|
|
для: sega_z
(03.05.2011 в 19:19)
| | А это полный код или тут намеренно исключен код установки соединения с базой данных? | |
|
|
|
|
|
|
|
для: cheops
(03.05.2011 в 20:31)
| | Я ему уже сказал об этом... Дважды ))) | |
|
|
|
|
|
|
|
для: cheops
(03.05.2011 в 20:31)
| | Нет это не полный код и при отсутствии всех переменных выводятся все записи из таблицы (как и полагается) | |
|
|
|
|
|
|
|
для: sega_z
(03.05.2011 в 20:40)
| | А не может быть такого, что вы в этом файле забыли вызывать фрагмент кода, который устанавливает соединение с базой данных, как предполагает Xenos. | |
|
|
|
|
|
|
|
для: cheops
(03.05.2011 в 20:42)
| | Я ещё раз повторяю - при пустой $where выводятся все записи из таблицы (как и полагается) | |
|
|
|
|
|
|
|
для: sega_z
(03.05.2011 в 20:49)
| | Возьмите следующий запрос и выполните его в phpMyAdmin - он выполняется нормально?
SELECT COUNT(*) FROM doska WHERE tip='Продам'
|
| |
|
|
|
|
|
|
|
для: cheops
(03.05.2011 в 20:51)
| | Ошибка -
SELECT COUNT(*) FROM doska WHERE tip='Продам' | |
|
|
|
|
|
|
|
для: sega_z
(03.05.2011 в 20:57)
| | Нет, а если взять phpMyAdmin выбрать базу данных с таблицей doska и выполнить запрос в нем? Или это его ответ? | |
|
|
|
|
|
|
|
для: cheops
(03.05.2011 в 21:00)
| | Вот такой запрос сработал нормально и выдал все сообщения типа "Продам":
<?php
$where = array();
if(!empty($tip)) $where[] = "tip='$tip'";
if(!empty($marka)) $where[] = "marka='$marka'";
if(!empty($model)) $where[] = "model='$model'";
if(!empty($dvizhok)) $where[] = "dvizhok='$dvizhok'";
if(!empty($year)) $where[] = "year='$year'";
if(!empty($probeg)) $where[] = "probeg='$probeg'";
if(!empty($ruly)) $where[] = "ruly='$ruly'";
if(!empty($korobka)) $where[] = "korobka='$korobka'";
if(!empty($region)) $where[] = "region='$region'";
if(!empty($gorod)) $where[] = "gorod='$gorod'";
//Постраничная навигация!
//Задаём число текстовых блоков на странице
$num = 20;
// Извлекаем из URL текущую страницу
@$page = $_GET['page'];
$result00 = mysql_query("SELECT COUNT(*) FROM doska WHERE tip='Продам'");
$temp = mysql_fetch_array($result00);
$posts = $temp[0];
// Находим общее число страниц
$total = (($posts - 1) / $num) + 1;
$total = intval($total);
// Определяем начало сообщений для текущей страницы
$page = intval($page);
// Если значение $page меньше единицы или отрицательно
// переходим на первую страницу
// А если слишком большое, то переходим на последнюю
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// Вычисляем начиная с какого номера
// следует выводить сообщения
$start = $page * $num - $num;
// Выбираем $num сообщений начиная с номера $start
$result = mysql_query("SELECT * FROM doska WHERE tip='Продам'",$db);
?>
|
Все это на локальном сервере.
Мне кажется у этой строки нет закрывающей ковычки:
$query = "SELECT COUNT(*) FROM doska WHERE ".implode(" AND ", $where);
|
| |
|
|
|
|
|
|
|
для: sega_z
(03.05.2011 в 21:07)
| | Куда все подевались?
Без выходных ситуаций не бывает!!! | |
|
|
|
|
|
|
|
для: sega_z
(03.05.2011 в 21:07)
| | Проблема в чем-то другом, вот два запроса - один выводит сообщение об ошибке (т.е. формируется при помощи implode), другой, вы с успехом использовали - они идентичны.
SELECT COUNT(*) FROM doska WHERE tip='Продам'
SELECT COUNT(*) FROM doska WHERE tip='Продам'
|
| |
|
|
|
|
|
|
|
для: cheops
(03.05.2011 в 22:02)
| | Но в чем... !? | |
|
|
|
|
|
|
|
для: sega_z
(03.05.2011 в 22:06)
| | Вот этот блок
<?php
if(!empty($where))
{
$query = "SELECT COUNT(*) FROM doska WHERE ".implode(" AND ", $where);
}
else
{
$query = "SELECT COUNT(*) FROM doska";
$result00 = mysql_query($query, $db);
}
?>
| исправьте следующим образом
<?php
if(!empty($where))
{
$query = "SELECT COUNT(*) FROM doska WHERE ".implode(" AND ", $where);
}
else
{
$query = "SELECT COUNT(*) FROM doska";
}
$result00 = mysql_query($query, $db);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(03.05.2011 в 22:08)
| | Истину глаголите, сударь!!!
Но так же нужно сделать и в этом блоке:
if(!empty($where))
{
$query1 = "SELECT * FROM doska WHERE ".implode(" AND ", $where)." ORDER BY id DESC LIMIT $start, $num";
}
else
{
$query1 = "SELECT * FROM doska ORDER BY id DESC LIMIT $start, $num";
}
$result = mysql_query($query1, $db);
|
И тогда всё заработало!!!
Но по данной теме есть ещё один нюанс... | |
|
|
|
|
|
|
|
для: sega_z
(03.05.2011 в 22:18)
| | Хорошо, что нашли ошибку!!!
Кто ищет - тот всегда найдет!
Спасибо!
Возможно у меня будут ещё вопросы по данной теме. | |
|
|
|
|
|
|
|
для: sega_z
(03.05.2011 в 22:35)
| | Возьмите следующее условие
gorod LIKE '%$goroda%' AND (zagolovok LIKE '%$arr[0]%' OR text_obyavl LIKE '%$arr[0]%')
|
и просто добавьте его в один из элементов массива $where и оно автоматически встроется в SQL-запрос. | |
|
|
|
|
|
|
|
для: cheops
(03.05.2011 в 22:43)
| | Подскажите, пожалуйста, как в вышеупомянутый код добавить условие, чтобы при не пустой $model извлекались все строки, где поле "model" меньше или равно $model, а остальные остаются без изменения.
<?php
$where = array();
if(!empty($tip)) $where[] = "tip='$tip'";
if(!empty($marka)) $where[] = "marka='$marka'";
if(!empty($model)) $where[] = "model='$model'";
if(!empty($dvizhok)) $where[] = "dvizhok='$dvizhok'";
if(!empty($year)) $where[] = "year='$year'";
if(!empty($probeg)) $where[] = "probeg='$probeg'";
if(!empty($ruly)) $where[] = "ruly='$ruly'";
if(!empty($korobka)) $where[] = "korobka='$korobka'";
if(!empty($region)) $where[] = "region='$region'";
if(!empty($gorod)) $where[] = "gorod='$gorod'";
//Постраничная навигация!
//Задаём число текстовых блоков на странице
$num = 20;
// Извлекаем из URL текущую страницу
@$page = $_GET['page'];
if(!empty($where))
{
$query = "SELECT COUNT(*) FROM doska WHERE ".implode(" AND ", $where);
}
else
{
$query = "SELECT COUNT(*) FROM doska";
}
$result00 = mysql_query($query, $db);
$temp = mysql_fetch_array($result00);
$posts = $temp[0];
// Находим общее число страниц
$total = (($posts - 1) / $num) + 1;
$total = intval($total);
// Определяем начало сообщений для текущей страницы
$page = intval($page);
// Если значение $page меньше единицы или отрицательно
// переходим на первую страницу
// А если слишком большое, то переходим на последнюю
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// Вычисляем начиная с какого номера
// следует выводить сообщения
$start = $page * $num - $num;
// Выбираем $num сообщений начиная с номера $start
if(!empty($where))
{
$query1 = "SELECT * FROM doska WHERE ".implode(" AND ", $where)." ORDER BY id DESC LIMIT $start, $num";
}
else
{
$query1 = "SELECT * FROM doska ORDER BY id DESC LIMIT $start, $num";
}
$result = mysql_query($query1, $db);
?>
|
| |
|
|
|
|
|
|
|
для: sega_z
(05.05.2011 в 17:00)
| |
if(!empty($model)) $where[] = "model<='$model'";
|
| |
|
|
|
|
|
|
|
для: Lotanaen
(05.05.2011 в 17:18)
| | Сейчас попробую... | |
|
|
|
|
|
|
|
для: sega_z
(05.05.2011 в 17:25)
| | А может ли это условие работать на числах в поле varchar (250)? | |
|
|
|
|
|
|
|
для: sega_z
(05.05.2011 в 17:29)
| | условие будет работать, но цифры будут восприниматься как символы, а не числа | |
|
|
|
|
|
|
|
для: Lotanaen
(05.05.2011 в 17:33)
| | А вообще возможно ли сделать отбор цифр в поле varchar (250) или нет?
И удалится ли информация из поля, если я изменю тип varchar (250) на тип "int"? | |
|
|
|
|
|
|
|
для: sega_z
(05.05.2011 в 17:37)
| | для корректной смены типа я бы поступил следующим образом:
-создал в таблице новое поле типа int
-небольшой скрипт для переноса из поля varchar в поле int
-удаляем старое поле varchar
- переименовываем поле int | |
|
|
|
|
|
|
|
для: Lotanaen
(05.05.2011 в 17:56)
| | Блин, вот я раньше не подумал об этом!!! Теперь это действующая база данных с 7000 записей и в поле varchar (250) есть и только цифры и только буквы и буквы с цифрами.
А что будет, если просто изменить тип???
Самое главное, чтобы остались только цифры! | |
|
|
|
|
|
|
|
для: Lotanaen
(05.05.2011 в 17:18)
| | Никак не могу придумать, как в этот код:
$where = array();
if(!empty($tip)) $where[] = "tip='$tip'";
if(!empty($marka)) $where[] = "marka='$marka'";
if(!empty($model)) $where[] = "model='$model'";
if(!empty($dvizhok)) $where[] = "dvizhok='$dvizhok'";
if(!empty($year)) $where[] = "year='$year'";
if(!empty($probeg)) $where[] = "probeg<='$probeg'";
if(!empty($ruly)) $where[] = "ruly='$ruly'";
if(!empty($korobka)) $where[] = "korobka='$korobka'";
if(!empty($region)) $where[] = "region='$region'";
if(!empty($gorod)) $where[] = "gorod='$gorod'";
//Постраничная навигация!
//Задаём число текстовых блоков на странице
$num = 20;
// Извлекаем из URL текущую страницу
@$page = $_GET['page'];
if(!empty($where))
{
$query = "SELECT COUNT(*) FROM doska WHERE ".implode(" AND ", $where);
}
else
{
$query = "SELECT COUNT(*) FROM doska";
}
$result00 = mysql_query($query, $db);
$temp = mysql_fetch_array($result00);
$posts = $temp[0];
// Находим общее число страниц
$total = (($posts - 1) / $num) + 1;
$total = intval($total);
// Определяем начало сообщений для текущей страницы
$page = intval($page);
// Если значение $page меньше единицы или отрицательно
// переходим на первую страницу
// А если слишком большое, то переходим на последнюю
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// Вычисляем начиная с какого номера
// следует выводить сообщения
$start = $page * $num - $num;
// Выбираем $num сообщений начиная с номера $start
if(!empty($where))
{
$query1 = "SELECT * FROM doska WHERE ".implode(" AND ", $where)." ORDER BY id DESC LIMIT $start, $num";
}
else
{
$query1 = "SELECT * FROM doska ORDER BY id DESC LIMIT $start, $num";
}
$result = mysql_query($query1, $db);
|
Вставить условие для всех существующих переменных:
WHERE podrazd='Легковые автомобили'
|
| |
|
|
|
|
|
|
|
для: sega_z
(05.05.2011 в 17:33)
| | Я просто забыл изначально сказать об этом условии WHERE podrazd='Легковые автомобили', и думаю почему выводятся все данные. | |
|
|
|
|
|
|
|
для: sega_z
(05.05.2011 в 17:33)
| | да просто добавить в скрипт
$where[] = "podrazd='Легковые автомобили'";
| для удобства чтения сразу после $where = array(); | |
|
|
|