Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Поиск по логике "ИЛИ", "И"
 
 автор: chexov   (28.02.2008 в 10:41)   письмо автору
 
 

Структура БД:

CREATE TABLE IF NOT EXISTS `reg_users` (
  `uid` int(11) NOT NULL auto_increment,
  `login` varchar(255) NOT NULL default ' ',
  `name` varchar(255) NOT NULL default ' ',
  `old` int(2) NOT NULL default '0',//Записывается количество полных лет (пример: 25)
  `pol` int(1) NOT NULL default '0',//1-М;2-Ж
  `last` varchar(255) NOT NULL default ' ',//time()
  `id` int(11) NOT NULL,//Значение=1
  PRIMARY KEY  (`uid`)
) ;

Есть форма которая имеет несколько полей ввода:

<?php
  
echo "<form action='".$_SERVER['PHP_SELF']."?act=send' method='post> ";
  echo 
"Ник или ID:<br/>\n";
  echo 
"<input type='text' name='idus' maxlength='30'/><br/>";
  echo 
"Имя:<br/>";
  echo 
"<input type='text' name='imya'/><br/>";
  echo 
"Первая буква ника:<br/>";
  echo 
"<input type='text' name='words' maxlength='1'/><br/>";
  echo 
"Пол:<br/>";
  echo 
"<select name='sex'>";
  echo 
"<option value='0'>-</option>";
  echo 
"<option value='1'>М</option>";
  echo 
"<option value='2'>Ж</option>";
  echo 
"</select><br/>";
  echo 
"On-Line:<br/>";
  echo 
"<select name='online'>";
  echo 
"<option value='0'>-</option>";
  echo 
"<option value='1'>Нет</option>";
  echo 
"<option value='2'>Да</option>";
  echo 
"</select><br/>";
  echo 
"Возраст:<br/>";
  echo 
"От: <input type='text' name='ot' maxlength='2' /><br/>";
  echo 
"До: <input type='text' name='do' maxlength='2' /><br/>";
 echo 
"<input type='submit' value='Отправить'/></form>";
?>


Я вот таким способом сделал поиск данных по БД (логика "И")

 <?php
if (!empty($_POST['act']))
{
if (
$_POST['idus']!="")
    {
    
$sql=" and (uid='".$_POST['idus']."' or login='".$_POST['idus']."')";
    }
  if (
$_POST['imya']!="")
    {
    
$sql=" and name='".$_POST['imya']."'";
    }
if (
$_POST['words']!="")
    {
    
$sql=" and login LIKE '".$_POST['words']."%'";
    }
  if (
$_POST['sex']!="0")
    {
    
$sql="and pol='".$_POST['sex']."'";
    }
  if (
$_POST['online']=="2")
    {
    
$sql="and last>'".intval(time()-1000)."'";
    }
  if (
$_POST['ot']!="" and $_POST['do']!="")
    {
    
$sql="and (old between '".$_POST['ot']."' and '".$_POST['do']."')";
    }
  if (!empty(
$sql))
    {
    
$result mysql_query("select * from `table`  where id='1' ".$sql."");
    if (
mysql_num_rows($result)!=0)
      {
      while(
$row=mysql_fetch_array($result))
        {
         echo 
"<a href='index.php'>".$row['login']."</a><br/>";
        }
      }
    else
      {
      echo 
"Пользователь не найден!<br/>";
      }
    }
  else
    {
    echo 
"Ни одно значение поиска не задано!<br/>";
    }
}
?>

Подскажите как из этого сделать логику ("ИЛИ")

   
 
 автор: cheops   (28.02.2008 в 12:34)   письмо автору
 
   для: chexov   (28.02.2008 в 10:41)
 

Исправьте каждый фрагмент с and в начале
<?php
   $sql
=" and (uid='".$_POST['idus']."' or login='".$_POST['idus']."')";
?>

следующим образом
<?php
   $sql
=$logic (uid='".$_POST['idus']."' or login='".$_POST['idus']."')";
?>

А переменной $logic присваивайте значение AND (И) или OR (ИЛИ) в зависимости от выбранной логики.

   
 
 автор: chexov   (28.02.2008 в 14:03)   письмо автору
 
   для: cheops   (28.02.2008 в 12:34)
 

хорошо, но к примеру, если выбрана логика ИЛИ то следовательно перед скобкой будет OR,
а если пользователь будет использовать например сразу второе поле ввода, получится:

select * from `table` where id='1' or

А это не верно, выводит всех пользователей, если же id=1 поставить в конец

select * from `table` or where id='1' 

то выдает ошибку

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in...

   
 
 автор: cheops   (29.02.2008 в 01:18)   письмо автору
 
   для: chexov   (28.02.2008 в 14:03)
 

Вы условия лучше вообще в массив помещайте, а потом объединяйте при помощи функции implode() в строку
<?php
  $sql
[] = "...";
  
$sql[] = "...";
  
$sql[] = "...";
  
$sql[] = "...";
  
$where implode($logic$sql);
?>

   
 
 автор: chexov   (29.02.2008 в 04:05)   письмо автору
 
   для: cheops   (29.02.2008 в 01:18)
 

Не совсем понял конечно, можно пример понагляднее (на одном из условий) и как сформировать запрос?
=====================================================================
При логике ИЛИ

<?php 
if (!empty($_POST['act'])) 

if (
$_POST['idus']!=""
    { 
    
$sql[]="(uid='".$_POST['idus']."' or login='".$_POST['idus']."')"
    } 

  if (!empty(
$sql)) 
    { 
    
$result mysql_query("select * from `table`  where  (".implode("OR"$sql).") and id='1'"); 
    if (
mysql_num_rows($result)!=0
      { 
      while(
$row=mysql_fetch_array($result)) 
        { 
         echo 
"<a href='index.php'>".$row['login']."</a><br/>"
        } 
      } 
    else 
      { 
      echo 
"Пользователь не найден!<br/>"
      } 
    } 
  else 
    { 
    echo 
"Ни одно значение поиска не задано!<br/>"
    } 

?>

После этого если пользователь найден, то выводит, если нет то та же самая ошибка
Если я ввожу например Логин одного пользователя и uid другого, скрипт выдает пользователь не найден.
А по идеи как: выведет 2-х , кого то одного или вообще не выведет (при логике ИЛИ)?

   
 
 автор: cheops   (29.02.2008 в 13:16)   письмо автору
 
   для: chexov   (29.02.2008 в 04:05)
 

Пробел поставьте вокруг OR, а выполнение запроса обработайте
<?php
   $result 
mysql_query("select * from `table`  where  (".implode(" OR "$sql).") and id='1'");
   if(!
$result) exit(mysql_error());
?>

   
 
 автор: chexov   (01.03.2008 в 05:44)   письмо автору
 
   для: cheops   (29.02.2008 в 13:16)
 

Спасибо!!! Все отлично работает:)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования