Войти

Показать полную графическую версию : [решено] Поиск в таблице mysql через формы+php


Страниц : 1 [2]

Sham
15-05-2012, 07:21
хз, это глюк браузера. Проверяйте на браузере без плагинов, очистите кэш или переустановите браузер.

cibin
15-05-2012, 09:36
так лучше и правильней
PHP код:
$date_dog = isset($_GET['date_dog']) ? $_GET['date_dog'] : ''; »



После применение вашего совета ошибка ушла! Но результата не принёс, результатом поиска 0. Хорошо хоть ошибки нет!

На данный момент используя Ваш ценный совет получилась вот токая комбинация:


<?php
require_once "zashita.php";
require_once "bdconnect.php";

$date_dog = isset($_GET['date_dog']) ? $_GET['date_dog'] : '';
$n_dog = isset($_GET['n_dog']) ? $_GET['n_dog'] : '';
$name_org = isset($_GET['name_org']) ? $_GET['name_org'] : '';
$komissia = isset($_GET['komissia']) ? $_GET['komissia'] : '';
$dop_sogl = isset($_GET['dop_sogl']) ? $_GET['dop_sogl'] : '';
$inn = isset($_GET['inn']) ? $_GET['inn'] : '';
$r_schet = isset($_GET['r_schet']) ? $_GET['r_schet'] : '';
$boss = isset($_GET['boss']) ? $_GET['boss'] : '';
$kontakt_l = isset($_GET['kontakt_l']) ? $_GET['kontakt_l'] : '';
$kont_phone = isset($_GET['kont_phone']) ? $_GET['kont_phone'] : '';
$adres = isset($_GET['adres']) ? $_GET['adres'] : '';
$primech = isset($_GET['primech']) ? $_GET['primech'] : '';
$e_mail = isset($_GET['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) ):
?>


$date_dog, $komissia и $inn сделал не LIKE а = дело в том что они в основном числовые в котором будет требовать указание полной информации. Может повлияло!
Ввожу в поле $name_org %текст поиска% он выдаёт результат 0, хотя я знаю что там токая запись есть!

cibin
16-05-2012, 09:13
$query = "SELECT * FROM table WHERE " if ($_GET['country'] != "") { $query = $query." AND Country = $_GET['country']" } »


В этой идеи есть смысл, с одним но!

Скорее всего примерно так нужно:


if ($_GET['date_dog'] != "")
{
$t = "AND dogovor.date_dog = $_GET['date_dog']"
}


Дальше в селекте будет скорее всего так:


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 $t;

echo "$sSQL";

$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) ):


Т.е. теоретически получается так что если в форме есть запись то в селект вписывает AND date_dog = $_GET['date_dog'], но вот беда, не работает и я понимаю дело в том что сделав echo "$sSQL"; я увидел что он данный текст не подставляет! Но почему?

Sham
17-05-2012, 05:32
= $_GET['date_dog']" »
ошибка строковой переменной (я писал выше)
dogovor.vid_oplati_id=vid_oplati.id_vid_oplati $t; »
кавычку добавьте (не видно что-ли раскраска кода нарушена).

cibin
17-05-2012, 09:40
такая запись правильная?


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));


Дело в том что у меня ругаеться именно здесь и ругается на запятую хотя писал согласно примеру как тут описано http://docs.php.net/manual/ru/function.mysql-real-escape-string.php
Если я уберу

, 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))

то при
echo "$sSQL";
Выдаёт весь запрос но с пустыми полями, т.е. из формы информация не передаётся!

И ещё убираю запятую выдаёт в строке запроса синтаксическую ошибку!

Sham
17-05-2012, 10:13
У вас непонятно, зачем используется sprintf. В строке вместо переменных php дб описатели (%s) (выше писал уже).
Тогда вставляйте mysql_real_escape_string в строку запроса, без функции sprintf (см. конкатенация в PHP).

cibin
17-05-2012, 10:54
я извиняюсь выглядит на самом деле так:


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 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);

Вы действительно говорили и я прислушался! Код копировал с предыдущих моих сообщений!

На данный момент вышел из ситуации путём создания для каждой формы поиска отдельный поиск! Всё работает, но на будущее надеюсь понять как сделать поиск по нескольким полям сразу!

Sham
18-05-2012, 04:41
все mysql_real_escape_string перенесите в строку запроса

например
было так
and dogovor.date_dog='$date_dog' and dogovor.n_dog LIKE '%$n_dog%'
станет так
and dogovor.date_dog='" . mysql_real_escape_string($date_dog) . "' and dogovor.n_dog LIKE '%" . mysql_real_escape_string($n_dog) . "%'
а то sprintf убрали, а параметры оставили.

