Консультация № 175346
16.12.2009, 08:44
35.00 руб.
16.12.2009, 17:40
0 13 2
Здравствуйте Уважаемые эксперты! Я новичок в mysql. У меня есть база данных wwwammxru_ammx С таблицей Arenda и полями:

id
date
komnata
rain
adress
etazh
info
cena
telefon
dop_info


Как мне можно реализовать поиск по полю Цена (cena) или Pайон (rain) и правильно вывести на странице используя ниже приведенный код?
И как я могу в данный момент вывести постранично т.е Страница 1.2.3.4.5 и т.д с помощью какой функции по 10 записей постранично, ведь база большая и не удобно ее читать всю...

Приложение:
<?php

$db = mysql_connect("localhost","ammx","1111");
mysql_select_db("wwwammxru_ammx" ,$db);
//результирующий набор данных хранится в переменной $sql
$sql = mysql_query("SELECT * FROM Arenda " ,$db);
//после получения данных начнём формирование HTML-таблицы
echo ("<table border ='1'>");
//выводим строку заголовков
echo ("<tr> <td align="center"> Кол-во комнат</td> <td align="center"> Район</td> <td align="center">Адрес</td> <td align="center"> Описание</td> <td align="center"> Цена</td> <td align="center"> Телефон</td></tr></p>");
// сохраняет её в массиве $tablerows
while ($tablerows = mysql_fetch_row($sql))
{
//теперь в цикле для каждой полученной строки сделаем вывод
//$tablerows[1] соответствует полю "url"
//$tablerows[2] соответствует полю "description"
echo("<tr><td>$tablerows[2] </td><td>$tablerows[3]</td> <td>$tablerows[4]</td> <td>$tablerows[6]</td> <td>$tablerows[7]</td> <td>$tablerows[8]</td></b> </tr>");
}
echo "</table>";
mysql_close($db);
?>

Обсуждение

Неизвестный
16.12.2009, 18:08
общий
Добрый вечер.
Примерно так:

Код:
	
/*...где-то выше...*/
define('_MAXONPAGE', 10);
/*.................*/

$cena = 100; //для примера
$raion = 'Местный:)'; //для примера
$currentPage = 2; // для примера - текущая страница

$sqlLimit = $currentPage > 1 ? ' LIMIT '._MAXONPAGE : ' LIMIT '._MAXONPAGE * $currentPage.' OFFSET '._MAXONPAGE;


////Насколько я понял в поле район - строка а не id ?????? если строка то так:
$sql = mysql_query('SELECT * FROM Arenda WHERE cena = '.(int)$cena.' AND rain = "'.mysql_real_escape_string($raion).'" ');
////если все-таки id - то так:
$sql = mysql_query('SELECT * FROM Arenda WHERE cena = '.(int)$cena.' AND rain = '.(int)$raion.' ');


/*
так вы получите записи изначально только для текущей страницы. нес смысла забирать все записи и разбивать их затем в пхп.
далее в цыкле вы выводите записи текущей страницы и отрисовываете ссылки для навигаци и по страницам. Значения cena, raion $currentPage
можете брать из $_GET или $_POST соответственно - завсисит от того для чего оно вам надо.
*/

echo ("<table border ='1'>");
echo ("<tr> <td align="center"> Кол-во комнат</td> <td align="center"> Район</td> <td align="center">Адрес</td> <td align="center"> Описание</td> <td align="center"> Цена</td> <td align="center"> Телефон</td></tr></p>");
//mysql_fetch_assoc кстати использовать удонее :)
while ($tablerows = mysql_fetch_row($sql)){
echo("<tr><td>$tablerows[2] </td><td>$tablerows[3]</td> <td>$tablerows[4]</td> <td>$tablerows[6]</td> <td>$tablerows[7]</td> <td>$tablerows[8]</td></b> </tr>");
}
echo "</table>";

Если что-то не понятно - пишите... Хотя я все упростил аж до нельзя...
Неизвестный
17.12.2009, 00:06
общий
17.12.2009, 00:50
это ответ
Здравствуйте, Т. Павел Анатольевич.
C помощью оператора LIKE попробуйте.
$like = ....; // через GET или POST задаем слово поиска

