Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

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

 

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

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

тема: Поиск по базе данных
 
 автор: p.novikov   (03.04.2007 в 17:35)   письмо автору
 
 

Здравствуйте!
Есть база данных с каталогом деталей. В нем присутствует таблица с номерами этих деталей. Номера имеют цифры и буквы. Нужно сделать поиск по неполному номеру, т.е. вписывать не поный номер, а выводиться должен полный. Ну например, есть деталь с номером 0K2NC50311. При поиске я набираю к примеру 0K2NC, и должен увидеть полный номер. На данный момент поиск осуществляется только по полному номеру, как переделать мозгов не хватает.
Надеюсь кто-нибудь понял чего я хотел...

   
 
 автор: Trianon   (03.04.2007 в 17:48)   письмо автору
 
   для: p.novikov   (03.04.2007 в 17:35)
 

применить конструкцию

SELECT partnumber FROM parts WHERE partnumber LIKE '%$what%'
где $what - искомая часть.

   
 
 автор: p.novikov   (03.04.2007 в 18:06)   письмо автору
 
   для: Trianon   (03.04.2007 в 17:48)
 

Либо у меня мозг затуманен, либо я изначально не так спросил. Вот как и меня изначально было записано:
<?php

// Устанавливаем соединение с базой данных
require_once("../admin/config.php");
$title="Поиск в каталоге";
include "../util/top.php";
?>
<h1 class=artnamepage>Поиск в каталоге</h1>
<form action=searchform.php method=post>
<input type="hidden" name="id_parent" value="<? echo $id_parent ?>">
<table border="0" align="center">
<tr valign="top">
<td><table border="0">
<tr valign="top">
<td width="130"><p class='textcat'>Поставщик</p></td>
<td><select class="input" type=text name=seller>
<option value='none' <?php if($_POST['seller']=='none') echo "selected"; ?>>не имеет значения </option>
<option value='asiamotors' <?php if($_POST['seller']=='asiamotors') echo "selected"; ?>>Азия-Моторс </option>
<option value='kotova' <?php if($_POST['seller']=='kotova') echo "selected"; ?>>Котова </option>
<option value='vvp' <?php if($_POST['seller']=='vvp') echo "selected"; ?>>ВВП </option>
<option value='sva' <?php if($_POST['seller']=='sva') echo "selected"; ?>>Запад-СВА </option>
</select>
</td>
</tr>
</table></td>
<td width="10%">&nbsp;</td>
<td><table border="0">
<tr>
<td><p class='textcat'>Номер детали</p></td>
<td><input class="input" size="25" type=text name=num value=<?php echo $_POST['num']; ?> ></td>
</tr>
<tr> </tr>
</table></td>
</tr>
<tr>
<td colspan=2><input name="submit" type=submit class=button value=Найти />
</td>
</tr>
</table>
<input type=hidden name=search value=search>
</form>

<?php
// Cкрипт-обработчик поискового запроса
// из формы
if(isset($_POST['search']))
{
?>
<a name=table></a>
<?php
// Флаг равен true, если есть хотя бы один критерий поиска
$is_query = false;
// Проверяем наличие и число параметров поиска
// Поставщик
$tmp1 = $tmp2="";
if(isset($_POST['seller']) && $_POST['seller']!='none')
$tmp1 = " and seller='".$_POST['seller']."'";
// Номер детали
if(!empty($_POST['num'])) $tmp2 = " and num=".$_POST['num'];
// Формируем запрос из переданных данных
$query = "SELECT * FROM product
WHERE hide='show'
".$tmp2.$tmp1."
ORDER BY pos";
// Выполняем SQL-запрос
$prt = mysql_query($query);
if(!$prt) puterror("Ошибка при обращении к каталогу");
// количество рядов в наборе должно быть больше нуля
if (mysql_num_rows($prt)>0)
{
?>
<table class="table" border="1" cellpadding="3" cellspacing="0" width="100%" bordercolordark="white" bordercolorlight="silver">
<tr class="zagtrtable" align="center">
<td height="20">Поставщик</td>
<td>Наименование детали</td>
<td>Номер детали</td>
<td>Цена </td>
</tr>
<?
while($par = mysql_fetch_array($prt))
{
// Определяем район
switch ($par['seller'])
{
case 'asiamotors':
$distr = "Азия-Моторс";
break;
case 'kotova':
$distr = "Котова";
break;
case 'vvp':
$distr = "ВВП";
break;
case 'sva':
$distr = "Запад-СВА";
break;
}
echo "<tr>
<td>$distr</td>
<td>".$par['name']."</td>
<td>".$par['num']."</td>
<td>".$par['price']."</td>
</tr>";
}
}
else echo "Поиск не дал результатов.
Попробуйте изменить критерии поиска.";
echo "</table>";
}

