|
|
|
| Здравствуйте!
Есть база данных с каталогом деталей. В нем присутствует таблица с номерами этих деталей. Номера имеют цифры и буквы. Нужно сделать поиск по неполному номеру, т.е. вписывать не поный номер, а выводиться должен полный. Ну например, есть деталь с номером 0K2NC50311. При поиске я набираю к примеру 0K2NC, и должен увидеть полный номер. На данный момент поиск осуществляется только по полному номеру, как переделать мозгов не хватает.
Надеюсь кто-нибудь понял чего я хотел... | |
|
|
|
|
|
|
|
для: p.novikov
(03.04.2007 в 17:35)
| | применить конструкцию
SELECT partnumber FROM parts WHERE partnumber LIKE '%$what%'
| где $what - искомая часть. | |
|
|
|
|
|
|
|
для: 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%"> </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 работаю две недели... чайник я и еще какой... | |
|
|
|
|
|
|
|
для: 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']."%' ";
|
| |
|
|
|
|
|
|
|
для: Trianon
(03.04.2007 в 18:12)
| | ок! работает!! Спасибо огромное!!! | |
|
|
|
|
|
|
|
для: p.novikov
(03.04.2007 в 18:23)
| | И еще вопрос по этому же запросу...
Номера деталей могут иметь дефисы, пробелы и другие символы. Возможно ли сделать так, чтобы игнорировать эти символы, и вести поиск только по цифрам... типа как в экселе... Например у двух разных поставщиков есть одна и та же деталь но номера записаны как 25310-25000 и 2531025000 (или 25310 25000). В экселе в поиске набираешь просто 25310*25 и находишь обе записи... | |
|
|
|
|
|
|
|
для: p.novikov
(06.04.2007 в 17:36)
| | надо просто заменять все "-", пробелы и т.д. на знак подчеркивания "_" | |
|
|
|
|
|
|
|
для: NovikovMA
(07.04.2007 в 11:16)
| | А если не менять ничего? Может можно как то записать команду на игнор таких знаков? | |
|
|
|
|
|
|
|
для: NovikovMA
(07.04.2007 в 11:16)
| | да, и как же тогда быть с номерами написанными слитно | |
|
|
|
|
|
|
|
для: p.novikov
(09.04.2007 в 19:39)
| | можно применить что-то вроде REPLACE(REPLACE(REPLACE(num, ' ', ''), '_', ''), '-', '')
но это изврат.
Правильное решение - очистить ключи в таблице от лишних символов, и отформатировать строго по схеме. Аналогичную чистку и форматирование выполнить и в скриптах, в которых пользователи указывают партнамберы. Ну и при импорте данных тоже. | |
|
|
|
|
|
|
|
для: Trianon
(09.04.2007 в 21:11)
| | Как? "Я не волшебник, я только учусь..." Если не трудно может распишите или ссылку дадите где прочитать можно... | |
|
|
|
|
|
|
|
для: p.novikov
(10.04.2007 в 17:10)
| | Честно говоря, не понял. | |
|
|
|
|
|
|
|
для: 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Е* и получаю все номера, не зависимо есть в них пробелы и дефисы или нет. | |
|
|
|
|
|
|
|
для: 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Е . ПРи поиске все пробелы, дефисы и подчеркивания будут проигнорированы. | |
|
|
|
|
|
|
|
для: Trianon
(13.04.2007 в 10:57)
| | это где сейчас такая сточка:
if(!empty($_POST['num'])) $tmp2 = " and num LIKE '%".$_POST['num']."%' ";
??? | |
|
|
|
|
|
|
|
для: p.novikov
(13.04.2007 в 11:17)
| | Ну значит тогда
if(!empty($_POST['num']))
$tmp2 = " and REPLACE(REPLACE(REPLACE(num, ' ', ''), '_', ''), '-', '') "
. "LIKE '%".$_POST['num']."%' ";
|
| |
|
|
|
|
|
|
|
для: Trianon
(13.04.2007 в 11:20)
| | да, я в принципе так и дописал... Спасибо за помощь...
P.S.: а номера - это номера корейских деталей... склады нам не подчиняются... поэтому заставить писать номера так как они приходят из Кореии я не могу. | |
|
|
|
|
|
|
|
для: p.novikov
(13.04.2007 в 11:40)
| | Это я могу понять.
Но можно же написать скрипт, который перед импортом данных в БД профильтрует строки,
закачает верные, отфильтрует и исправит неверные но однозначные, и предложит куcками исправить остальные. Вероятно их будет не так много. | |
|
|
|
|
|
|
|
для: Trianon
(13.04.2007 в 11:44)
| | 50-60 тысяч... | |
|
|
|
|
|
|
|
для: p.novikov
(16.04.2007 в 16:20)
| | всего? или дефектных? | |
|
|
|
|
|
|
|
для: Trianon
(16.04.2007 в 17:29)
| | дефектных... | |
|
|
|