cibin
18-05-2012, 09:15
echo выдало это

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='' and dogovor.n_dog LIKE '%%' and dogovor.name_org LIKE '%%' and dogovor.komissia = '' and dogovor.dop_sogl LIKE '%%' and dogovor.inn = '' and dogovor.r_schet LIKE '%$%' and dogovor.boss LIKE '%%' and dogovor.kontakt_l LIKE '%%' and dogovor.kont_phone LIKE '%%' and dogovor.adres LIKE '%%' and dogovor.primech LIKE '%%' and dogovor.e_mail LIKE '%%'Результат запроса : 0

и это даёт в каком бы поле не вводил текст поиска. Т.е. он сам текст не передаёт в запрос!

Sham
18-05-2012, 10:39
проверьте атрибут формы method (get/post) т.е. $_GET/$_POST

вообще, строка условий запроса должна формироваться динамически, пустые значения нельзя вставлять.
например
$var = !empty($date_dog) ? " and dogovor.date_dog='" . mysql_real_escape_string($date_dog) . "'" : '';

и в строку запроса вставляете уже $var вместо этого условия.

cibin
18-05-2012, 10:54
Я уже запутался и жалею что решил это сделать!

cibin
24-06-2012, 23:29
У меня получилось вот что:
<?php
require_once "bdconnect.php";
require_once "zashita.php";

if (isset($_REQUEST[n_dog])) $n_dog = $_REQUEST['n_dog']; else $n_dog = 0;
//echo "$n_dog";
if (isset($_REQUEST[date_dog])) $date_dog = $_REQUEST['date_dog']; else $date_dog = 0;
if (isset($_REQUEST[name_org])) $name_org = $_REQUEST['name_org']; else $name_org = 0;
echo "$name_org";
if (isset($_REQUEST[komissia])) $komissia = $_REQUEST['komissia']; else $komissia = 0;
echo "$komissia";
if (isset($_REQUEST[dop_sogl])) $dop_sogl = $_REQUEST['dop_sogl']; else $dop_sogl = 0;
echo "$dop_sogl";
if (isset($_GET[inn])) $inn = intval($_GET['inn']); else $inn = 0;
echo "$inn";
if (isset($_GET[r_schet])) $r_schet = intval($_GET['r_schet']); else $r_schet = 0;
echo "$r_schet";
if (isset($_REQUEST[boss])) $boss = $_REQUEST['boss']; else $boss = 0;
echo "$boss";
if (isset($_REQUEST[kontakt_l])) $kontakt_l = $_REQUEST['kontakt_l']; else $kontakt_l = 0;
echo "$kontakt_l";
if (isset($_REQUEST[kont_phone])) $kont_phone = $_REQUEST['kont_phone']; else $kont_phone = 0;
echo "$kont_phone";
if (isset($_REQUEST[adres])) $adres = $_REQUEST['adres']; else $adres = 0;
echo "$adres";
if (isset($_REQUEST[primech])) $primech = $_REQUEST['primech']; else $primech = 0;
echo "$primech";
if (isset($_REQUEST[e_mail])) $e_mail = $_REQUEST['e_mail']; else $e_mail = 0;
echo "$e_mail";
mysql_query("SET NAMES cp1251");
function EditSelect($date_dog, $n_dog, $name_org, $komissia, $dop_sogl, $inn, $r_schet, $boss, $kontakt_l, $kont_phone, $adres, $primech, $e_mail)
{
$vars = array($date_dog, $n_dog, $name_org, $komissia, $dop_sogl, $inn, $r_schet, $boss, $kontakt_l, $kont_phone, $adres, $primech, $e_mail);
$query = "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";
$queryArr = array(
" 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%'",
);
//print_r($queryArr);

for($i=0; $i<count($queryArr); $i++)
if($vars[$i]!=0)
$query.=$queryArr[$i];

return $query;
}
$sSQL=EditSelect($date_dog, $n_dog, $name_org, $komissia, $dop_sogl, $inn, $r_schet, $boss, $kontakt_l, $kont_phone, $adres, $primech, $e_mail);
echo "$sSQL";
$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) ):
?>
Здесь я попробовал проверить прям по строчно, т.е. каждую проверку, в результате заметил что он при таком коде из формы типа text
1) проверяет и принимает без проблем строку поиска, в каждом.
2) проверил массив, он работает ибо в каждом отражается строка которую вводили.
3) А вот дальше уже выводит вот что, при echo "$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
, но когда ищем по цифрам находит всё идеально! Т.е. он не дописывает условие и в результате он выводит всю таблицу!
Что не так?

cibin
25-06-2012, 09:26
На одном сайт нашел такую вещь:
settype($someVar, "string") // переопределяем тип данных на строковый
Вопрос правильно ли будет вписать подобное в проверку?

cibin
25-06-2012, 10:45
Вопрос решён спасибо!!




© OSzone.net 2001-2012