include "../util/bottom.php";
?>

P.S.: я с PHP работаю две недели... чайник я и еще какой...

   
 
 автор: Trianon   (03.04.2007 в 18:12)   письмо автору
 
   для: p.novikov   (03.04.2007 в 18:06)
 

строку

if(!empty($_POST['num'])) $tmp2 = " and num=".$_POST['num'];

нужно заменить на

if(!empty($_POST['num'])) $tmp2 = " and num LIKE '%".$_POST['num']."%' ";

   
 
 автор: p.novikov   (03.04.2007 в 18:23)   письмо автору
 
   для: Trianon   (03.04.2007 в 18:12)
 

ок! работает!! Спасибо огромное!!!

   
 
 автор: p.novikov   (06.04.2007 в 17:36)   письмо автору
 
   для: p.novikov   (03.04.2007 в 18:23)
 

И еще вопрос по этому же запросу...
Номера деталей могут иметь дефисы, пробелы и другие символы. Возможно ли сделать так, чтобы игнорировать эти символы, и вести поиск только по цифрам... типа как в экселе... Например у двух разных поставщиков есть одна и та же деталь но номера записаны как 25310-25000 и 2531025000 (или 25310 25000). В экселе в поиске набираешь просто 25310*25 и находишь обе записи...

   
 
 автор: NovikovMA   (07.04.2007 в 11:16)   письмо автору
 
   для: p.novikov   (06.04.2007 в 17:36)
 

надо просто заменять все "-", пробелы и т.д. на знак подчеркивания "_"

   
 
 автор: p.novikov   (09.04.2007 в 12:24)   письмо автору
 
   для: NovikovMA   (07.04.2007 в 11:16)
 

А если не менять ничего? Может можно как то записать команду на игнор таких знаков?

   
 
 автор: p.novikov   (09.04.2007 в 19:39)   письмо автору
 
   для: NovikovMA   (07.04.2007 в 11:16)
 

да, и как же тогда быть с номерами написанными слитно

   
 
 автор: Trianon   (09.04.2007 в 21:11)   письмо автору
 
   для: p.novikov   (09.04.2007 в 19:39)
 

можно применить что-то вроде REPLACE(REPLACE(REPLACE(num, ' ', ''), '_', ''), '-', '')
но это изврат.
Правильное решение - очистить ключи в таблице от лишних символов, и отформатировать строго по схеме. Аналогичную чистку и форматирование выполнить и в скриптах, в которых пользователи указывают партнамберы. Ну и при импорте данных тоже.

   
 
 автор: p.novikov   (10.04.2007 в 17:10)   письмо автору
 
   для: Trianon   (09.04.2007 в 21:11)
 

Как? "Я не волшебник, я только учусь..." Если не трудно может распишите или ссылку дадите где прочитать можно...

   
 
 автор: Trianon   (10.04.2007 в 18:05)   письмо автору
 
   для: p.novikov   (10.04.2007 в 17:10)
 

Честно говоря, не понял.

   
 
 автор: p.novikov   (13.04.2007 в 09:48)   письмо автору
 
   для: Trianon   (10.04.2007 в 18:05)
 

В общем дело вот как обстоит... Ко мне приходят куча разных прайсов со складов в формате Экселя. В них номера деталей и узлов, которые записаны по разному, т.е. через пробелы и дефисы. Я эти прайсы закачиваю в базу MySQL через MySQL Front. Когда производится поиск по каталогу (по номерам), то не выводятся позици, которые имеют например дефисы. Например, нужно найти номер 55447-68546. Определяющими в любом номере являются первые 5 и следующие 2 знака. Поэтому в строке поиска ввожу 55447-68 и получаю результат только по позициям которые записаны имменно с дефисом, а те которые записаны в виде 5544768546 или 55447 68546 не показываются. Понятное дело, можно в экселе выполнить замену дефисов и пробелов, но фишка еще в том, что номера могут иметь буквы латинского алфавита. И здесь уже есть проблема с бувой E, т.к. при такой замене некоторые номера приводятся к виду 9,26Е+06. Вот мне и нужно, чтобы поиск шел только по цифрам и буквам латинского алфавита, при этом не учитывая дефисов и пробелов. В самом экселе например, в строке поиска я забиваю 55447*68* или 0К2N1*3Е* и получаю все номера, не зависимо есть в них пробелы и дефисы или нет.

   
 
 автор: Trianon   (13.04.2007 в 10:57)   письмо автору
 
   для: p.novikov   (13.04.2007 в 09:48)
 

