[19-07-2004] Джо
MySQL. Простой скрипт поиска
В статье приведен простой пример поиска по колонке Название таблицы магазинов. В таблице Магазины ( mag ) 5 колонок: 1 - ключ, 2 - Название, 3 - адрес, 4 - метро, 5 - телефон. Структуру таблицы можно посмотреть здесь.
В файле formp.php содержится форма ввода части названия магазина:
<form action="poiskmag.php" method="post">
Название магазина<br>
<input type="text" name="nmag" size="60" value="">
<input type="submit" name="submit" value="Искать">
<input type="reset" name="reset" value="Очистить">
</form>
В файле poiskmag.php - SQL-запрос к БД MySQL, обработка результатов SQL-запроса ( собственно поиск магазина по подстроке названия ), вывод результата поиска.
<?php
/* Соединение, выбор БД */
$link = mysql_connect("localhost", "root", "") or die("Не соединилось!!!");
mysql_select_db("equip") or die("Не найдена БД");
/* Выполнение SQL запроса */
$query = "SELECT * FROM mag WHERE UPPER(name_mag) LIKE '%".strtoupper($_POST['nmag'])."%'";
$result = mysql_query($query) or die("Запрос ошибочный");
/* Печать результатов в HTML */
print "<table>\n";
while ($line = mysql_fetch_array($result, MYSQL_NUM)) {
print "\t<tr>\n";
for ($i=0;$i<=3;$i++) { print "\t\t<td>$line[$i]</td>\n"; }
print "\t</tr>\n";
}
print "</table>\n";
/* Освобождение памяти, занятой результатом запроса */
mysql_free_result($result);
/* Закрытие соединения */
mysql_close($link);
?>
В результате выполнения этого запроса будут содержаться строки таблицы, удовлетворяющие условию вхождения в них части названия магазина без учета регистра букв. Такой запрос удобен для поиска в текстовых ( строковых ) полях, для числовых полей лучше искать по равенству значения поля и числа, введенного в форме. Примерно так будет выглядеть строка с SQL-запросом для числового поля:
$query = "SELECT * FROM <имя таблицы> WHERE <имя числового поля> = '<число, введенное в форме>'";
Если подобный скрипт поиска нужен для какой-либо практической задачи, рекомендую посмотреть еще и статью о модифицированном варианте скрипта поиска.
Joe [ 1 ]
Цитата (Toly @ Mar 12 2005 @ 20:05 PM)Как бы ещё вставит print(или???) Неправильно введён номер., если номер не правильный?
Вот так примерно ( проверяется кол-во строк в результате ):
if (mysql_num_rows($result)) {
/* Печать результатов в HTML */
....
}
else print "Неправильно введён номер";
Toly [ 2 ]
Joe и снова вопрос по скрипту - новые номера в колонке Sort имеют пробелы например:
A 301 000 80 99, A 129 680 05 17 7C02, Q315845230031 0.
Если в поиске не правильно поставить пробел, то номер не находит!
Если правильно, то находит всё.
Возможно ли зделать, чтоб вводить номер без пробелов???
Joe [ 3 ]
Тут может быть несколько вариантов:
1) Если ты по номеру можешь определить, в каких местах должны стоять пробелы, то проанализировать введенную строку и вставить туда пробелы в необходимые места, а потом уже искать по исправленной строке;
2) Вводить в колонку Sort новые номера без пробелов;
3) Использовать мой скрипт в первозданном виде, только считывать порциями ( LIMIT ) и сравнивать введенную строку со строкой из базы с удаленными пробелами ( функция str_replace ).
Вот таким примерно способом можно убрать пробелы из таблицы - слово "таблица" надо заменить названием своей таблицы
while (TRUE) {
$l1=0;$l2=1000;
$query = "SELECT * FROM таблица WHERE 1 LIMIT $l1 TO $l2";
$result = mysql_query($query) or die("Запрос ошибочный");
if (mysql_num_rows($result)==0) break;
while ($line = mysql_fetch_array($result, MYSQL_NUM)) {
if (strstr($line[1]," ")) {
$query2 = "UPDATE таблица SET Sort=str_replace(" ","",$line[1]) WHERE Sort=$line[1];
mysql_query($query2) or die("Запрос ошибочный");
}
}
$l1=$l1+1000;$l2=$l2+1000;
}
Обший смысл скрипта - выбирает из таблицы в цикле по 1000 строк, анализирует во внутреннем цикле поле Sort на наличие пробелов и если они есть, записывает в таблицу это поле в соответствующую строчку без пробелов.
Эвкалипт [ 4 ]
как сделать, чтобы когда результатов нет выводилось "Поиск результатов не дал" ?
как сделать так, когда строка для поиска пуста, а человек гажимает Искать, чтобы ему выводилось, что "Вы не задали параметры поиска" ? А то выскакивают всякие ошибки
как сделать поиск по нескольким столбцам?
И как пронумеровать автоматически результаты поиска?
Джо [ 5 ]
По порядку -
1) if (!mysql_num_rows($result)) echo "Поиск результатов не дал"
2) чтобы проверить, что введено, нужно проанализировать переменные, передаваемые из формы в скрипт поиска;
3) автоматически перенумеровать - результат считывается в массив, номер результата - индекс массива.
Toly [ 6 ]
Привет Joe!
Почти два года не заходил на твой сайт.
Ни опять а снова, нуждаюсь в тоей помощи.
Как был я чайник так и остался в PHP, а до делывать надо.
Новая задача поставленна передомной каторая относиться к нашей
предыдущей теме. немного напомню. Простой скрипт поиска по БД.
Работает отлично!
<?php
/* Соединение, выбор БД */
//global $database;
$link = mysql_connect("localhost", "root", "")
or die("Не соединилось!!!");
print "";
mysql_select_db("db_1")
or die("Не найдена БД");
/* Выполнение SQL запроса */
$query = "SELECT *
FROM pldata222 WHERE Sort ='$nSort'";
$result = mysql_query($query)
or die("Запрос ошибочный");
if (mysql_num_rows($result)!=0) {
/* Печать результатов в HTML */
print "<table bgcolor=\"#3399FF\">
<tr>
<td><strong>? Запчасти</strong></td>
<td><strong>Название по-немецки</strong></td>
<td><strong>Цена в EUR</strong></td>
<td><strong>Гр.скидки</strong></td>
<td><strong>Вес:</strong></td>
</tr>
\n";
while ($line = mysql_fetch_array($result, MYSQL_NUM))
{
print "\t<tr class=\"txt\">\n";
for ($i=0;$i<=4;$i++)
{
print "\t\t<td>$line[$i]</td>\n";
}
print "\t</tr>\n";
}
print "</table>\n";}
else print "Задайте правильно номер!<BR>";
/* Освобождение памяти, занятой результатом запроса */
mysql_free_result($result);
/* Закрытие соединения */
mysql_close($link);
?>
Вот так выглядит результат.
Существует таблица групп скидок.
Например
для группы ?1 = скидка 0,5%
для группы ?2 = скидка 10%
для группы ?3 = скидка 15%
для группы ?4 = скидка 17%
Так вот задача такова,
62,45 (цена по прайслисту) минус скидка 17% для группы ?4, плюс вес
0,28 умноженный на 2,2 за доставку, равняется цена со склада в Москве.
Формула: 62,45 -17% + (2,2 * 0,28) = 52,46
Надо что бы этот результат выходил в тойже таблице.
Joe наставь на путь истиный с чего начать?
Joe [ 7 ]
примерно так:
<?php
/* Соединение, выбор БД */
//global $database;
$link = mysql_connect("localhost", "root", "")
or die("Не соединилось!!!");
print "";
mysql_select_db("db_1")
or die("Не найдена БД");
/* Выполнение SQL запроса */
$query = "SELECT *
FROM pldata222 WHERE Sort ='$nSort'";
$result = mysql_query($query)
or die("Запрос ошибочный");
if (mysql_num_rows($result)!=0) {
/* Печать результатов в HTML */
print "<table bgcolor=\"#3399FF\">
<tr>
<td><strong>? Запчасти</strong></td>
<td><strong>Название по-немецки</strong></td>
<td><strong>Цена в EUR</strong></td>
<td><strong>Гр.скидки</strong></td>
<td><strong>Вес:</strong></td>
<td><strong>Цена в Москве</strong></td>
</tr>
\n";
while ($line = mysql_fetch_array($result, MYSQL_NUM))
{
if($line[3]==1) {$proc=0.5;}
elseif($line[3]==2) {$proc=10;}
elseif($line[3]==3) {$proc=15;}
elseif($line[3]==4) {$proc=17;}
print "\t<tr class=\"txt\">\n";
for ($i=0;$i<=4;$i++)
{
print "\t\t<td>$line[$i]</td>\n";
}
$mcena=$line[2]-$line[2]*$proc/100+$line[4]*2.2;
print "\t\t<td>$mcena</td>\n";
print "\t</tr>\n";
}
print "</table>\n";}
else print "Задайте правильно номер!<BR>";
/* Освобождение памяти, занятой результатом запроса */
mysql_free_result($result);
/* Закрытие соединения */
mysql_close($link);
?>
Joe [ 8 ]
Вопросик в письме пришел - прокомментировать печать результатов в HTML. Комментирую построчно:
print "<table>\n"; //выводит тег <table> в страницу, \n - перевод строки;
while ($line = mysql_fetch_array($result, MYSQL_NUM)) {
/* цикл до тех пор, пока из результата работы запроса $result можно считать очередную строку в индексный одномерный массив $line */
print "\t<tr>\n";
for ($i=1;$i<=4;$i++) { print "\t\t<td>$line[$i]</td>\n"; }
//печатается строка таблицы со всеми элементами массива $line[$i]
print "\t</tr>\n";
}
print "</table>\n";
Joe [ 9 ]
Цитата (phpnewb @ Jan 27 2008 @ 13:24 PM)Еще вопрос, подскажи как в поиске задать минимальное количество символов. Чтобы человек не мог набрать 1 и получить все строки с единицей.
Чтобы установить минимальное количество символов, сделай проверку $nmag с помощью функции strlen.
Joe [ 10 ]
Цитата (Andrey @ Feb 6 2009 @ 00:13 AM)Joe
сможешь подсказать где можно почитать про то как сделать поиск по нескольким параметрам и в каких то диапозонах?
Можешь дать хоте название книжки или ссылку на сайт где это есть?
вообще говоря, задача довольно элементарна - это оператор SELECT примерно такого вида - SELECT [список полей таблицы] FROM [таблица] WHERE p1>[min значение параметра] AND p1<[max значение параметра] AND p2>[min значение параметра] AND p2<[max значение параметра] ... AND pn>[min значение параметра] AND pn<[max значение параметра] .
Почитать - yandex.ru/yandsearch?clid=14585&text=%D0%BA%D0%BD%D0%B8%D0%B3%D0%B0+MySQL+%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C
при этом обратить внимание на следующих: Ларри Ульман, Люк Веллинг, Лора Томсон
Joe [ 11 ]
Цитата (Kamarilia @ Feb 25 2009, 13:24 PM) if (substr_count(strtoupper($line[1]),strtoupper($_POST['searchstring']))!=0)
Когда запускаю страницу, работает нормально. Но у меня есть необходимость обновить страницу. Когда я обновляю, searchstring оказывается пустой и скрипт ругается.
Warning: substr_count() [function.substr-count]: Empty substring in \search.php on line 13
Джо, помоги найти уловку, чтоб все работало
if (!empty($_POST['searchstring'])) { ... }
так можно попробовать
Joe [ 12 ]
Цитата (Настенька @ Feb 25 2009, 20:22 PM) Я новичок в деле создания сайтов. Есть база. В ней три таблицы city, region, country. Какой код написать в php? чтоб вышла таблица выбора гор., страны, и региона? Как на сайтах знакомств. Заранее спасибо за ответ
Тот же код, только 3 переменные передаются из формы
TrEK [ 13 ]
Всем привет.
Джо, у меня возникли проблемы с применением твоего скрипта, вернее он вообще не применялся Все время вылетала ошибка, будето не передается в страницу вывода результата переменная запроса, хотя на самом деле все передавалось.
Немного поискав в сети,- нашел один простенький подходящий, который выводит результаты запроса из БД сразу в форме ссылок.
Если разрешите,- я выложу его здесь, так как он более модифицирован , чем Ваш, и думаю тоже много кому пригодится.
Joe [ 14 ]
Что-то было сделано не так - Как видно из всего вышеизложенного, у всех он начинает работать после исправления ошибок. А выложить еще вариант - почему нет? Только ссылку на источник - мы люди честные - всегда указываем, что откуда стырено
TrEK [ 15 ]
Извиняюсь за дублирование предыдущего поста.. тот можете удалить. Просто обновил страничку в браузере случайно.
Цитата (Joe @ May 3 2009, 15:21 PM) Что-то было сделано не так - Как видно из всего вышеизложенного, у всех он начинает работать после исправления ошибок. А выложить еще вариант - почему нет? Только ссылку на источник - мы люди честные - всегда указываем, что откуда стырено
Ну да.. я понимаю на счет исправления ошибок, потому и перечитал эту ветку раза три... и смотрел у кого какие ошибки. И так видимо не хватило мозгов на запуск родимого
запутался я малость.
размещаю с разрешения владельца статьи другой скрипт по поиску.. с которым сразу не было проблем.
Взят с fragon.ru.
http://fragon.ru/index.php?name=Pages&op=page&pid=14
================================================
================================================
================================================
search.php:
<!--///--- Форма ввода поисковой фразы ---///////////////////////////////-->
<form action="search.php" method="POST">
<input name="keyword" size=18>
<input type="submit" name="send" value="Найти">
</form>
<?php
//--- Функции, которые разделяют строку на ключевые слова и формируют запрос ---////////
//--- Отредактируйте название столбцов таблицы (or text like), в которых вы хотите производить поиск ---//
function keywords_id($words)
{
$keywords = split(' ', $words);
$num_keywords = count($keywords);
for ($i=0; $i<$num_keywords; $i++)
{
if ($i)
{
$keywords_string .= "or id like '%".$keywords[$i]."%' ";
}
else
{
$keywords_string = "id like '%".$keywords[$i]."%' ";
}
}
return $keywords_string;
}
function keywords_title_en($words)
{
$keywords = split(' ', $words);
$num_keywords = count($keywords);
for ($i=0; $i<$num_keywords; $i++)
{
if ($i)
{
$keywords_string .= "or title_en like '%".$keywords[$i]."%' ";
}
else
{
$keywords_string = "title_en like '%".$keywords[$i]."%' ";
}
}
return $keywords_string;
}
//--- Получаем строку запроса из формы, обрабатываем и с применением выше написанных функция, получаем массив ключевых слов ---/////
if(isset($_POST['send']))
{
$words = trim($_POST['keyword']);
$words = strip_tags($words);
$words = str_replace("'", "", $words);
$words = str_replace('"', "", $words);
$words = str_replace("-", "", $words);
$words = str_replace(",", "", $words);
if (($words) == "")
{
echo 'Не указаны ключевые слова';
}
else
{
$var = keywords_id($words);
$var2 = keywords_title_en($words);
echo $var. $var2;
if(($var) || ($var2))
{
//--- Данные для соедининия с базой данных ---/////////////////////
//--- Если устанавливаете на локальном компьютере, оставте по умолчанию ---/////
$hostname = "localhost"; //--- Имя хоста (обычно localhost)
$dbusername = "user"; //--- Имя пользователя
$dbpassword = "password"; //--- Пароль для соединения с базой
$dbname = "cinema"; //--- Название базы данных
$dbcon = @mysql_connect($hostname,$dbusername,$dbpassword);
mysql_query('set names cp1251'); # TrEK dobavuv
if (!$dbcon) exit("<p>Cервер MySQL не доступен!</p>");
if (!@mysql_select_db($dbname,$dbcon)) exit("<p>Hе доступна база данных</p>");
$sql = "SELECT id , title_en FROM film WHERE ".$var." OR ".$var2."";
$result = mysql_query($sql);
$num_rows = mysql_num_rows($result);
if ($num_rows <= 0)
{
echo 'По Вашему запросу ничего не найдено,<br />попробуйте по другому сформулировать ключевые слова.';
}
else
{
echo 'По вашему запросу найдено '.$num_rows.' строк';
while(list($id, $title) = mysql_fetch_array($result))
echo '<table width="700" height="20" align="center" border="0" cellpadding="3" cellspacing="0">
<!--DWLayoutTable-->
<tr>
<td id="w" width="700" height="20" valign="middle"><a href="http://www.films.terno.com/?page=item&id='.$id.'" title="'.$title.'">'.$title.'</a></td>
</tr></table>';
}
}
}
}
?>
__________________________________________________________
В данном скрипте поиск производится из полей 'id' и 'title_en' - тоесть поиск по английскому названию фильма или по его айди.
Но мне надо организовать поиск по английскому названию.. и по русскому названию (поле 'title')... но чтоб результат выводился сразу гиперссылками на искомые фильмы.
Joe [ 16 ]
А в чем проблема-то? Заведи поле с русским названием, замени id в скриптах на него и все. Ну и с гиперссылками разберись - можно их забубенить еще в одно поле в базе, если они бессистемные или сделать так же, как и в скрипте.
TrEK [ 17 ]
Цитата (Joe @ May 3 2009, 23:31 PM) А в чем проблема-то? Заведи поле с русским названием, замени id в скриптах на него и все. Ну и с гиперссылками разберись - можно их забубенить еще в одно поле в базе, если они бессистемные или сделать так же, как и в скрипте.
Все сделал, теперь вытягивает по запросу из двух полей БД, и русского и анГлЫцкого. .. и ссылочки дает.
Мдя... раньше с ПШП особо не сталкивался.. а теперь уже на практике для себя понял полезность его применения.
Цитата Мой скрипт у тебя не пошел - передаваемую переменную надо было объявить глобальной - это обсуждалось rolleyes.gif
хм.. А каким образом его сделать глобальным... ? Приношу извинения за невнимательность.
==========
==========
==========
Еще один момент с того скрипта , что я здесь разместил:
скрипт разбивает строку запроса, соответственно название, которое состоит из нескольких слов, он ищет уже не как целостное название , а как отдельные два, или больше запроса.
Тоесть на запрос фильма "Секрет Императора" - мы получаем такой ответ:
eng.Secret - rus.Секрет
eng. - rus.Большой секрет для маленькой компании
eng. - rus.Секретные истории: Динозавр - друг человека?
eng. - rus.Тайны века: Брат Императора. Необъявленная казнь
eng.Keisarin salaisuus - rus.Секрет императора
Такой ньюанс боле-менее терпим, так как на всех сайтах такой алгоритм обработки впринциппе.
Но вот когда зарпос фильма "Полет на Луну",-тогда дела плохи:
Уже понятно что запрос будет осуществлятся по словам "полет", "на" и "луну",
и если по словам "полет" и "луну" не особо много комбинаций, то слово "на" создаст массу ненужных результатов по запросу из БД. Это будут как фильмы в которых есть составляющая "на", так и фильмы которые или начинаются или заканчиваются на "на".
Как быть с такой обработкой запроса? Ведь с таким сталкивались однозначно.
Где надо крутить, в php-скрипте переменные, или менять myqsl-запрос в скрипте на более ужесточенный?
Заранее благодарен.
Joe [ 18 ]
В poiskfilma.php - global $title_en;
Проверяй все слова запроса на длину и короткие анализируй - не являются ли они предлогами и союзами (их надо выкинуть из запроса). Предлогов и союзов не так уж много. Плюс еще дай запрос на точное соответствие названию и если такое вдруг найдется - дай его первым в выдаче ( можно вообще остальное не выдавать )
Ольга* [ 19 ]
Уже совсем отчаялась! Никак под себя подогнать не могу скрипт. У меня Соединение успешно и все! Мне нужен поиск только по одной колонке и вывод результатов в табличку. Помогите бедняжке :-)
Вот слегка измененный код
Код
<form action='poiskmag.php' method='post'>
<b></b>Поиск<br><input type='text' name='zapchast' size='60' value=''>
<input type='submit' name='submit' value='Искать'>
Код <?php
/* Соединение, выбор БД */
$link = mysql_connect("localhost", "root", "")
or die("Не соединилось!!!");
print "Соединение успешно";
mysql_select_db("auto") or die("Не найдена БД");
/* Выполнение SQL запроса */
$query = "SELECT * FROM zapchast";
$result = mysql_query($query) or die("Запрос ошибочный");
/* Печать результатов в HTML */
print "<table>\n";
while ($line = mysql_fetch_array($result, MYSQL_NUM)) {
if (substr_count(strtoupper($line[1]),strtoupper($zapchast))!=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);
?>
Название поля zapchast, БД auto
Joe [ 20 ]
Ошибки:
1) после FROM в запросе - имя таблицы;
2) индекс $line в строке сравнения должен соответствовать номеру в записи поля запчасть, индексы нумеруются с нуля. Стало быть, если в записи поле zapchast - третье, в сравнении индекс - 2;
3) на всякий случай в poiskmag.php в начале - global $zapchast;
SOS [ 21 ]
Спасибо за статью! Полезный материал.
Joe, пожалуйста помогите, нужно вывести данные из таблицы не построчно, а в два столбца. Три дня бьюсь, в лучшем случае дублирование столбцов получается. А выборка по $line[..] ничем в моем случае помочь не может.
При выводе на печать использую такой алгоритм:
...
while($line = mysql_fetch_array($result, MYSQL_NUM))
{
echo "<tr>\n";
$col=1;
if($col==1){
echo "<td>переменные в первый столбец</td>";
$col++;
}else{
echo "<td>переменные во второй столбец</td>";
echo "</tr>\n";
$col=1;
}
}...
Joe [ 22 ]
Задача поставлена некорректно. Непонятно, что надо выводить в первый столбец, а что во второй? Поясните
Ольга* [ 23 ]
У меня БД avto, таблица zapchast, поле objav
Я немного изменила код. В хедере у меня есть подключение к БД,
Я хочу, чтобы результаты запроса выглядели так же как и страничка с полным списком Все поля (id, data, objav, kontakt, skolko ) У меня это отображается так: Код
echo '<ul>';
while($arr = mysql_fetch_assoc($sql)) {
echo '<tr><td><table border=0><tr><td width=590>'.$arr['objav'].'</td><td width=10><a href="path.php?id='.$arr['id'].'" onclick $sql update zapchast set skolko +1 where id=id><b>подробнее</b></a></font>
</td></tr></table></td><td>'.$arr['skolko'].'<br></td></tr>';
}
echo '</ul>';
Т.Е. только поля objav и skolko, ссылка отправляет на страницу с еще одним полем - kontakt. Очень боюсь испортить скрипт, просто плохо знаю php. Куда и как осторожно внести изменения?
Код <?php
/* Соединение, выбор БД */
//$link = mysql_connect("localhost", "root", "")
//or die("Не соединилось!!!");
include "head.php";
//print "Результат поиска:";
//mysql_select_db("auto") or die("Не найдена БД");
/* Выполнение SQL запроса */
$query = "SELECT * FROM zapchast";
$result = mysql_query($query) or die("Запрос ошибочный");
/* Печать результатов в HTML */
print "<td width='600'>";
while ($line = mysql_fetch_array($result, MYSQL_NUM)) {
if (substr_count(strtoupper($line[2]),strtoupper($zapchast))!=0) {
print "\t<tr>\n";
for ($i=1;$i<=4;$i++) { print "\t\t<td>$line[$i]</td>\n"; }
print "\t</tr>\n";
}
}
print "</td>";
/* Освобождение памяти, занятой результатом запроса */
mysql_free_result($result);
include "footer.php";
/* Закрытие соединения */
mysql_close($link);
?>
Joe [ 24 ]
Если работало до изменения, наверно и так сработает.
echo '<tr><td>'.$arr['id'].'</td><td>'.$arr['data'].'</td><td><table border=0><tr><td width=590>'.$arr['objav'].'</td><td width=10><a href="path.php?id='.$arr['id'].'" onclick $sql update zapchast set skolko +1 where id=id><b>подробнее</b></a></font>
</td></tr></table></td><td>'.$arr['skolko'].'<br></td></tr>';
Естественно, в суть задачи не вникал, поэтому решение дал навскидку. А это для чего делается - курсовая какая-нибудь?
Я давно уже так не пишу - отделяю программирование от верстки, потому что в таком виде - это не программирование и не верстка. Если собираетесь этим зарабатывать - почитайте в сети о шаблонизаторах.
TrEK [ 25 ]
Джо, а анализирование где должно производится?
Если не затруднит, могли бы показать пример на той же самой часточке "на" ?
И хотелось бы узнать как реализовать точное соответствие названию?
Заранее благодарен!
Ольга* [ 26 ]
Нет, не работает.
Проблема в том, что некоторые поля скрыты и их можно открыть только по ссылке "подробнее" при этом должен сработать счетчик - сколько раз был переход по ссылке. Мне нужно показать только два поля - objav и skolko написать подробнее и попасть на генерируемую по id страничку с более расширеными данными.
Я не могу переделать ваш скрипт в той части, где выводятся результаты поиска.
Как вывести не все поля?
Задам вопрос более конкретно как вывести поле 2 и 4 в таблице
SOS [ 27 ]
Цитата(Joe [ 181 ]:Задача поставлена некорректно. Непонятно, что надо выводить в первый столбец, а что во второй? Поясните)
У меня таблица с товарами (картинки и описание). Необходимо, чтобы информация выводилась в два столбца,например, товар1 в левой колонке таблицы, товар2 в правой, товар3 в левой, товар4 в правой и т.д. Ну или десять в левой колонке, а следующие десять в правой.
Обращаюсь к таблице без WHERE, понимаю, что надо сделать правильный алгоритм в цикле WHILE прописать, а вот сделать это у меня не получается.
Joe [ 28 ]
Ольга, в моем скрипте результат запроса - вся таблица и она уже анализируется на соответствие. В вашем случае надо поменять запрос, чтобы его результат обработать первым куском вашего кода.
примерно так
Код $query="SELECT * FROM zapchast WHERE objav LIKE %$zapchast%";
$sql = mysql_query($query) or die("Запрос ошибочный");
дальше ваш вывод
$zapchast - это передается из формы и сравнивается с содержимым поля objav
Ольга* [ 29 ]
Соединение успешноЗапрос ошибочный Код <?php
include "head.php"; //Подключаем верхушку сайта ("хидер")
print "Соединение успешно";
$query="SELECT * FROM zapchast WHERE objav LIKE %$zapchast%";
$sql = mysql_query($query) or die("Запрос ошибочный");
echo '<ul>';
while($arr = mysql_fetch_assoc($sql)) {
echo '<tr><td><table border=0><tr><td width=590>'.$arr['objav'].'</td><td width=10><a href="path.php?id='.$arr['id'].'" onclick $sql update zapchast set skolko +1 where id=id><b>подробнее</b></a></font>
</td></tr></table></td><td>'.$arr['skolko'].'<br></td></tr>';
}
echo '</ul>';
А если запрос сработает, то будет ругаться на $arr, наверно...
Joe [ 30 ]
TrEK
запрос на полное соответствие:
SELECT id , title_en FROM film WHERE title_en='$keyword'
анализ на предлог
Код function keywords_title_en($words)
{
$keywords = split(' ', $words);
$num_keywords = count($keywords);
for ($i=0; $i<$num_keywords; $i++)
{
if($keywords[$i]!="на") { //анализ на предлог
if ($i)
{
$keywords_string .= "or title_en like '%".$keywords[$i]."%' ";
}
else
{
$keywords_string = "title_en like '%".$keywords[$i]."%' ";
}
}
}
return $keywords_string;
}
SOS [ 31 ]
Вот мой код, какой мне не удается запустить на вывод вдве колонки:
..
mysql_connect($host, $user, $passwd) or die(mysql_error()); // коннект к БД
mysql_select_db($db_name); // выбор БД
$page = page(); // определяем страницу
$result = sql_query($onpage, $page, $table); // sql - запрос
$total_records = mysql_num_rows($result); // всего записей
$num_rows = ceil($total_records/$number_of_colums); // кол-во строк в таблице
if ($result){
if ($myrow = mysql_fetch_array($result)){
echo $start."<table><tr>\n";
$newrowcount=0;
if ($newrowcount < $number_of_colums){
$newrowcount = 0;
// выводим данные в ячейку
echo "<tr><td><a href=\"posuda/".$data["img"]."\" rel=\"lightbox\"><img src=\"posuda/".$data["img"]."\" width=\"140\" height=\"180\" border=\"0\" /></a></td>";
$newrowcount++;
if ($newrowcount == $number_of_colums) {echo"</tr>";}
}
while ($myrow = mysql_fetch_array($result));
echo "</tr></table>\n";
}
while ($myrow = mysql_fetch_array($result));
}
} ..
Joe [ 32 ]
Ольга а $zapchast объявлена глобальной?
Косяк может быть и из-за совпадения имен - лучше переименовать передаваемую из формы переменную
Joe [ 33 ]
SOS - пишу вывод на 2 столбца. А до сих пор все нормально? Проверено контрольными выводами?
if ($result){
echo $start."<table>\n";
$col=0;
while ($myrow = mysql_fetch_array($result, MYSQL_NUM)) {
if($col==0) {echo "<tr>";}
echo "<td>$myrow[0] $myrow[1]</td>";
if(($col==1) {echo "</tr>\n";$col=0;}
else {$col=1;}
}
if(($col==1) {echo "</tr>";}
echo "</table>\n";
}
в строке echo "<td>$myrow[0] $myrow[1]</td>";
индексы 0 и 1 поставлены условно - на самом деле это номера полей запроса
Ольга* [ 34 ]
Заменила $zapchast на $z , добавила global $z;
Результат тот же - Соединение успешноЗапрос ошибочный.
Может где то банальная ошибка?
<?php
include "head.php";
print "Соединение успешно";
global $z;
$query="SELECT * FROM zapchast WHERE objav LIKE %$z%";
$sql = mysql_query($query) or die("Запрос ошибочный");
echo '<ul>';
while($arr = mysql_fetch_assoc($sql)) {
echo '<tr><td><table border=0><tr><td width=590>'.$arr['objav'].'</td><td width=10><a href="path.php?id='.$arr['id'].'" onclick $sql update zapchast set skolko +1 where id=id><b>подробнее</b></a></font>
</td></tr></table></td><td>'.$arr['skolko'].'<br></td></tr>';
}
echo '</ul>';
SOS [ 35 ]
Joe, спасибо, но это немного не то. По Вашей схеме запрос идёт из одной записи (одна строка в БД), а мне надо из разных. Например, если поле $myrow[0]- картинка товара1, то $myrow[1]- его описание. Таким образом получается всё равно построчный вывод. А мне необходимо, чтобы в левой колонке был товар1(id1),а в правой товар2(id2).
И еще вопрос. А если по поиску получается много записей и необходимо сделать построничный вывод, необходимо отдельный запрос делать с LIMIT или можно использовать этот же?
Ольга* [ 36 ]
Все теперь просто прекрасно, за исключением одной крошечной проблемки. Непосредственно поиск не работает. Выдает весь список в обратном порядке.
<?php
include "head.php";
global $z;
echo "
<td width='600'>
<br><br>
<font color='#77787A'><b>РЕЗУЛЬТАТ ПОИСКА:</b></font>
<br>
<table border='1' style='border-color:#104c00'>
<tr>
<td width='450'><font color='#77787A'>Объявления:</font></td>
<td><font color='#77787A'>Просмотров:</font></td>
</tr>";
/* Выполнение SQL запроса */
$query="SELECT * FROM zapchast WHERE objav LIKE '%$z%'";
$sql = mysql_query($query) or die("Запрос ошибочный");
echo '<ul>';
while($arr = mysql_fetch_assoc($sql)) {
echo '<tr><td><table border=0><tr><td width=590>'.$arr['objav'].'</td><td width=10><a href="path.php?id='.$arr['id'].'" onclick $sql update zapchast set skolko +1 where id=id><b>подробнее</b></a></font>
</td></tr></table></td><td>'.$arr['skolko'].'<br></td></tr>';
}
echo '</ul>';
/* Освобождение памяти, занятой результатом запроса */
mysql_free_result($sql);
echo "
</table>";
echo "</td>";
include "footer.php";
?>
А я только обрадовалась Joe, миленький, помоги пожалуйста!!!!!
Joe [ 37 ]
SOS - вы не разобрались - выводится таблица из 2х столбцов, в каждом столбце по отдельному товару. На каждом шаге цикла выводится 1 строка результата запроса - 1 столбец выходной таблицы, а за 2 шага цикла выводится ДВЕ строки результата запроса в 1 строку выходной таблицы.
LIMIT - не обязательно.
Joe [ 38 ]
Ольга, а в форме ввода
<input type='text' name='zapchast' size='60' value=''> - это поправили на z ?
А второй файл как называется? Так же как здесь <form action='poiskmag.php' method='post'> в action ?
TrEK [ 39 ]
if($keywords[$i]!="на") { //анализ на предлог
Это строка которую Вы добавили.
Я понимаю, что здесь задаеться параметр ЕСЛИ будет такой запрос.
А результат действие при таком запросе? - return $keywords_string;
==========================
В общем, суть моего вопроса - как задать исключение того, чтоб при подобных запросах, как "Полет на Луну", не выдавало результаты названий "****на", "На****" и "***на***"?
Так, я разобрался со своим вопросом... Мои извенения, что так много лишних вопросов.
Значит подобное условие "if($keywords[$i]!="нужное_словосочетание") { //анализ на предлог" - будет исключать нужное_словосочетание из вывода результата поиска?
И скажите, пожалуйста, как мне добавить остальные союзы и часточки?
Или на каждый вариант надо писать новую строку "if($keywords[$i]!="?
Joe [ 40 ]
нужно И использовать -
if( ($keywords[$i]!="на")&&($keywords[$i]!="в")&&($keywords[$i]!="около") ) {
и так для всех предлогов и союзов
TrEK [ 41 ]
Благодарю за помощь.
Джо, Вас не сильно утомляет подобная гонка вопросов?
Просто хотел бы задать еще парочку.
Не могу понять где надо задать, чтоб меньше трех букв в запросе поиска не давало вывода.
И еще хотелось бы узнать, как можна реализовать такую систему вывода инфы по запросу.. как здесь например:
http://tfile.ru/forum/ssearch.php?q=PHP
Тоесть, чтоб то слово, которое я ввел при поиске, подсвечивалось желтым фоном в выведеном результате.
Я целый день провозился перебирая кучу html и php тэгов... но так и не получил чего хотел. Такое вообще реализовать легко?
Joe [ 42 ]
Такая суета обычно только перед сессией
1 - вместо
if (($words) == "")
поставить
if (strlen($_POST['keyword']) <3)
2
- проанализировать текст, выделив подстроку тегами strong или span;
- в файле css - написать
p strong {background-color: #FFCC66;}
TrEK [ 43 ]
Возвращусь к предыдущему вопросу:
1.Обьясните ,пожалуйста , что значит строка if (($words) == "")
ну как бы.. слово которое впишут в поиск - это переменная $words,
а что означает два знака "равно".. и пустые скобки вконце?
Если изменить истинную строку на ту, что Вы сказали, ничего в процессе поиска не измениться, кроме того как перестанет передаватся запрос при двух-буквенном запросе?...
2. Подстрока - это $words ?
И с файлом css не очень понял. почему там вначале буква "р"
Это где угодно вписать надо ?... так как у меня там куча всяких записей.. я некоторые менял, те что за фоновый рисунок и т.д. отвечают.. но делал все методом тыка.
Извините, если мои вопросы переростают в занудство.
Joe [ 44 ]
$words - это переменная $_POST['keyword'] или, что то же самое $keyword из которой удалили некие символы.
if (($words) == "")
- if - оператор перехода по условию;
в скобках - логическое выражение проверки двух операндов на равенство;
"" - пустая строка;
== - равенство в логическом выражении;
= - оператор присваивания
if (($words) == "") - проверяется на пустоту
if (strlen($words) < 3) - проверяется на длину
Рекомендую скачать с php.ru буквари по по php и mysql - чтобы мне их не переписывать
по css - тоже масса хороших ресурсов. Осенью самым хорошим будет мой, когда я дополню свою "простую верстку" таким же простым описанием css.
А пока поясняю - селектором css может быть и тег html, в том числе - тег параграфа p.
из стилей css для одних и тех же элементов сайта и одних и тех же атрибутов стиля выполняется последний стиль в файле css . Ну вот так коротенько ответил. А подробности - здесь - css
TrEK [ 45 ]
Спасибо за http://css.find-info.ru , очень дельный сайт. По нему уже сделал выделение и изменение ссылки при наведении курсора, изменил кнопочки, и другие фичи.
И благодарность за разжовывание информации
Но используя проверку на длину- "if (strlen($words) < 3)" напоролся на очередной косяк.
Безусловно если ввести слово меньше трех букв.. поиск не состоится...
но опять же таки, если ввести подобные запросы как: "Полет на луну", "Вор в законе", "Я люблю тебя","Сон или бодрость", "Из города" - получаеться что запрос более 3 букв... : $words="Вор в законе">3
Но при разбивании массива на составляющие "вор","в","законе" - снова производится поиск по составляющим запроса.
Как можна в условии "if (strlen($words) < 3)" задать чтоб осуществлялась проверка длинны и самого запроса.. и разбитых его составляющих?
Joe [ 46 ]
Дык, опять туда же:
Код function keywords_title_en($words)
{
$keywords = split(' ', $words);
$num_keywords = count($keywords);
for ($i=0; $i<$num_keywords; $i++)
{
if(strlen($keywords[$i])<3) {
if($keywords[$i]!="около") { //анализ на предлог
if ($i)
{
$keywords_string .= "or title_en like '%".$keywords[$i]."%' ";
}
else
{
$keywords_string = "title_en like '%".$keywords[$i]."%' ";
}
}
}
}
return $keywords_string;
}
TrEK [ 47 ]
С применением строки if(strlen($keywords[$i])<3) { поиск вообще не осуществляется ни на какие запросы. (
Joe [ 48 ]
Упссс...
if(strlen($keywords[$i])>3) { //вот так будет правильно
По программированию пару уроков взять - не будет лишним
TrEK [ 49 ]
Так работает.
Но вот беда с союзами.
Я по Вашему примеру сделал:
"if( ($keywords[$i]!="на")&&($keywords[$i]!="в")&&($keywords[$i]!="около") ) {" ну и остальные союзы и часточки.
Теперь при запросе "полет на луну" поиск производится только по словам "полет" и "луну", союз "на" игнорируется поиском. Но при запросе "на море" вылетает ошибка:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /var/www/cinema/search1.php on line 229
в 229 строке имеем строку: $num_rows = mysql_num_rows($result);
Если же сделать запрос "море на"-тогда результат выдается.
Тоесть те частицы, или союзы, что я указал в ($keywords[$i]!="ххх"),которые идут первыми в запросе, дают ошибку при выполенении запроса.
Что за беда все время...
Еще что хотел спросить.. даный скрипт поиска работает только в FireFox..
В Explorer поиск не осуществялется.
Что я заметил, в FireFox по умолчанию кодировка стоит Кириллица (Windows-1251), а в Explorer по умолчанию выставлена Кириллица (Windows). Вот из-за разбежности кодировки Експлоурер и не выводит результат запроса.
Но, если то же название запроса не вписывать вручную в Explorer, а вставить скопированное- тогда будет выводится желаемый результат по запросу (так понял при Ctrl-C|Ctrl-v сохранияется информация о кодировке,или как это понять... даже при скопированном запросе, сам запрос осуществляется из браузера с выставленной кодировкой КириллицаWindows)
Как быть в этой ситуации?
Из дампа моей БД:
DEFAULT CHARSET=cp1251 COLLATE=cp1251_general_cs AUTO_INCREMENT=31690
Кодировку вывода я уже задал перед соединением с БД-
mysql_query('set names cp1251');
Как задать кодировку ввода запроса? Или такое невозможно когда браузер передает информацию совсем в другой кодировке?
Joe [ 50 ]
Одна из самых больших ошибок в программировании - бросаться писать коды, не уяснив точно задачи. В данном конкретном случае вышенаписанная сентенция означает - прежде, чем модифицировать чужой скрипт, надо понять, что он делает.
Код function keywords_title_en($words)
{
$keywords = split(' ', $words);
$num_keywords = count($keywords);
for ($i=0; $i<$num_keywords; $i++)
{
if($keywords[$i]!="на") { //анализ на предлог
if ($i)
{
$keywords_string .= "or title_en like '%".$keywords[$i]."%' ";
}
else
{
$keywords_string = "title_en like '%".$keywords[$i]."%' ";
}
}
}
return $keywords_string;
}
эта функция - формирует предложение WHERE запроса к базе. Она проверяет параметр цикла на равенство нулю и в этом случае не ставит в начале куска OR. Мы модифицировали функцию, соответственно, если у нас не проходит первый кусок запроса, то предложение WHERE начинается с OR, из-за чего скрипт и начинает ругаться. Как выйти из ситуации - решение таких микропроблем - это одна из задач программиста, причем далеко не самая главная. Внимание вопрос - эта задачка - какая-нибудь курсовая-лабораторная или попытка заработать?
По второму вопросу - Кириллица (Windows-1251) и Кириллица (Windows) - суть одно и то же - кодовая страница 1251. Чтобы не мучили сомнения, надо на обеих страничках в метатеге выставить эту кодировку. Скрипт, надо полагать, отлаживается локально?
TrEK [ 51 ]
Согласен, невыясниное программирование - это гиблое дело. Тем более, когда работаешь с чужими скриптами. Но выбора нет- приходиться использовать то,что есть, и учится на том же.
Я то суть скрипта более-менее понял, в некоторых местах правда пролеты с пониманием в некоторых строчках или в структуре скрипта, по ним и спрашиваю.
Засел здесь, чтобы не только понять суть той или иной проблемы, но и узнать их рациональное решение. На счет вопроса: я бы не зацикливался на таких мелочах в курсовой и таким знанием программирования много бы не заработал
Моя стихия - килобиты,и разного типа махинации над пакетами. Там вопросов куча, хотя в той сфере работаю, ну а здесь наверно бесконечное поле...
Когда-то ШТМЛ-ом увлекался,и дизайном поверхностно, а тут от безделья вник в php, раскусил уже его суть и функции. Заинтересовала меня эта "беда"
Вот и парю мозги, для самооценки и познания, а не для какой-либо выгоды.
Так как сомневаюсь,что за все мои старания и сделаный результат, мне не то что платить, а благодарить кто-то будет.
А мои, разного рода вопросы, расширят FAQ здесь для многих, думаю.
========================
На счет кодировок: на страничке где размещен скрипт (и в эту страничку сразу же выводится результат обработки) есть строка
mysql_query('set names cp1251');
там где осуществляется соединение с БД.
В метатегах самой странички указано:
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251" />
Но почему же в Мозилле все работает, а вот в Експлоурере ищет только по скопированному? Это мне невдомек никак.
Ну и хотелось бы по первому вопросу рассмотреть метод решения.
p.s. Скрипт вначале сливаю на компьютер, где правлю в notepad++ , а потом уже заливаю назад на веб-сервер.Тобишь когда я подправлю что-то локально.. те строки будут уже в ЮТФ-8, а не в Киррилица 1251 ?
Joe [ 52 ]
Поскольку параметр цикла после нашего изменения скрипта больше не работает как индикатор первого куска (без OR) - надо завести новую переменную для этой цели, приравнять нулю, в цикле проверять и модифицировать. Предварительно взять букварь по php и посмотреть, что такое цикл по параметру, цикл с предусловием, цикл с постусловием (это для общего развития ).
TrEK [ 53 ]
Джо, на примере не могли бы помочь?..
Тяжко мне понять все из выше Вами написаного..
Joe [ 54 ]
function keywords_title_en($words)
{
$keywords = split(' ', $words);
$num_keywords = count($keywords);
$i2=0;
for ($i=0; $i<$num_keywords; $i++)
{
if($keywords[$i]!="на") { //анализ на предлог
if ($i2)
{
$keywords_string .= "or title_en like '%".$keywords[$i]."%' ";
}
else
{
$keywords_string = "title_en like '%".$keywords[$i]."%' ";
$i2++;
}
}
}
return $keywords_string;
}
TrEK [ 55 ]
Ага, тоесть мы кроме if ($i)=0, прировняли к нулю и ($i2) ?
Но видимо полное осознание ко мне прийдет после прочтения пшп-букваря и подобной практики.
Я так понял без этого модифицирования OR делало запрос сразу по второму разбитому запрашиваемому словосочетанию? или я не так что-то понял.
Сейчас все работает на ура... все союзы которые вписал в условии поиска уже не являються при выводе результата частями слов. Как замечательно!!! Выражаю благодарность в решении этого трабла!!!
============================
Но вот вопрос работы в IExplorere все же еще не решен.
Уже с этими кодировками запарился. Не могу понять, что же в этом браузере портит запрос.
Joe [ 56 ]
Чисто для смеха в Яндексе OR набери
Сайт в инете или где-то локально стоит?
TrEK [ 57 ]
Что то видимо с поиском у меня не срослось.. прогуглил пару php-порталов, так и не нашел обьяснения о OR. Ну главное что косвенно я понимаю действие функции.
Сайт локально стоит. Что посоветутете с этой проклятой кодировкой?
От чего отталкиватся надо?
На странице со скриптом имею мета-тег:
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251" />
Та часть скрипта,где соединение с БД:
$dbcon = @mysql_connect($hostname,$dbusername,$dbpassword);
mysql_query('set names cp1251');
Сама БД тоже в cp1251.
Что же IExplorer"у мешает?
Joe [ 58 ]
or - по-английски ИЛИ. Таким образом, в функции формируется логическое выражение вида title_en LIKE %бой% OR title_en LIKE %идут% OR title_en LIKE %одни% OR title_en LIKE %старики%, части которого связаны ИЛИ. Т.е. это выражение верно, если хотя бы один из кусков верен. Подробности - описание языка запросов MySQL
Насчет кодировки - http://www.opennet.ru/base/dev/mysql_cp1251.txt.html
TrEK [ 59 ]
Джо, если будет время, подскажите плиз: где искать и чем заменять, просто я перепробовал все что мог, никакой из моих вариантов не подошел.
Вот мой скрипт:
p.s. извиняюсь, что чуть исказил ширину Вашего окна форума своим скриптом.
---------------------------------------------------
Код
<br><br>
<!--///--- Форма ввода поисковой фразы ---///////////////////////////////-->
<form onsubmit="return searchForm(this)" action="search2.php" method="POST">
Введ?ть назву ф?льму: <input name="keyword" size=18>
<!--<input type="image" src="button.gif" name="send" value="Пошук" color="red" width="50" height="20">-->
<input type="submit" style="background: lightblue; line-height:12px; color:brown" name="send" value="Пошук">
</form>
</center><br>
<Hr size="6">
<br>
<?php
//--- Функции, которые разделяют строку на ключевые слова и формируют запрос ---////////
//--- Отредактируйте название столбцов таблицы (or text like), в которых вы хотите производить поиск ---//
function keywords_title($words)
{
$keywords = split(' ', $words);
$num_keywords = count($keywords);
$i2=0;
for ($i=0; $i<$num_keywords; $i++)
{
if(strlen($keywords[$i])>1) {
if(($keywords[$i]!='на')&&($keywords[$i]!='из')&&($keywords[$i]!='в')&&($keywords[$i]!='не')&&($keywords[$i]!='ее')&&($keywords[$i]!='его')) { //анализ на предлог
if ($i2)
{
$keywords_string .= "or title like '%".$keywords[$i]."%' ";
}
else
{
$keywords_string = "title like '%".$keywords[$i]."%' ";
}
}
}
}
return $keywords_string;
}
function keywords_title_en($words)
{
$keywords = split(' ', $words);
$num_keywords = count($keywords);
$i2=0;
for ($i=0; $i<$num_keywords; $i++)
{
if(strlen($keywords[$i])>1) {
if(($keywords[$i]!='на')&&($keywords[$i]!='из')&&($keywords[$i]!='в')&&($keywords[$i]!='не')&&($keywords[$i]!='ее')&&($keywords[$i]!='его')) { //анализ на предлог
if ($i2)
{
$keywords_string .= "or title_en like '%".$keywords[$i]."%' ";
}
else
{
$keywords_string = "title_en like '%".$keywords[$i]."%' ";
}
}
}
}
return $keywords_string;
}
//--- Получаем строку запроса из формы, обрабатываем и с применением выше написанных функция, получаем массив ключевых слов ---/////
if(isset($_POST['send']))
{
$words = trim($_POST['keyword']);
$words = strip_tags($words);
$words = str_replace("'", "", $words);
$words = str_replace('"', "", $words);
$words = str_replace("-", "", $words);
$words = str_replace(",", "", $words);
$highlight = str_replace(" ", "|", $words);
if (strlen($words) <3)
{
echo '<center><font size=3 color=brown><b>Не вказан? ключов? слова</b></font><marquee width=20 hight=8 direction=right scrollamount=2 bgcolor=gray behavior=alternate>%</marquee></center>';
}
else
{
$var = keywords_title($words);
$var2 = keywords_title_en($words);
# echo $var. $var2;
# echo $words;
if(($var) || ($var2))
{
//--- Данные для соедининия с базой данных ---/////////////////////
//--- Если устанавливаете на локальном компьютере, оставте по умолчанию ---/////
$hostname = "localhost"; //--- Имя хоста (обычно localhost)
$dbusername = "log1n"; //--- Имя пользователя
$dbpassword = "pa55w0rd"; //--- Пароль для соединения с базой
$dbname = "filmbd"; //--- Название базы данных
$dbcon = @mysql_connect($hostname,$dbusername,$dbpassword);
#mysql_query('SET character_set_database = utf8');
#mysql_query('SET NAMES utf8');
mysql_query('set names cp1251'); # TrEK dobavuv
mysql_query('SET character_set_database = cp1251'); #TrEK dobavuv
#skip-character-set-client-handshake;
#mysql_query('set names Windows'); # TrEK dobavuv
if (!$dbcon) exit("<p>Выдсутн?й доступ до cервера MySQL!</p>");
if (!@mysql_select_db($dbname,$dbcon)) exit("<p>Hе доступна база данних</p>");
$sql = "SELECT id, title, title_en FROM film WHERE ".$var." OR ".$var2.""; // original
# $sql = "SELECT id , title, title_en FROM film WHERE title_en='$keyword'";
$result = mysql_query($sql);
$num_rows = mysql_num_rows($result);
if ($num_rows <= 0)
{
echo '<center>По Вашому запиту н?чого не знайдено,<br />спробуйте по ?накшому сформулювати ключов? слова.</center>';
}
else
{
#$ip = getenv ("REMOTE_ADDR");
#echo $ip;
##echo $REMOTE_ADDR;
echo '<center>По вашому запиту <span style="background-color: yellow;"><font color=red><b>'.$words.'</b></font></span> знайдено '.$num_rows.' рядк?в</center>';
while(list($id, $title, $title_en) = mysql_fetch_array($result))
echo '<table width="600" height="20" align="center" border="2" cellpadding="3" cellspacing="0" bgcolor="lightgrey">
<!--DWLayoutTable-->
<tr>
<td id="w" width="700" height="20" valign="middle"><a href="http://films.ternopiltele.com/?page=item&id='.$id.'" title="'.$title.'"> '.$title_en.' - </font color=black><b>'.$title.'</b></font></a></td>
</tr></table>';
}
}
}
}
?>
Joe [ 60 ]
С эстетической точки зрения скрипт выглядит совершенно безобразно, а в области вывода - скорее всего есть ошибки - ковыряться не хочется, но закрывающих фигурных скобок явно больше чем открывающих. Кроме того, получается, что выводится на каждом шаге цикла новая таблица. Я уже вообще не верстаю таблицами, но даже для табличной верстки это чересчур.
А реализовать подсветку можно так -
с помощью махинации, подобной использованной в функции keywords_title($words) сформировать массив только из проверяемых слов, к примеру обозвать его $keywords2, затем в цикле вывода добавить span
while(list($id, $title, $title_en) = mysql_fetch_array($result)) {
for($i2=0; $i2<$num_keywords2; $i2++) {
$title=str_replace($keywords2[$i2],"<span>$keywords2[$i2]</span>",$title);
$title_en=str_replace($keywords2[$i2],"<span>$keywords2[$i2]</span>",$title_en);
}
echo '<table width="600" height="20" align="center" border="2" cellpadding="3" cellspacing="0" bgcolor="lightgrey">
<!--DWLayoutTable-->
<tr>
<td id="w" width="700" height="20" valign="middle"><a href="http://films.ternopiltele.com/?page=item&id='.$id.'" title="'.$title.'"> '.$title_en.' - </font color=black><b>'.$title.'</b></font></a></td>
</tr></table>';
}
в css -
span{color:red;background:yellow}
TrEK [ 61 ]
Не совсем понял.
Это надо сделать еще одну функцию? Которая формирует массив, как keywords_title($words) и keywords_title_en($words) ?
Или это условие что Вы вставили то, что надо для создания массива?:
Код
{
for($i2=0; $i2<$num_keywords2; $i2++) {
$title=str_replace($keywords2[$i2],"<span>$keywords2[$i2]</span>",$title);
$title_en=str_replace($keywords2[$i2],"<span>$keywords2[$i2]</span>",$title_en);
}
Joe [ 62 ]
Фукцию делать не надо - надо сформировать массив проверяемых слов (я обозвал его $keywords2), используя внутренность функции. for - это не условие, а цикл.
Joe [ 63 ]
$keywords = split(' ', $words);
$num_keywords = count($keywords);
$i2=0;
for ($i=0; $i<$num_keywords; $i++)
{
if(strlen($keywords[$i])>1) {
if(($keywords[$i]!='на')&&($keywords[$i]!='из')&&($keywords[$i]!='в')&&($keywords[$i]!='не')&&($keywords[$i]!='ее')&&($keywords[$i]!='его')) { //анализ на предлог
$keywords2[$i2] = $keywords[$i];
$i2++;
}
}
}
вставить перед
while(list($id, $title, $title_en) = mysql_fetch_array($result))
SlavaS [ 64 ]
Подскажите как сделать,
например есть 2 таблицы, в каждой там по 5 столбцов, нужно сделать поиск по определенному столбцу каждой таблицы.
Если например данные из 1 таблицы совпали с данными во второй, чтоб они зачеркивались в 1 таблице или другим светом отображались например.
Joe [ 65 ]
Думаю, надо написать подробное ТЗ - см. http://webmaster.sbridge.ru/wm19.php , чтобы уяснить себе задачу. Тогда можно будет определиться с решением задачи - структурой данных базы и написанием скрипта. Вполне возможно, что 2 поиска делать не надо - просто связать таблицы. Более-менее рабочий скрипт поиска с подсветкой результатов есть в комментариях к http://webmaster.sbridge.ru/wm15.php .
Петр [ 66 ]
табличка выводится на новой страничке .php ?
если да, то каким образом её(табличку) вернуть или сразу раскрыть на странице где делалась(писалась) форма поиска
Joe [ 67 ]
В теге form написать action="" и будет после нажатия submit грузиться та же страница. Нужно проанализировать переменные формы и при выполнении нужного условия вывести то, что нужно.
Demokrat [ 68 ]
Приветствую Joe, Есть вот такой вопрос у меня
C помощью оператора LIKE, через GET или POST задать слово поиска?
т.е поясню вот таким образом..
$like= ;/ как правильно присвоить текстовому полю?
т.е для (<input type="text" name="cena" size="60" value="">)
$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);
};
Joe [ 69 ]
Целый букет ошибок разного сорта. Сначала отвечаю на вопрос - из формы в скрипт поиска передается переменная $cena из name="cena"
Ошибки -
в предложении WHERE - вообще не понятно, что нужно;
нет баланса скобок;
в выводе неправильное обращение к элементу ассоциативного массива.
Кроме того, имеет место нехорошая практика использования служебных слов в качестве переменных.
Это только то, что бросается в глаза.
Рекомендую взять мой скрипт и установить у себя, убедиться, что он работает и потом осторожно изменить под свою задачу.
Андрей [ 70 ]
У меня к Вам вот какой вопрос - если у меня в таблице есть номер 123456789 а пользователь забивает его 123 456 789 как создать запрос чтобы он исключал пробелы и выдавал 123456789. Заранее благодарен.
P.S. Сейччас запрос выглядит так:
$query = ("SELECT * FROM $table WHERE number LIKE '$search%' OR
number1 LIKE '$search%' OR analog LIKE '$search%' OR analog1 LIKE '$search%'");
Джо [ 71 ]
Можно так - LIKE 'REPLACE($search," ","")%'
Trey [ 72 ]
здрасьте! у меня на строчке:
$result1 = mysql_query ("SELECT * FROM Zaemschiki WHERE Familiya LIKE '%strtoupper($_POST['zaem'])%'");
выводится такая ошибка:
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING
когда я убираю кавычки у слова zaem
%strtoupper($_POST[zaem])%
то ошибка исчезает, но ничего не выводится. в чем проблема??
Joe [ 73 ]
попробуйте так:
$result1 = mysql_query ("SELECT * FROM Zaemschiki WHERE Familiya LIKE '%strtoupper(".$_POST['zaem'].")%'");
Trey [ 74 ]
теперь ошибка не выходит, но продолжается непоявление результатов). вот листинг кода:
<form action="poiskzaem.php" method="post">
Фамилия заемщика<br>
<input type="text" name="zaem" size="60" value="">
<input type="submit" name="submit" value="Искать">
<input type="reset" name="reset" value="Очистить">
</form>
printf (" <table align='center' class='manager'>
<tr>
<td class='manager_title'>
<p class='manager_name'>%s %s %s</p>
<p class='tekst'>Дата рождения: %s</p>
</td>
<td></td> </tr>
</table><br><br>", $myrow1["Familiya"], $myrow1["Imya"], $myrow1["Otchestvo"], $myrow1["Birthday"]);
Trey [ 75 ]
до printf забыл:
$result1 = mysql_query ("SELECT * FROM Zaemschiki WHERE Familiya LIKE '%strtoupper(".$_POST['zaem'].")%'");
$myrow1 = mysql_fetch_array ($result1);
Joe [ 76 ]
в тексте статьи теперь - правильный вариант ;-) - вот так должно получиться:
$result1 = mysql_query ("SELECT * FROM Zaemschiki WHERE Familiya LIKE '%".strtoupper($_POST['zaem'])."%'");
Trey [ 77 ]
возник вопрос при использовании radio button.
Необходимо сделать так чтобы допустим когда я ввожу в поле для поиска фамилию, а radio стоит на поиске по имени, то надо чтобы выводилось сообщение что неправильно организован поиск.
вот код формы:
<form action="poiskzaem.php" method="post">
<TABLE><TR><TD>
</TR>
<TR><TD>
<input type="text" name="zaem" size="60" value="">
<input type="submit" name="submit" value="Искать">
<input type="reset" name="reset" value="Очистить">
<br>
<input name="r_button" type="radio" value="Familiya" checked>По Фамилии
<input name="r_button" type="radio" value="Imya" >По Имени
</TD></TR>
</TABLE>
</FORM>
вот код принимающего файла:
$r_b=isset( $_POST['r_button'] ) ? $_POST['r_button'] : '';
switch( $r_b )
{
case 'Familiya':
$result1 = mysql_query ("SELECT * FROM Zaemschiki WHERE Familiya LIKE '%".strtoupper($_POST['zaem'])."%'");
$myrow1 = mysql_fetch_array ($result1); break;
case 'Imya':
$result1 = mysql_query ("SELECT * FROM Zaemschiki WHERE Imya LIKE '%".strtoupper($_POST['zaem'])."%'");
$myrow1 = mysql_fetch_array ($result1); break;
printf (" <table align='center' class='manager'>
<tr>
<td class='manager_title'>
<p class='manager_name'>%s %s %s</p>
<p class='tekst'>Дата рождения: %s</p>
</td>
<td></td> </tr>
</table><br><br>", $myrow1["Familiya"], $myrow1["Imya"], $myrow1["Otchestvo"], $myrow1["Birthday"]);
Joe [ 78 ]
Советую плюнуть на эту идею - придется перебирать все существующие в природе фамилии и имена. Правда, можно ограничиться теми, которые есть в базе и при их нахождении выводить какое-нибудь ругательство.
Trey [ 79 ]
ага.спасибо)) а вот еще вопрос. на странице надо сделать select menu. то есть выпадающее меню где будут находиться имена заемщиков вызываемых из базы данных.
Таблица Заемщиков Zaemschiki (Familiya, Imya, Otchestvo) надо чтобы при нажатии на стрелочку ниспадающего меню выводились не просто только Фамилия или Имя заемщиков, а соединенная ФИО, то есть например "Иванов Иван Иванович"
Trey [ 80 ]
ну и естественно в таблице Zaemschiki есть поле id))забыл вписать
Joe [ 81 ]
а в чем проблема-то?
в цикле
while ($line = mysql_fetch_array($result, MYSQL_NUM)) {
echo "<option value=\"".$line[0]." ".$line[1]." ".$line[2]." ".$line[3]."\">".$line[0]." ".$line[1]." ".$line[2]." ".$line[3]."</option>";
}
примерно такая бяка, только индексы $line - свои.
Trey [ 82 ]
че-то я не могу понять как этот цикл вставить в текст. Какие индексы вставлять надо? Надо Выводить в выпадающем меню только Фамилию, Имя и Отчество менеджера. Где тут что исправить?:
$result = mysql_query ("SELECT id_man,Imya2,Familiya2,Otchestvo2 FROM managers",$db);
printf (" <table align='center' class='manager'>
<tr>
<td class='manager_title'>
<p class='dogovor' align='JUSTIFY'> Банк ОАО \"БАНК\" в лице менеджера по выдаче кредитов
while ($line = mysql_fetch_array($result, MYSQL_NUM)) {
echo "<option value=\"".$line[0]." ".$line[1]." ".$line[2]." ".$line[3]."\">".$line[0]." ".$line[1]." ".$line[2]." ".$line[3]."</option>";
}
действующий на основании устава банка ОАО \"УРАЛСИБ\", именуемый в дальнейшем \"Банк\" и т д...
Joe [ 83 ]
Вставить этот цикл там, где выводится форма. $line[0] - это id, его нужно убрать.
С помощью у меня теперь порядок такой - если ответ занимает больше 5 минут - это уже называется платной консультацией или заказом. Денег я пока беру немного )))
Так что если очень срочно - сюда - http://webmaster.sbridge.ru/contacts.php
Trey [ 84 ]
А как он поймет что $line[1] -это Фамилия, $line[2]- Имя, $line[3]- Отчество? и что за индексы 1,2 и 3?
Joe [ 85 ]
SELECT id_man,Imya2,Familiya2,Otchestvo2 FROM managers
mysql_fetch_array - считывает строку результата запроса в массив $line в соответствии с порядком полей в запросе. Индексы массива начинаются с 0.
Алексей [ 86 ]
Доброе время суток!
Возник вопросик, если не трудно то объясните пожалуйста.
В таблице забиты данные в виде 1234567890.
Как сделать чтоб выводило данные поиска, если в форму отправки забито 12345-67890 (то есть, чтобы находил и с "-" и без него.
Joe [ 87 ]
Функцией str_replace замените - на "" в передаваемой переменной.
Алексей [ 88 ]
Еще раз спасибо за подсказку 4 поста назад.
Возник еще вопрос
Необходимо сделать несколько запросов по 2 таблицам
1 запрос:$query = "SELECT * FROM Таблица?1 WHERE UPPER(name_mag) LIKE '%".strtoupper($_POST['nmag'])."%'";
$result = mysql_query($query) or die("Запрос ошибочный");
$line = mysql_fetch_array($result, MYSQL_NUM
И исходя из этого массива
еще 4 запроса
$dat = "SELECT * FROM Таблица?2 WHERE UPPER(name_mag) LIKE '%".strtoupper($line[0])."%'";
$result1 = mysql_query($dat) or die("Запрос
ошибочный");
$dat1 = "SELECT * FROM Таблица?2 WHERE UPPER(name_mag) LIKE '%".strtoupper($line[1])."%'";
$result2 = mysql_query($dat1) or die("Запрос ошибочный");
и так в сумме 4 раза
а потом вывести результат поиска по Таблице 2 по всем 4 запросам.
Подскажи пожалуйста (не полностью скрипт конечно),
а так сказать точку от чего оттолкнутся в данной задаче. Хочется понять а не скопипастить текст скрипта.
Joe [ 89 ]
Лучше по-русски написать, что нужно. Получится ТЗ и с ним уже можно работать. В этом сумбуре я понял одно - хочется что-то поискать в результате. Один из вариантов решения - вложенный запрос.
Алексей [ 90 ]
Согласен.
Есть таблица 1 в ней 5 столбцов (во всех номера, в первом столбце повторений нет) это таблица замен(идентичного товара с разными номерами)
зам0/зам1/зам2/зам3/зам4
Есть таблица 2(обычный прайс лист ?/имя/кол-во/цена/поставщик/срок поставки.
Нужно что бы введенная информация в форму на сайте сначала искалась в таблице 1(находила имеющиеся замены)
а потом искала в таблице 2 (по каждому столбцу из найденного в таблице 1, тоесть: 1 запрос ([зам0] из таблице 1 по таблице 2);2 запрос ([зам1] из таблице 1 по таблице 2); и т.д. в сумме 5 раз
и вывод найденного в таблице 2 по всем 5 запросам.
Джо [ 91 ]
Очень большая неоднозначность при поиске по куску названия. На мой взляд, надо делать так:
1) по куску названия найти все подходящие названия;
2) из них вручную выбрать то, что нужно;
3) по id (артикулу) этих деталей определить id деталей-замен;
4) по всем id вывести данные по деталям.
Алексей [ 92 ]
Привет Джо.
Возник еще вопрос.
Если по запросу к таблице из 5 колонок, найдено 4 строки, получается 20 вариантов.
И нужно все 20 запросить по очереди.
Как это сделать, не пойму что нужно вставлять в запрос?
$query = "SELECT * FROM publications WHERE UPPER(name_mag) LIKE '%".strtoupper($НЕ ПОЙМУ ЧТО ВСТАВЛЯТЬ)."%'";
Подскажи пожалуйста.
Джо [ 93 ]
Для начала надо осознать разницу между поиском по совпадению части строки LIKE и поиском по точному соответствию. Раз ты уже нашел 20 деталей, которые тебя устраивают, значит, их данные надо вытаскивать из базы по точному соответствию id ( артикула )
Алексей [ 94 ]
Привет Джо.
Пытался разобраться, перечитал кучу сайтов-учебников по PHP, но так и не понял как вытащить id из того что получилось. Печаль
Джо [ 95 ]
По куску названия ищешь в прайсе. Результатом может быть несколько строк. Из них выбираешь те товары, которые тебя устраивают (их id). В таблице замен должны быть id ( артикулы ) товаров. Запрос может быть один с помощью AND . Ну вот, как делать - разжевано.
Если и сейчас непонятно, поможет только полное решение задачи. А это уже совсем другая не бесплатная история.
Alex [ 96 ]
Спасибо.
Я полный 0 в пхп, эта задача не горит, по этому хотел разобраться сам для самообразования. Заказывать все равно собирался у тебя, так как все сделать все равно не смогу.
Я не пойму одного, как из результата запроса выдрать ID всех строк, по первой строке понятно $массив[?столбца], а вот со второй строкой и далее не пойму.
Джо [ 97 ]
Алексей id присутствует в каждой строке результата запроса, mysql_fetch_array преобразует в цикле каждую строку в массив и для любой строки результата запроса будет спроведливо $массив[?столбца].
fil.diesel [ 98 ]
В первую очередь спасибо огромное за ваш труд!!!
и сразу вопрос..
Ни как не могу понять в чем ошибка((
по результату запроса выводит по два одинаковых значения..
таблица состоит из двух колонок
1 назвние;
2 описание.
код
$query = "SELECT * FROM base_num WHERE UPPER(title) LIKE '%".strtoupper($_POST['nmag'])."%'";
$result = mysql_query($query) or die("Запрос ошибочный");
if (mysql_num_rows($result)!=0) {
/* Печать результатов в HTML */
print "<table id=\"latest\">
<tr>
<th class=\"num\"><strong>Название</strong></th>
<th class=\"num\"><strong>Описание</strong></th>
</tr>
\n";
while ($line = mysql_fetch_array($result, MYSQL_NUM)) {
print "\t<tr>\n";
for ($i=1;$i<=2;$i++) { print "\t\t<td>$line[$i]</td>\n"; }
print "\t</tr>\n";
}
print "</table>\n";
}
else print "Неправильно введён номер";
верхнюю и нижнюю частькода не стал писать.
Joe [ 99 ]
for ($i=0;$i<2;$i++) - индекс с нуля - в этом, наверное, все дело
tomaticus [ 100 ]
приветствую всех. Joe вроде самы опытный:),можешь мне помочь? У меня есть таблица,когда я делаю действие,в неё записывается число 1. Когда это действие я делаю ещё раз,она должна прочесть первое значение,это 1,инкринировать её,тоесть уже 2,и записать в тот же столбик цифру 2. А не создавать новый столбик. И потом когда ты ещё раз сделаешь,опять читает,инкринирует,записывает. Зароанее спасибо
Joe [ 101 ]
Четкая формулировка задачи - наполовину решение. Таблица - в MySql? или просто массив?
Если MySql - то в общих чертах решение такое:
1. действие оформить как функцию;
2. в функции поставить строку-запрос к базе;
3. запрос будет выглядеть примерно так: UPDATE table SET col=col+1
Dmitry [ 102 ]
Ребят, у меня такой вопрос!
У меня есть таблица "name" со структурой:
fam (фамилия)
name (имя)
otch (отчество)
Я никогда не организовывал поиска по базе данных, поэтому ПРОШУ помощи! Необходимо, чтобы при вводе в текстовое поле:
<form action="formp.php" method="post">
Введите данные:<br><input type="text" name="sotr" size="60" value="">
<input type="submit" name="submit" value="Искать">
<input type="reset" name="reset" value="Очистить">
</form>
Выводились данные сотрудника, соответствующие поиску(ввёл фамилию, вывелась фамилия, имя, отчество находящееся в таблице)!
Я почитал предыдущие посты и максимум чего удалось добиться в этой теме, так это вывод ВСЕХ полей таблицы, а НАДО конкретных!
Что нужно сделать в этом коде? :
<?php
$hostname = "localhost";
$username = "root";
$password = "";
$dbName = "Stat_forms";
MYSQL_CONNECT($hostname, $username, $password) OR DIE( "Ошибка!");
$query = "SELECT * FROM name WHERE UPPER(fam) LIKE '%".strtoupper($_POST['sotr'])."%'";
$result = mysql_query($query) or die("Запрос ошибочный!");
if (mysql_num_rows($result)!=0) {
print "<table id=\"latest\">
<tr>
<th class=\"num\"><strong>Фамилия</strong></th>
<th class=\"num\"><strong>Имя</strong></th>
<th class=\"num\"><strong>Оочество</strong></th>
</tr>
\n";
while ($line = mysql_fetch_array($result, MYSQL_NUM)) {
print "\t<tr>\n";
for ($i=0;$i<2;$i++) { print "\t\t<td>$line[$i]</td>\n"; }
print "\t</tr>\n";
}
print "</table>\n";
}
else print "Неправильно введён номер";
Joe [ 103 ]
$query = "SELECT fam, name, otch FROM name WHERE UPPER(fam) LIKE '%".strtoupper($_POST['sotr'])."%'";
Don't worry, be happy )))
Sveta [ 104 ]
Здравствуйте!!!Как сделать чтоб поиск был по нескольким параметрам. есть таблица с полями: вид документа, инвентарный номер, название, год.
надо чтоб вводишь например вид документа, инвентарный номер, год, он выводил строки с этим данными, вводишь один какой нибудь параметр тоже выводит данные.
Joe [ 105 ]
В этой статье есть подобный пример: http://webmaster.sbridge.ru/wm22.php
В этой же статье написано о разнице в обработке текстовых и числовых полей.
Sveta [ 106 ]
спасибо огромное, все получилось.
как сделать постраничный вывод таблицы с переходам на страницы, таблица очень большая, много строк.
Joe [ 107 ]
В той же статье есть рекомендация использовать LIMIT, а как делать странички - таких рекомендаций в сети море. В самом общем виде - сделать ссылки на страницы вида <a href="/?page=2">2</a>, где 2 - номер_страницы. В переменной $_GET["page"] страницы будет ее номер, LIMIT будет выглядеть следующим образом - LIMIT (номер_страницы-1)*количество_строк_на_странице , количество_строк_на_странице
Вера [ 108 ]
Помогите пожалуйста чайнику. У меня на сайте недавно начал срезается текст справа в некоторых категориях. Мне подсказали что это из за того что я вставляла текст из ворда и засорилась БД. Подскажите где искать мусор и как его почистить. http://www.pasidelki.ru/ot0d3/ym.html - вот страница ошибки. Буду благодарна за ответ и простите если задаю глупые вопросы - это мой первый сайт.
Joe [ 109 ]
Ворд здесь совершенно ни при чем - все параграфы измените так <p style="text-align: justify; padding-right: 10px"> и проблема исчезнет. А как нужно верстать грамотно, красиво и просто - в моих статьях о структурной верстке:
http://webmaster.sbridge.ru/wd-rat.php
Laycman [ 110 ]
Уважаемый Джо, продолжаю постигать азы веб программирования, подскажи пожалуйста, сделал все как у тебя написано (в т.ч таблицу http://webmaster.sbridge.ru/wm13.php) создал простенькую страничку на ней разместил форму для поиска в той же директории создал poiskmag.php, но при нажатии искать в браузере открывается пустая страничка, что может быть не так?
Это опять с кодировкой что то, если в строку поиска ничего не ввожу то выводит вместо русских бкв знаки вопросов, хотя везде сделал ut8
Джо [ 111 ]
возможно, дело в этом:
www.opennet.ru/base/dev/mysql_cp1251.txt.html
laycman [ 112 ]
Да действительно в этом загвоздка, спасибо тебе огроменное! И можно еще один вопрос, результат поиска он выводит на чистый лист, подскажи как сделать что бы результат выводился в html таблицу?
Joe [ 113 ]
добавь в таблицу bordercolor
Puk [ 114 ]
Надеюсь, пост ещё живой:)
Скрипт классный:) Но я ещё "студент" в этом деле поэтому есть пара вопросов.
1) Как сделать так, что бы поиск осуществлялся по первым буквам данных, а не по всей сторке? Т.е. пишешь п поиске, например, Ку. И в результате видешь все слова, которые начинаются с Ку, а не все слова в которых присутствует Ку?
2)Как на результат вывода повесить линк? Например в таблице есть Колонка "Название" и Колонка "Данные". Поиск проводится по колонке "Название". В результате видем все названия. Тыркаем на линк, и рядом (или на другой странице), появляется информация из колонки "Данные".
kamarilia [ 115 ]
Привет, Женя. У меня вопрос по твоему скрипту поиска. Допустим, искать нужно не только по названию, а ещё и по другим параметрам, например, адрес там или ещё что-то. Если заполнены все поля - тогда всё понятно, а вот как сделать так, чтобы если пользователь заполняет одно поле, а остальные игнорирует, чтоб искало только по этому полю, или если 2 заполнено, то чтобы третье в запросе не участвовало, а не приравнивалось к нулю?
Джо [ 116 ]
Привет! Только приехал, отвечаю - в SQL-запросе соединяешь AND только условия для заполненных полей формы:
if ($_POST['pole3'] != "") $query = $query."AND(UPPER(pole3) LIKE '%".strtoupper($_POST['pole3'])."%')"
Joe [ 117 ]
Puk, отвечаю:
1) убрать первый процент(%);
2) в одном из полей строки должен быть адрес данных, а в строке вывода - что-то вроде:
print "\t\t<td><a href=\"$line['url']\">$line['name']</a></td>\n";
mercer [ 118 ]
Привет, Джо. Вот мой скрипт поиска.
include ('connect.php');
if (strlen($_POST['str']) == 0)
{
echo "<p><font color = red><b>ПУСТОЙ ЗАПРОС</b></font></p>";
}
else if (strlen($_POST['str']) < 3)
{
echo '<p>Слишком короткий поисковый запрос.</p>';
}
else {
$reg = $_POST['region'];
$q = $_POST['str'];
$q = trim($q);
$q = htmlspecialchars($q);
$q = mysql_real_escape_string($q);
$q = stripslashes($q);
$rq = explode(" ",$q);
if ($reg == 'any') {
foreach ($rq as $word)
{
$query = "SELECT id,url,title FROM search WHERE text LIKE '%$word%' OR title LIKE '%$q%' OR meta LIKE '%$word%'";
$result = mysql_query($query);
if (mysql_num_rows($result) != 0)
break;
}
}
else if ($reg == 'all')
{
$query = "SELECT id,url,title FROM search WHERE text LIKE '%$q%' OR title LIKE '%$q%' OR meta LIKE '%$q%'";
}
$result = mysql_query($query);
if (!$result)
{
echo "Ошибка при запросе: ";
exit(mysql_error());
}
$myarray = array(); // создаем пустой массив, страховка
if (mysql_num_rows($result) != 0)
{
$n = mysql_num_rows($result); // Узнаем количество элементов в выборке
echo '<p>По запросу <b> "'.$q.' "</b> найдено: </p>';
for($i = 0; $i < $n; $i++){
$myarray[] = mysql_fetch_array($result);
}
$l=1;
foreach($myarray as $value)
{
echo '<li><p>'.$l.". ".$value['title'].'<br/>';
//////НАПРИМЕР ЗДЕСЬ/////
echo '<a href='.$value['url'].'>'.$value['url'].'</a></li><hr/>';
$l++;
}
}
else echo '<p>По запросу <b>"'.$q.'"</b>ни чего не найдено </p>';
}
И вот такой вопрос, как можно реализовать вывод(//////НАПРИМЕР ЗДЕСЬ///// - в этом месте) результата в виде небольшого куска строки, содержащей искомое ключевое слово, содержащееся в таблице text, по которой собственно производится поиск
Спасибо тебе огромное!
Joe [ 119 ]
Привет!
Букв много, а вопрос толком не сформулирован. Если этот скрипт создан для вывода этого самого небольшого куска строки, что мешает вывести кусок строки?
Хорошо поставленный вопрос уже содержит в себе половину ответа.
Попытайся переформулировать вопрос, чтобы ты сам понял, что тебе нужно, и чтобы я это понял.
А главное - ужми текст вопроса до необходимого и достаточного минимума.
mercer [ 120 ]
Я хотел спросить, какими функциями можно из текстовой таблицы "text" выбрать и вывести в результат поиска одну строку, в которой содержится искомая фраза (или ключевое слово).
Joe [ 121 ]
уже ближе к делу )
1. найти слово - stripos() - указывает номер первой буквы слова.
2. substr() - выбирает подстроку нужной длины с нужной позиции.
а вообще строка в php - одномерный индексный массив. Признак конца строки - \0 .
mercer [ 122 ]
Спасибо огромное, Джо, все получилось.