$db = mysql_connect("localhost","ammx","1111");
mysql_select_db("wwwammxru_ammx" ,$db);
$sql = mysql_query("select * from Arenda WHERE cena AND rain like '%$like%'") oк die ("Error!"); // получаем массив данных
if((mysql_num_rows($sql)<=0))
{
echo ("Ни чего не найдено!");
}else{
while ($while = mysql_fetch_array($sql )) // формируем список и выводим его как удобно
{
echo ("Данные ".$while [date] ." - дата");
};
mysql_free_result ($sql);
};

Конструкцию mysql_fetch_row лучше заменить на mysql_fetch_array, это позволит создать "именованный" массив в котором к полю удобнее и проще обращаться через его имя $while [date] вместо $while [2], к тому же добавление нового поля где нибудь в центре избавит вас от переписки кода ибо числовые индексы собьются.

Возможно будут проблемы с кодировкой.

Про постраничный вывод можно прочитать на http://www.tigir.com/paging.htm или на http://www.php.su/articles/?cat=examples&page=020
5
Спасибо большое за ответ Александр!!! А выборка данных из БД таким же способом производиться?
Неизвестный
17.12.2009, 10:25
общий
Т. Павел Анатольевич:
А выборка данных из БД таким же способом производиться?

Точно таким же, только без оператора LIKE и WHERE соответственно.
Еще заметил опечатку у меня
...die ("Error!")... заменить на ...or die ("Error!")...
Неизвестный
17.12.2009, 11:20
общий
Спасибо за помощь постранично сделал, а с поиском хотел бы уточнить а если у меня есть форма html поле ввода и и кнопочка отправить
т.е 2 файла index.html и poisk.php
Для меня понятней полное описание и на моем примере я делаю так:

1. Форма html


<html>

<form action="poisk.php" method="post">


Название- Цена
<input type="text" name="rain" size="60" value="">


<input type="submit" name="submit" value="Искать">


<input type="reset" name="reset" value="Очистить">


</form>

</html

- - - - - - - - - - - - - - - - - - -
2. Форма poisk.php

<?php

/* Соединение, выбор БД */

$link = mysql_connect("localhost", "ammx", "1111")

or die("Не соединилось!!!");

print "Соединение успешно";

mysql_select_db("wwwammxru_ammx") or die("Не найдена БД");

/* Выполнение SQL запроса */


$query = "SELECT * FROM Arenda";

$result = mysql_query($query) or die("Запрос ошибочный");

/* Печать результатов в HTML */

print "<table>\n";

while ($line = mysql_fetch_array($result, cena)) {

if (substr_count(strtoupper($line[1]),strtoupper($rain))!=0) {

print "\t<tr>\n";

for ($i=1;$i<=4;$i++) { print "\t\t<td>$line[$i]</td>\n"; }

print "\t</tr>\n";

}

}


print "</table>\n";

/* Освобождение памяти, занятой результатом запроса */

mysql_free_result($result);

/* Закрытие соединения */

mysql_close($link);


?>


Но выдает мне результат такой Соединение успешно не не выдает то что вводил и искал в поле... В чем может быть загвоздка не могу понять... как мне найти либо Цену поле, или Район???
Неизвестный
17.12.2009, 14:25
общий
Товарищ Бородин:
Может вам будет проще если это будет один файл php?!
Неизвестный
17.12.2009, 14:42
общий
Можно. мне тогда текстовое поле нужно будет переменной, к примеру если я делаю поиск по цене, и эту переменную использовать в SQL запросе...
Но не знаю поможет ли мне это в поиске
Неизвестный
17.12.2009, 19:34
общий
Зернов Александр:
Зернов Александр, а можно поинтересоваться, чего Вы меня-то звали?
Неизвестный
17.12.2009, 23:37
общий
Товарищ Бородин:
Это ошибка, прошу прощения.

Товарищ Бородин:
Вариант будет завтра.
Неизвестный
18.12.2009, 18:05
общий
Добрый вечер!
Прошу прощения но:
1)
select * from Arenda WHERE cena AND rain like '%$like%'"
- Это как понимать? Во-первых WHERE cena - вообще невесть что. Таки cena - не булевкое значения хранит а целочисленное. А посему WHERE cena всегда даст истину за исключением случая когда cena ровна 0. Во-вторых если поле район хранит буквенное нименование района а не его код - то сравнение с помощью LIKE лучше не делать - могу ведь быть районы у которых части наименования совпадают - например "двинский" и "нижнедвинский". В таком случае результат не будет соответствовать ожидаемому.
2) вообще mysql_query - возвращает в случае не удачи false. Посему лучше всего проверить перед mysql_num_rows это самое значение - если оно false, то mysql_num_rows даст ошибку.
Например так:
Код:
if (($result = mysql_query($query)) !== false){  /* все хорошо - работаем дальше */}

можно и проще - так:
Код:
$result = mysql_query($query)
if ($result !== false){ /* все хорошо - работаем дальше */}

3) Если числовые индексы полей не нужны - а так бывает чаще всего, то вместо mysql_fetch_array - лучше всего использовать mysql_fetch_assoc, которая собственно и вернет хеш-массив с ключами соответствующими указанным в выборке полям.

4) Советую навсегда забыть конструкции вроде or die - они свое отжили уже давно. Если нужно протоколирование запросов - создайте свою функцию-обертку для mysql_query и обрабатывайте ошибки там.

Господин Т. Павел Анатольевич, я Вам предложил рабочий вариант представляющий собой изрядно упрощенную версию постоянно используемого в работе кода. Что Вам, собственно, там не нравится? Я правда случайно постанул его не в форму для ответа а сразу на форум - сорри, исправил.
Неизвестный
18.12.2009, 18:10
общий
это ответ
Добрый вечер.
Примерно так:

Код:
	
/*...где-то выше...*/
define('_MAXONPAGE', 10);
/*.................*/

$cena = 100; //для примера
$raion = 'Местный:)'; //для примера
$currentPage = 2; // для примера - текущая страница

$sqlLimit = $currentPage > 1 ? ' LIMIT '._MAXONPAGE : ' LIMIT '._MAXONPAGE * $currentPage.' OFFSET '._MAXONPAGE;


////Насколько я понял в поле район - строка а не id ?????? если строка то так:
$sql = mysql_query('SELECT * FROM Arenda WHERE cena = '.(int)$cena.' AND rain = "'.mysql_real_escape_string($raion).'" ');
////если все-таки id - то так:
$sql = mysql_query('SELECT * FROM Arenda WHERE cena = '.(int)$cena.' AND rain = '.(int)$raion.' ');


/*
так вы получите записи изначально только для текущей страницы. нес смысла забирать все записи и разбивать их затем в пхп.
далее в цыкле вы выводите записи текущей страницы и отрисовываете ссылки для навигаци и по страницам. Значения cena, raion $currentPage
можете брать из $_GET или $_POST соответственно - завсисит от того для чего оно вам надо.
*/

echo ("<table border ='1'>");
echo ("<tr> <td align="center"> Кол-во комнат</td> <td align="center"> Район</td> <td align="center">Адрес</td> <td align="center"> Описание</td> <td align="center"> Цена</td> <td align="center"> Телефон</td></tr></p>");
//mysql_fetch_assoc кстати использовать удонее :)
while ($tablerows = mysql_fetch_row($sql)){
echo("<tr><td>$tablerows[2] </td><td>$tablerows[3]</td> <td>$tablerows[4]</td> <td>$tablerows[6]</td> <td>$tablerows[7]</td> <td>$tablerows[8]</td></b> </tr>");
}
echo "</table>";

Если что-то не понятно - пишите... Хотя я все упростил аж до нельзя...

Неизвестный
21.12.2009, 21:20
общий
Т. Павел Анатольевич:
Файл search.php
Код:

<?

