Показать полную графическую версию : [решено] Поиск в таблице mysql через формы+php
Создал форму где 13 форм типа text, каждая соответствует определённому сталбцу таблицы, форма применяет скрипт:
<?php
require_once "zashita.php";
require_once "bdconnect.php";
mysql_query("SET NAMES cp1251");
$sSQL="SELECT * FROM `dogovor`, `bank`, `periodichnost`, `sposob_oplati`, `sposob_peredachi`, `status`, `vid_billinga`, `vid_oplati` WHERE dogovor.bank_id=bank.id_bank and dogovor.periodichnost_id=periodichnost.id_periodichnost and dogovor.sposob_oplati_id=sposob_oplati.id_sposob_oplati and dogovor.sposob_peredachi_id=sposob_peredachi.id_sposob_peredachi and dogovor.status_id=status.id_status and dogovor.vid_billinga_id=vid_billinga.id_vid_billinga and dogovor.vid_oplati_id=vid_oplati.id_vid_oplati and dogovor.date_dog='$date_dog' and dogovor.n_dog LIKE '%$n_dog%' and dogovor.name_org LIKE '%$name_org%' and dogovor.komissia='$komissia' and dogovor.dop_sogl='$dop_sogl' and dogovor.inn='$inn' and dogovor.r_schet='$r_schet' and dogovor.boss='$boss' and dogovor.kontakt_l='$kontakt_l' and dogovor.kont_phone='$kont_phone' and dogovor.adres='$adres' and dogovor.primech='$primech' and dogovor.e_mail='$e_mail'";
$result=mysql_query($sSQL, $link);
if (mysql_num_rows($result) == 0) echo"Результат запроса : 0";else
if (mysql_num_rows($result) > 0)
while ( $myrow = mysql_fetch_array($result) ):
?>
Дело в том что данный скрипт ни чего не хочет находить. Если мы оставим только одино значение например
dogovor.n_dog LIKE '%$n_dog%'
он работает, я подумал может нужно в место and нужно применить or т.е. "или" но он показывает в результате всю таблицу да и ещё одну строку несколько раз!
Знаю что если я сделаю банальный sql запрос он будет работать но как этот принцип применить в php?
Может стоит в одной странице сделать 13 форм с различным вариантом поиска, и пусть клиент сам решает что и где искать!? Это конечно выход, но....
Tonny_Bennet
11-05-2012, 14:35
В критерии WHERE у вас используется точное равенство. А в "рабочем" примере ниже вы используете Like т.е. похожее значение. И если вы используете логический and вы тоже должны понимать что если хоть одно сравнение будет faslse то результатом будет 0 строк.
Покажите пожалуйста одну строку из таблицы и конкретный пример который по-вашему должен вывести данную строку. Ну и что соответственно выводит если не то что вы хотели бы.
1. выведите текст ошибки echo mysql_error($link);
2. лучше выделить связку таблиц из условия (join)
И если вы используете логический and вы тоже должны понимать что если хоть одно сравнение будет faslse то результатом будет 0 строк. »
Исходя из этого я так понимаю что в php требуется особым методом указать пустое поле формы!? но как?
Покажите пожалуйста одну строку из таблицы и конкретный пример который по-вашему должен вывести данную строку. Ну и что соответственно выводит если не то что вы хотели бы. »
Он на данный момент ни чего не выводит! Если сделать только одно поле формы и в скрипте поиска указать только один параметр, он находит и показывает! Когда есть несколько и не известно в каком из них клиент пожелает искать, тут уже проблемы начались!
выведите текст ошибки echo mysql_error($link); »
Ни чего кроме сообщении что результат 0.
2. лучше выделить связку таблиц из условия (join) »
Не очень понял!
2. http://dev.mysql.com/doc/refman/5.6/en/join.html
может нужно в место and нужно применить or т.е. "или" »
группируйте в скобки как нужно "... and (... or ... or ...) and ..."
http://dev.mysql.com/doc/refman/5.6/en/operator-precedence.html
ааааааа т.е. запись подобного типа должно быть?
<?php
require_once "zashita.php";
require_once "bdconnect.php";
mysql_query("SET NAMES cp1251");
$sSQL="SELECT * FROM `dogovor`, `bank`, `periodichnost`, `sposob_oplati`, `sposob_peredachi`, `status`, `vid_billinga`, `vid_oplati` WHERE dogovor.bank_id=bank.id_bank and dogovor.periodichnost_id=periodichnost.id_periodichnost and dogovor.sposob_oplati_id=sposob_oplati.id_sposob_oplati and dogovor.sposob_peredachi_id=sposob_peredachi.id_sposob_peredachi and dogovor.status_id=status.id_status and dogovor.vid_billinga_id=vid_billinga.id_vid_billinga and dogovor.vid_oplati_id=vid_oplati.id_vid_oplati and (dogovor.date_dog LIKE '$date_dog' OR dogovor.n_dog LIKE '%$n_dog%' OR dogovor.name_org LIKE '%$name_org%' OR dogovor.komissia LIKE '$komissia' OR dogovor.dop_sogl LIKE '$dop_sogl' OR dogovor.inn LIKE '$inn' OR dogovor.r_schet LIKE '$r_schet' OR dogovor.boss LIKE '$boss' OR dogovor.kontakt_l LIKE '$kontakt_l' OR dogovor.kont_phone LIKE '$kont_phone' OR dogovor.adres LIKE '$adres' OR dogovor.primech LIKE '$primech' OR dogovor.e_mail LIKE '$e_mail')";
$result=mysql_query($sSQL, $link);
if (mysql_num_rows($result) == 0) echo"Результат запроса : 0";else
if (mysql_num_rows($result) > 0)
while ( $myrow = mysql_fetch_array($result) ):
?>
Tonny_Bennet
12-05-2012, 10:15
Исходя из этого я так понимаю что в php требуется особым методом указать пустое поле формы!? но как? »
Давайте на время отойдём от вашего примера и просто посмотрим как сделать правильный запрос с пустыми полями.
Пусть у вас есть таблица с тремя полями Name, Sername, Country. И есть форма также с тремя полями, которые, к примеру, через массив $_GET возвращают значения $_GET['name'], $_GET['sername'], $_GET['country'].
Формируя запрос типа $query = "SELECT * FROM table" вы должны проверять не является ли пустым поле, которое ввёл пользователь. Что-то вроде
$query = "SELECT * FROM table WHERE "
if ($_GET['country'] != "")
{
$query = $query." AND Country = $_GET['country']"
}
Т.е. если переменная $_GET['country'] не пустая, то к запросу добавится часть, содержащая условие равенства страны. И так нужно сделать для каждой переменной, постепенно формируя свой запрос.
Я правильно понял что после скрипта запроса select требуеться условием ввести проверку
if ($_GET['country'] != "")
{
$query = $query." AND Country = $_GET['country']"
}
для каждого значение.
Если читать код то получится что идёт отбор (SELECT) дальше проверка на пустоту формы, дальше выводим результат!
Я всё правильно понял?
Tonny_Bennet
12-05-2012, 14:46
Если читать код то получится что идёт отбор (SELECT) дальше проверка на пустоту формы, дальше выводим результат!
Я всё правильно понял? »
Наверное не очень. Оператор "." (точка) в PHP служит для объединения строк.
К примеру часть кода
$a = "Hello "
$b = "world!"
$c = $a.$b
echo $c
В переменной $a слово Hello в переменной $b слово world!. А в переменной $c содержится строка объединенная из этих двух сток т.е. "Hello world!".
Вот так и в примере, который я описал. Сначала в переменной $query есть начало запроса: $query = "SELECT * FROM table WHERE ". А потом если поле $_GET['country'] не пустое то мы к переменной $query добавляем строку, содержащую условие " AND Country = $_GET['country']" и запрос становится длиннее.
"SELECT * FROM table WHERE AND Country = $_GET['country'] "
Но как видно я тут допустил ошибку: после where идёт слово AND и нам MySQL скажет, что это неправильно. В общем нужно продумать логику обработки пустых полей, создать флаг, отвечающий за то было ли выбрано предыдущее поле и по нему ориентироваться ставить ли "AND". И на основе несложных выражений формулировать запрос. Для проверки его можно просто выводить на страничке.
Я только хотел было написать что я написал таким образом:
<?php
require_once "zashita.php";
require_once "bdconnect.php";
mysql_query("SET NAMES cp1251");
$sSQL="SELECT * FROM `dogovor`, `bank`, `periodichnost`, `sposob_oplati`, `sposob_peredachi`, `status`, `vid_billinga`, `vid_oplati` WHERE dogovor.bank_id=bank.id_bank and dogovor.periodichnost_id=periodichnost.id_periodichnost and dogovor.sposob_oplati_id=sposob_oplati.id_sposob_oplati and dogovor.sposob_peredachi_id=sposob_peredachi.id_sposob_peredachi and dogovor.status_id=status.id_status and dogovor.vid_billinga_id=vid_billinga.id_vid_billinga and dogovor.vid_oplati_id=vid_oplati.id_vid_oplati and dogovor.date_dog='$date_dog' and dogovor.n_dog LIKE '%$n_dog%' and dogovor.name_org LIKE '%$name_org%' and dogovor.komissia LIKE '$komissia' and dogovor.dop_sogl LIKE '$dop_sogl' and dogovor.inn LIKE '$inn' and dogovor.r_schet LIKE '$r_schet' and dogovor.boss LIKE '$boss' and dogovor.kontakt_l LIKE '$kontakt_l' and dogovor.kont_phone LIKE '$kont_phone' and dogovor.adres LIKE '$adres' and dogovor.primech LIKE '$primech' and dogovor.e_mail LIKE '$e_mail'";
if ($_GET['date_dog'] != "")
{
$sSQL = $sSQL."AND date_dog = $_GET['date_dog']"
}
if ($_GET['n_dog'] != "")
{
$sSQL = $sSQL."AND n_dog = $_GET['n_dog']"
}
if ($_GET['name_org'] != "")
{
$sSQL = $sSQL."AND name_org = $_GET['name_org']"
}
.....
//а дальше...
$result=mysql_query($sSQL, $link);
if (mysql_num_rows($result) == 0) echo"Результат запроса : 0";else
if (mysql_num_rows($result) > 0)
while ( $myrow = mysql_fetch_array($result) ):
Но он выдаёт синтаксическую ошибку!
Я уж думал что я опять не так понял!
Tonny_Bennet
12-05-2012, 17:19
Но он выдаёт синтаксическую ошибку! »
сделайте echo $sSQL посмотрите что там за запрос.
Выдаёт syntax error, unexpected '"' in
"AND date_dog = $_GET['date_dog']" »
Переменные внутри строки. {$_GET['date_dog']} или $_GET[date_dog]
+ обязательно делайте везде mysql_real_escape_string
Переменные внутри строки. {$_GET['date_dog']} или $_GET[date_dog]
+ обязательно делайте везде mysql_real_escape_string »
У меня получился такой скрипт:
<?php
require_once "zashita.php";
require_once "bdconnect.php";
mysql_query("SET NAMES cp1251");
$sSQL="SELECT * FROM `dogovor`, `bank`, `periodichnost`, `sposob_oplati`, `sposob_peredachi`, `status`, `vid_billinga`, `vid_oplati` WHERE dogovor.bank_id=bank.id_bank and dogovor.periodichnost_id=periodichnost.id_periodichnost and dogovor.sposob_oplati_id=sposob_oplati.id_sposob_oplati and dogovor.sposob_peredachi_id=sposob_peredachi.id_sposob_peredachi and dogovor.status_id=status.id_status and dogovor.vid_billinga_id=vid_billinga.id_vid_billinga and dogovor.vid_oplati_id=vid_oplati.id_vid_oplati and dogovor.date_dog='$date_dog' and dogovor.n_dog LIKE '%$n_dog%' and dogovor.name_org LIKE '%$name_org%' and dogovor.komissia LIKE '$komissia' and dogovor.dop_sogl LIKE '$dop_sogl' and dogovor.inn LIKE '$inn' and dogovor.r_schet LIKE '$r_schet' and dogovor.boss LIKE '$boss' and dogovor.kontakt_l LIKE '$kontakt_l' and dogovor.kont_phone LIKE '$kont_phone' and dogovor.adres LIKE '$adres' and dogovor.primech LIKE '$primech' and dogovor.e_mail LIKE '$e_mail'";
if ($_GET['date_dog'] != "")
{
$_GET['date_dog']
}
if ($_GET['n_dog'] != "")
{
$_GET['n_dog']
}
if ($_GET['name_org'] != "")
{
$_GET['name_org']
}
if ($_GET['komissia'] != "")
{
$_GET['komissia']
}
if ($_GET['dop_sogl'] != "")
{
$_GET['dop_sogl']
}
if ($_GET['inn'] != "")
{
$_GET['inn']
}
if ($_GET['r_schet'] != "")
{
$_GET['r_schet']
}
if ($_GET['boss'] != "")
{
$_GET['boss']
}
if ($_GET['kontakt_l'] != "")
{
$_GET['kontakt_l']
}
if ($_GET['kont_phone'] != "")
{
$_GET['kont_phone']
}
if ($_GET['adres'] != "")
{
$_GET['adres']
}
if ($_GET['primech'] != "")
{
$_GET['primech']
}
if ($_GET['e_mail'] != "")
{
$_GET['e_mail']
}
$result=mysql_query($sSQL, $link);
//echo $sSQL;
if (mysql_num_rows($result) == 0) echo"Результат запроса : 0";else
if (mysql_num_rows($result) > 0)
while ( $myrow = mysql_fetch_array($result) ):
?>
Выдаёт ошибку: Parse error: syntax error, unexpected '}'
Я скорее всего где что то не так на мудрил!?
{
$_GET['primech']
} »
Даже с ; это глупость. Сделайте обработчик для входящих переменных, чтобы через него обращаться к ним, и не париться с определённостью.
Я уже хочу сдаться и сделать для каждого поле вода отдельную форму и и скрипт поиска!
Так я правильно понимаю что принцип должен быть таков что форма отправляет запрос на скрипт в скрипте сперва должна проверяться наличие символов при помощи $_GET потом только выполнять SELECT? Или я что-то не так понял!?
http://docs.php.net/manual/ru/function.mysql-real-escape-string.php - тут почитайте что-ли
Спасибо за ссылку, не знаю правильно я там всё понял но в результате у меня получилось так:
<?php
require_once "zashita.php";
require_once "bdconnect.php";
if (isset($_GET[date_dog])) {$date_dog = $_GET['date_dog'];}
if (isset($_GET[n_dog])) {$n_dog = $_GET['n_dog'];}
if (isset($_GET[name_org])) {$name_org = $_GET['name_org'];}
if (isset($_GET[komissia])) {$komissia = $_GET['komissia'];}
if (isset($_GET[dop_sogl])) {$dop_sogl = $_GET['dop_sogl'];}
if (isset($_GET[inn])) {$inn = $_GET['inn'];}
if (isset($_GET[r_schet])) {$r_schet = $_GET['r_schet'];}
if (isset($_GET[boss])) {$boss = $_GET['boss'];}
if (isset($_GET[kontakt_l])) {$kontakt_l = $_GET['kontakt_l'];}
if (isset($_GET[kont_phone])) {$kont_phone = $_GET['kont_phone'];}
if (isset($_GET[adres])) {$adres = $_GET['adres'];}
if (isset($_GET[primech])) {$primech = $_GET['primech'];}
if (isset($_GET[e_mail])) {$e_mail = $_GET['e_mail'];}
mysql_query("SET NAMES cp1251");
$sSQL=sprintf("SELECT * FROM `dogovor`, `bank`, `periodichnost`, `sposob_oplati`, `sposob_peredachi`, `status`, `vid_billinga`, `vid_oplati` WHERE dogovor.bank_id=bank.id_bank and dogovor.periodichnost_id=periodichnost.id_periodichnost and dogovor.sposob_oplati_id=sposob_oplati.id_sposob_oplati and dogovor.sposob_peredachi_id=sposob_peredachi.id_sposob_peredachi and dogovor.status_id=status.id_status and dogovor.vid_billinga_id=vid_billinga.id_vid_billinga and dogovor.vid_oplati_id=vid_oplati.id_vid_oplati and dogovor.date_dog='$date_dog' and dogovor.n_dog LIKE '%$n_dog%' and dogovor.name_org LIKE '%$name_org%' and dogovor.komissia = '$komissia' and dogovor.dop_sogl LIKE '$dop_sogl' and dogovor.inn = '$inn' and dogovor.r_schet LIKE '$r_schet' and dogovor.boss LIKE '$boss' and dogovor.kontakt_l LIKE '$kontakt_l' and dogovor.kont_phone LIKE '$kont_phone' and dogovor.adres LIKE '$adres' and dogovor.primech LIKE '$primech' and dogovor.e_mail LIKE '$e_mail'", mysql_real_escape_string($date_dog), mysql_real_escape_string($n_dog), mysql_real_escape_string($name_org), mysql_real_escape_string($komissia), mysql_real_escape_string($dop_sogl), mysql_real_escape_string($inn), mysql_real_escape_string($r_schet), mysql_real_escape_string($boss), mysql_real_escape_string($kontakt_l), mysql_real_escape_string($kont_phone), mysql_real_escape_string($adres), mysql_real_escape_string($primech), mysql_real_escape_string($e_mail));
$result=mysql_query($sSQL, $link);
if (mysql_num_rows($result) == 0) echo"Результат запроса : 0";else
if (mysql_num_rows($result) > 0)
while ( $myrow = mysql_fetch_array($result) ):
?>
1) У меня есть сомнение что я правильно условие написал или не дописал. Я так понимаю требуется в начале сделать проверку на наличие информации для запроса
2) Дальше происходит так что выдаёт ошибку браузера "Память не может быть "read"". Тут же закралось сомнение что я не так отразил mysql_real_escape_string
if (isset($_GET[date_dog])) {$date_dog = $_GET['date_dog'];} »
так лучше и правильней
$date_dog = isset($_GET['date_dog']) ? $_GET['date_dog'] : '';
неправильная строка в sprintf (почитайте http://docs.php.net/manual/ru/function.sprintf.php )
там вместо переменных должны быть описатели (%s) и все обычные знаки % должны быть %% ( вместо LIKE '%$name_org%' будет LIKE '%%%s%%' ).
Спасибо за совет!
а как на счёт 2-го вопроса? Как его решить?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.