>В общем дело вот как обстоит... Ко мне приходят куча разных прайсов со складов в формате Экселя. В них номера деталей и узлов, которые записаны по разному, т.е. через пробелы и дефисы. Я эти прайсы закачиваю в базу MySQL через MySQL Front.

И никак при этом не унифицируете номера?
Зря.

>Когда производится поиск по каталогу (по номерам), то не выводятся позици, которые имеют например дефисы. Например, нужно найти номер 55447-68546. Определяющими в любом номере являются первые 5 и следующие 2 знака. Поэтому в строке поиска ввожу 55447-68 и получаю результат только по позициям которые записаны имменно с дефисом, а те которые записаны в виде 5544768546 или 55447 68546 не показываются.

А номера, слева от которых не 5 цифр - могут быть?

>Понятное дело, можно в экселе выполнить замену дефисов и пробелов, но фишка еще в том, что номера могут иметь буквы латинского алфавита.

Каким это образом?


>И здесь уже есть проблема с бувой E, т.к. при такой замене некоторые номера приводятся к виду 9,26Е+06.

Кем приводятся? Или они в xls-файле такие?
Если номера у Вас не номера, а строки - то их и хранить нао всяко не как числа.


>Вот мне и нужно, чтобы поиск шел только по цифрам и буквам латинского алфавита, при этом не учитывая дефисов и пробелов.

То есть Вас устраивает весь этот бардак с номерами.
ОК.
Поменяйте строку

if(!empty($_POST['num'])) $tmp2 = " and num=".$_POST['num'];
на

if(!empty($_POST['num'])) $tmp2 = " and REPLACE(REPLACE(REPLACE(num, ' ', ''), '_', ''), '-', '')=".$_POST['num'];


>В самом экселе например, в строке поиска я забиваю 55447*68* или 0К2N1*3Е* и получаю все номера, не зависимо есть в них пробелы и дефисы или нет.

Забивать придется 5544768 0К2N13Е . ПРи поиске все пробелы, дефисы и подчеркивания будут проигнорированы.

   
 
 автор: p.novikov   (13.04.2007 в 11:17)   письмо автору
 
   для: Trianon   (13.04.2007 в 10:57)
 

это где сейчас такая сточка:
if(!empty($_POST['num'])) $tmp2 = " and num LIKE '%".$_POST['num']."%' ";
???

   
 
 автор: Trianon   (13.04.2007 в 11:20)   письмо автору
 
   для: p.novikov   (13.04.2007 в 11:17)
 

Ну значит тогда

if(!empty($_POST['num'])) 
    $tmp2 = " and REPLACE(REPLACE(REPLACE(num, ' ', ''), '_', ''), '-', '') "
          . "LIKE '%".$_POST['num']."%' ";

   
 
 автор: p.novikov   (13.04.2007 в 11:40)   письмо автору
 
   для: Trianon   (13.04.2007 в 11:20)
 

да, я в принципе так и дописал... Спасибо за помощь...

P.S.: а номера - это номера корейских деталей... склады нам не подчиняются... поэтому заставить писать номера так как они приходят из Кореии я не могу.

   
 
 автор: Trianon   (13.04.2007 в 11:44)   письмо автору
 
   для: p.novikov   (13.04.2007 в 11:40)
 

Это я могу понять.
Но можно же написать скрипт, который перед импортом данных в БД профильтрует строки,
закачает верные, отфильтрует и исправит неверные но однозначные, и предложит куcками исправить остальные. Вероятно их будет не так много.

   
 
 автор: p.novikov   (16.04.2007 в 16:20)   письмо автору
 
   для: Trianon   (13.04.2007 в 11:44)
 

50-60 тысяч...

   
 
 автор: Trianon   (16.04.2007 в 17:29)   письмо автору
 
   для: p.novikov   (16.04.2007 в 16:20)
 

всего? или дефектных?

   
 
 автор: p.novikov   (18.04.2007 в 18:58)   письмо автору
 
   для: Trianon   (16.04.2007 в 17:29)
 

дефектных...

   
Rambler's Top100
вверх

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