if (@$_POST['type'] = "search";)
{
$db = mysql_connect("localhost","ammx","1111");
mysql_select_db("wwwammxru_ammx" ,$db);

$typesearch = $_POST['typesearch'];
$search = $_POST['search'];
$rain = $_POST['rain'];
if ($typesearch == "cena")
{
$sql = mysql_query("select * from Arenda WHERE cena='$search'") or die ("Error!"); // получаем массив данных
if((mysql_num_rows($sql)<=0))
{
echo ("Ни чего не найдено!");
}else{
while ($while = mysql_fetch_array($sql )) // формируем список и выводим его как удобно
{
echo ("Данные ".$while ['date'] ." - дата");
};
};

}
elseif ($typesearch == "rain")
{
$sql = mysql_query("select * from Arenda WHERE rain like '%$rain%'") or die ("Error!"); // получаем массив данных
if((mysql_num_rows($sql)<=0))
{
echo ("Ни чего не найдено!");
}else{
while ($while = mysql_fetch_array($sql )) // формируем список и выводим его как удобно
{
echo ("Данные ".$while ['date'] ." - дата");
};
};
}
else
{
echo ("Не задан тип поиска");
};
mysql_free_result ($sql);
}
else
{
echo ("<form method="POST" action="search.php">
<input name="type" type="hidden" value="search">

<input type="text" name="search" size="15" maxlength="15" value="" title="Впечатайте искомый текст">

<label><input type="radio" name="typesearch" value="cena" checked>поиск по цене</label>

<label><input type="radio" name="typesearch" value="rain" >поиск по району</label>


<input type="submit" value="Отправить"><input type="reset" value="Очистить">");
};
?>


Должно работать, проверить не могу.
Неизвестный
22.12.2009, 09:08
общий
Хорошо спасибо! работает а если есть 2 поля ввода и поиск нужно сделать в диапазоне
( к примеру в text1 ввожу число 100 а в text2 ввожу число 300 и при нажатиии на кнопку выдает мне диапазон чисел от 100 до 300)
то как это лучше реализовать? Заранее спасибо Вам Александр, если что укажите номер вашего кошелька отблагадарю лично!
Неизвестный
22.12.2009, 19:31
общий
Т. Павел Анатольевич:
Вот такой вариант!
Код:
<?

if (@$_POST['type'] = "search";)
{
$db = mysql_connect("localhost","ammx","1111");
mysql_select_db("wwwammxru_ammx" ,$db);
$typesearch = $_POST['typesearch'];
if ($typesearch == "cena")
{
$cenasearchstart = $_POST['cenasearchstart'];
$cenasearchend = $_POST['cenasearchend'];
if ($cenasearchstart < $cenasearchend)
{
echo ("Начальная цена не может быть меньше конечной!");
}
elseif ($cenasearchend == 0)
{
echo ("Конечная цена не может быть равна нулю!");
}
elseif (empty($cenasearchstart) or empty($cenasearchend))
{
echo ("Одно из значений цены пусто!");
}else{
$sql = mysql_query("select * from Arenda WHERE cena>='$cenasearchstart' AND cena=<'$cenasearchend'") or die ("Error!"); // получаем массив данных
if((mysql_num_rows($sql)<=0))
{
echo ("Ни чего не найдено!");
}else{
while ($while = mysql_fetch_array($sql )) // формируем список и выводим его как удобно
{
echo ("Данные ".$while ['date'] ." - дата");
};
};
};
}
elseif ($typesearch == "rain")
{
$rainsearch = $_POST['rain'];
$sql = mysql_query("select * from Arenda WHERE rain like '%$rain%'") or die ("Error!"); // получаем массив данных
if((mysql_num_rows($sql)<=0))
{
echo ("Ни чего не найдено!");
}else{
while ($while = mysql_fetch_array($sql )) // формируем список и выводим его как удобно
{
echo ("Данные ".$while ['date'] ." - дата");
};
};
}
else
{
echo ("Не задан тип поиска");
};
mysql_free_result ($sql);
}
else
{
echo ("<form method="POST" action="search.php">
<input name="type" type="hidden" value="search">

<label><input type="radio" name="typesearch" value="cena" checked>поиск по цене</label>

<input type="text" name="cenasearchstart" size="15" maxlength="15" value="" title="Впечатайте стартовую цену">
<input type="text" name="cenasearchend" size="15" maxlength="15" value="" title="Впечатайте конечную цену">

<label><input type="radio" name="typesearch" value="rain" >поиск по району</label>

<input type="text" name="rainsearch" size="15" maxlength="15" value="" title="Впечатайте искомый текст">


<input type="submit" value="Отправить"><input type="reset" value="Очистить">");
};
?>
Форма ответа