Ru-Board.club
← Вернуться в раздел «Web-программирование»

» Поиск в базе MySQL

Автор: SparcoCF
Дата сообщения: 13.05.2009 18:55
Здравствуйте. Помогите пожалуйста создать небольшой поисковый движок по базе MySQL.
Основная задача состоит в том что бы выбрать марку автомобиля, ввести в текстовое поле номер запчасти и что бы поиск выдал список запчастей которые соответствуют запросу.

С чего я начал.
index.php
Сначала подключение к базе данных:

Код:
<?php
$con = mysql_connect("localhost","root","");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}

mysql_select_db("autoparts", $con);
Автор: Cheery
Дата сообщения: 13.05.2009 18:57
SparcoCF

Цитата:
Каким образом вообще реализовать сам процесс обработки и вывода данных которые введены в форму?

обычным. через INSERT или SELECT
я давал уже ссылку
Примитивный примерчик работы с БД MySQL из PHP


Цитата:
Допустим если мы ввели в текстовое поле "AA1" должны появится все данные что начинаются с "AA1"

появиться где?
Автор: SparcoCF
Дата сообщения: 13.05.2009 19:14

Цитата:
появиться где?


Хорошо бы было если бы Вы попробовали у себя на локалхосте мой пример но попытаюсь объяснить.
Появится в массиве который генерируется этим кодом:

Код:
$result = mysql_query("SELECT * FROM mercedes WHERE id>=1");
echo "<table width='80%'>
<tr>
<th>Номер детали</th>
<th>Наименование</th>
<th>Цена1</th>
<th>Цена1</th>
<th>Примечание</th>
</tr>";

while($row = mysql_fetch_array($result))
{
echo "<tr>";
echo "<td>" . $row['Nomer'] . "</td>";
echo "<td>" . $row['Nazva'] . "</td>";
echo "<td>" . $row['Price1'] . "</td>";
echo "<td>" . $row['Price2'] . "</td>";
echo "<td>" . $row['Notice'] . "</td>";
echo "</tr>";
}
echo "</table>";
Автор: Cheery
Дата сообщения: 13.05.2009 19:18
SparcoCF

Цитата:
Хорошо бы было если бы Вы попробовали у себя на локалхосте мой пример

смысл?

Цитата:
то есть я должен ввести в поле number номер детали например AA1 000 33 03 и из базы данных по логике должна появится вся информация что находится в базе относительно этой запчасти.


Цитата:
2. Допустим если мы ввели в текстовое поле "AA1" должны появится все данные что начинаются с "AA1"

и при этом..

Цитата:
$result = mysql_query("SELECT * FROM mercedes WHERE Nomer=".intval($_REQUEST['number'])."");

вы знаете что делает функция intval??
хочется выбрать то, что начинается с указанного, то
mysql_query("SELECT * FROM mercedes WHERE Nomer LIKE '".mysql_real_escape_string($_REQUEST['number'])."%'")
Автор: SparcoCF
Дата сообщения: 13.05.2009 19:36
Вас в руки целовать Cheery ))))
БОМБА ! Работает !

Осталось еще одно.
Поиск сейчас происходит по таблице mercedesчто в базе. И замечу что в поле Производитель: я не выбрал ничего там пусто.
Как сделать что бы допустим когда я выберу FORD поиск происходил по таблице ford а когда mercedes то соответственно по его таблице ?

возможно так ?:
mysql_query("SELECT * FROM $_REQUEST['manufacturer'] WHERE Nomer LIKE '".mysql_real_escape_string($_REQUEST['number'])."%'")


Добавлено:
возник еще один вопрос:
когда я ввожу данные в текстовое поле допустим "AA1 000 33" мне находит следующее:
AA1 000 33 03
AA1 000 33 04 и так далее ..
но вот если я введу данные в поле без пробелов "AA100033" мне не находит ничего, каким образом можно искать данные в базе независимо есть пробелы или нет. ?
Автор: Cheery
Дата сообщения: 13.05.2009 20:07
SparcoCF

Цитата:
каким образом можно искать данные в базе независимо есть пробелы или нет.

это уже проблемнее, так как придется делать с регулярными выражениями. рекомендую хранить без пробелов. или же вставлять автоматом после отправки


Добавлено:

Цитата:
возможно так ?:

нет..
1) запист приведет к sql injection, если сработает
2) а если нет имени таблицы, что будет передано?
Автор: SparcoCF
Дата сообщения: 13.05.2009 20:16

Цитата:
рекомендую хранить без пробелов


к сожалению это не возможно из за самой специфики записи запчастей, дело в том что есть прайс лист в котором порядка 100К наименований одни допустим AA1 000 33 03 другие FA7 0780 330 033 так что не получится даже после отправки автоматом вставлять пробелы, так как нет единого шаблона записи зап частей нет
придется думать что то с регулярными выражениями.


Цитата:

нет..
1) запист приведет к sql injection, если сработает
2) а если нет имени таблицы, что будет передано?


А как же тогда сделать ?

А если нет имени таблицы для этого есть <option value='0'>&nbsp;</option>
и в базе есть таблица "0" с одной единственной записью "ВВЕДИТЕ НОМЕР ЗАПЧАСТИ" по крайней мере так я придумал может посоветуете что то более правильное.
Автор: Cheery
Дата сообщения: 13.05.2009 20:19
SparcoCF

Цитата:
А если нет имени таблицы для этого есть <option value='0'>&nbsp;</option>
и в базе есть таблица "0" с одной единственной записью "ВВЕДИТЕ НОМЕР ЗАПЧАСТИ" по крайней мере так я придумал может посоветуете что то более правильное.

ну что за глупости..
что мешает проверить переданные данные ДО запроса? если 0, то вывести сразу, не "беспокоя" БД..
составить список имен таблиц в базе и выбирать из него, а не полагаться на имя переданное из формы


Цитата:
придется думать что то с регулярными выражениями.

думайте
Автор: SparcoCF
Дата сообщения: 13.05.2009 20:34
Смотрите как я сделал:
Есть база autoparts
в ней таблицы:
ford
bmw
mercedes
vw



Цитата:
составить список имен таблиц в базе и выбирать из него, а не полагаться на имя переданное из формы

а вы советуете сделать еще одну таблицу допустим tables в которой будет одна колонка например names и в нее внести все марки ? Или я не правильно понял ? Если правильно то что делать дальше ? как будет тогда выглядеть запрос mysql_query ?
Автор: Cheery
Дата сообщения: 13.05.2009 20:37
SparcoCF
блин.. ну вы вообще не думаете
$arr=array('t1'=>'table1','t2'=>'table2','t3'=>'table3');
далее берете имя таблицы по переданному из селекта
<select name='db'>
foreach ($arr as $k=>$v)
echo "<option value='$k'>$v</option>";
echo "</select>";


когда форма отправилась проверяете
if (isset($arr[$_REQUEST['db'])) $dbname=$arr[$_REQUEST['db'];
else echo "Данных нет";
Автор: SparcoCF
Дата сообщения: 13.05.2009 21:22

Цитата:
блин.. ну вы вообще не думаете

просто я еще очень зеленый в ПХП только как месяц им занялся

вот что я сделал:


Код:
$arr=array('ford'=>'FORD','bmw'=>'BMW','vw'=>'VW','mercedes'=>'MERCEDES');
echo "<center><select name='db'>";
foreach ($arr as $k=>$v)
echo "<option value='$k'>$v</option>";
echo "</select></center>";
Автор: Cheery
Дата сообщения: 13.05.2009 21:36
SparcoCF
я показал пример. думайте дальше
при
Цитата:
echo "Данных нет";

у вас неопределена
Цитата:
$dbname

и ессно проблемы с запросом.. да и .. ну елки - подумайте.
если вы не представляете работы скрипта в голове, значит вам рано программировать еще
Автор: SparcoCF
Дата сообщения: 13.05.2009 22:12
Cheery
Дело в том что я представляю в голове как должен работать скрипт, но не хватает знаний самого языка что бы решить определенные задачи.

Последнее что попрошу давай те вернемся к самому началу, для выбора таблицы не будем использовать массив, хотя ваш пример действительно правильный он слишком сложный для меня. Если я бы увидел готовое решение то я бы разобрался .. но увы.

Просто помогите мне составить правильно mysql_query и моей благодарности нет предела.
Значит так:
форма такая как была в начале:

Код:
echo "
<table width=100%><tr><td width=80%></td>&nbsp;<td width=20%></td></tr></table>

<center>

<br>
<table width=500 border='0'>
<td height='54'> <table width=500 border='0'>
<form method='POST' action='index.php' name='search'>
<tr>
<td align='right' width='150'><b>Производитель:</b></td>
<td align='left' class='td' colspan=2 width=200><select name='manufacturer'>
<option value='0'>&nbsp;</option>
<option value='FORD'>FORD</option>
<option value='BMW'>BMW</option>
<option value='VW'>VW</option>
<option value='MERCEDES'>MERCEDES</option>
</select></td>
</tr>
<tr>
<td align='right' width='150'><b>Номер детали:</b></td>
<td align='left'><input type='radio' name='type' value='begin' checked />
начинается<br />
<input type='radio' name='type' value='ended' />
заканчивается<br />
<input type='radio' name='type' value='regexp' />
содержит<br /></td>
</tr>
<tr>
<td align='right' width='150' style='padding-top:25px'><b>Ввести номер детали:</b>&nbsp;&nbsp; </td>
<td colspan=3><input type='text' name='number' />
<br />
<br />
<input type='button' value='ИСКАТЬ' /></td>
</tr>
</form>

</tr>
</table>
</table>
";
Автор: Cheery
Дата сообщения: 13.05.2009 22:27

Цитата:
Вопрос: после * FROM что нужно написать что бы прослушивался селектор и подставлялось значение которое там выбрано?

а догадаться сложно? тут даже знаний языка не надо
"SELECT * FROM `".mysql_real_escape_string($_REQUEST['имя_поля_из_формы'])."` WHERE и так далее
Автор: SparcoCF
Дата сообщения: 13.05.2009 22:49

Код:
а догадаться сложно? тут даже знаний языка не надо
"SELECT * FROM `".mysql_real_escape_string($_REQUEST['имя_поля_из_формы'])."` WHERE и так далее
Автор: Cheery
Дата сообщения: 13.05.2009 22:53
SparcoCF

Цитата:
вот так вот и почему такая

я же пояснил, что если что то левое будет передано из формы, то ессно будет ошибка в запросе
хотите убедиться? наберите
mysql_query(тут ваше) or die(mysql_error());
и читайте сообщение
Автор: SparcoCF
Дата сообщения: 13.05.2009 23:12
Cheery
Я с вами согласен на все 100% что есть ошибка в запросе и это Incorrect table name но ведь этой ошибки вовсе не должно быть ведь алгоритм то правильный. А мне оно пишет что Incorrect table name а ведь таблица есть ..
никак не до меня не допрет в чем же ошибка
есть селектор у него есть имя, я это имя указываю в запросе а оно ошибку дает. Пипец полный. Пожалуйста Cheery помогите мне с этим .. и я спать .. а то уже голова гудит
Автор: Cheery
Дата сообщения: 13.05.2009 23:20
SparcoCF

Цитата:
А мне оно пишет что Incorrect table name а ведь таблица есть

ну елки.. а посмотреть значение mysql_real_escape_string($_REQUEST['имя_поля_из_формы']) сложно???
небось еще и запрос делаете и когда "рисуете" форму? когда нет имени таблицы, переданной из формы?

сделайте вывод запросу, посылаемому в базу, через echo и все станет очевидно.
еще раз - именно тому, что в mysql_query(тут)
Автор: SparcoCF
Дата сообщения: 13.05.2009 23:35

Цитата:
небось еще и запрос делаете и когда "рисуете" форму

именно так... честно я уже сам злой что так мало знаю .. но для того и сижу не все время за этим что бы чего то научится .. а Вы единственный человек который мне в этом помогает.
Вот мой полный index.php кроме него больше ничего нет ничего не инклудится вот листинг:

Код:
<?php
$con = mysql_connect("localhost","root","");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}

mysql_select_db("autoparts", $con);

echo "
<table width=500 border='0'>
<td height='54'> <table width=500 border='0'>
<form method='POST' action='index.php' name='search'>
<tr>
<td align='right' width='150'><b>Производитель:</b></td>
<td align='left' class='td' colspan=2 width=200>
         <select name='manufacturer'>
<option value='table'>&nbsp;</option>
<option value='ford'>FORD</option>
<option value='bmw'>BMW</option>
<option value='vw'>VW</option>
<option value='mercedes'>MERCEDES</option>
</select>
        </td>
</tr>
<tr>
<td align='right' width='150'><b>Номер детали:</b></td>
</tr>
<tr>
<td><b>Ввести номер детали:</b>&nbsp;&nbsp; </td>
<td colspan=3>
        <input type='text' name='number' />
<input type='button' value='ИСКАТЬ' /></td>
</tr>
</form>

</tr>
</table>
</table>
";

$result = mysql_query("SELECT * FROM `".mysql_real_escape_string($_REQUEST['manufacturer'])."` WHERE Nomer LIKE '".mysql_real_escape_string($_REQUEST['number'])."%'");
echo "<table width='80%'>
<tr>
<th>Номер детали</th>
<th>Наименование</th>
<th>Цена1</th>
<th>Цена2</th>
<th>Примечание</th>
</tr>";

while($row = mysql_fetch_array($result))
{
echo "<tr>";
echo "<td>" . $row['Nomer'] . "</td>";
echo "<td>" . $row['Nazva'] . "</td>";
echo "<td>" . $row['Price1'] . "</td>";
echo "<td>" . $row['Price2'] . "</td>";
echo "<td>" . $row['Notice'] . "</td>";
echo "</tr>";
} die('Could not connect: ' . mysql_error());
echo "</table>";
?>
Автор: Cheery
Дата сообщения: 13.05.2009 23:44
SparcoCF

Цитата:
вот и все .. больше ничего нет, только база со всеми таблицами и

повторю еще раз.. при первом вызове скрипта у вас нет
Цитата:
$_REQUEST['manufacturer']

так понятнее? ну сделайте себе вывод
echo "SELECT * FROM `".mysql_real_escape_string($_REQUEST['manufacturer'])."` WHERE Nomer LIKE '".mysql_real_escape_string($_REQUEST['number'])."%'";
и станет все очевидно
Автор: SparcoCF
Дата сообщения: 14.05.2009 00:04

Цитата:
повторю еще раз.. при первом вызове скрипта у вас нет

я понимаю что его нет, сделал эхо и увидел что пусто никаких данных данных нет.

Но как сделать что бы данные появились ? Может дайте ссылку на какой то ресурс или книгу что бы я понял как что к чему, и покажите пример как это сделать...
Ведь я уверен что осталась мелочь что бы достичь результата, не думаю что бы это было очень сложно реализовать.
Насколько в общем я понимаю то запрос должен формироваться уже после нажатия на кнопку "ИСКАТЬ" но вот как это замутить.

Добавлено:
и еще вопрос почему для
WHERE Nomer LIKE '".mysql_real_escape_string($_REQUEST['number'])."%'"
при первом вызове скрипт есть
а для
SELECT * FROM `".mysql_real_escape_string($_REQUEST['manufacturer'])."`
скрипта нет ? Почему так ?
Автор: Cheery
Дата сообщения: 14.05.2009 00:27
SparcoCF

Цитата:
и еще вопрос почему для
WHERE Nomer LIKE '".mysql_real_escape_string($_REQUEST['number'])."%'"
при первом вызове скрипт есть
а для
SELECT * FROM `".mysql_real_escape_string($_REQUEST['manufacturer'])."`
скрипта нет ? Почему так ?

потому что $_REQUEST передает данные как из get
index.php?number=2
так и из post запросов.. или из кук
подумайте как вы можете определить, что данные приходят из формы - тогда и делайте запрос к базе. я не хочу разжевывать такие элементарные вещи
Автор: Jokerjar79
Дата сообщения: 14.05.2009 03:48
Если все таблицы одинкаковой структуры, то не вижу смысла в них. Лучше создать одну таблицу с полем "ID марки автомобиля" и справочник "марки автомобилей"
Автор: SparcoCF
Дата сообщения: 14.05.2009 11:39

Цитата:
Если все таблицы одинкаковой структуры, то не вижу смысла в них. Лучше создать одну таблицу с полем "ID марки автомобиля" и справочник "марки автомобилей"

В принципе можно и так сделать, но скорее всего что не получится поскольку прайс все время меняется, например для Mercedes в этом месяце было 238 687 позиций деталей а в следующем месяце это число может быть другое.
Автор: SparcoCF
Дата сообщения: 14.05.2009 19:56
Наконец то разобрался, вот что я сделал:
И так форма:

Код:
<form method='GET' action='index.php' name='search'>
<table width="600" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><b>Производитель:</b></td>
<td><span class="td">
<select name='manufacturer'>
<option value='table'>&nbsp;</option>
<option value='ford'>FORD</option>
<option value='bmw'>BMW</option>
<option value='vw'>VW</option>
<option value='mercedes'>MERCEDES</option>
</select>
</span></td>
</tr>
<tr>
<td><b>Ввести номер детали:</b></td>
<td><input type='text' name='number' /></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input type='submit' value='ИСКАТЬ' name="on" /></td>
</tr>
</table>
</form>
Автор: Cheery
Дата сообщения: 14.05.2009 20:09
SparcoCF

Цитата:
Возможно ли как то сделать так что бы данные которые я ввел оставались после нажатия кнопки "ИСКАТЬ" ?

когда "рисуете" форму, то проверяете.. если есть значение для данного поля (то есть форма уже отсылалась) то выставляете его.
при этом прочитайте про htmlentities во избежание XSS уязвимости
Автор: SparcoCF
Дата сообщения: 25.06.2009 18:27
Привет, возникла досадная проблема И так:
Есть поиск по автозапчастям, запрос выглядит так:

Код: $result = mysql_query("SELECT * FROM mercedes WHERE Nomer LIKE '".mysql_real_escape_string($_REQUEST['number'])."%'");
Автор: Cheery
Дата сообщения: 25.06.2009 18:39
SparcoCF

Цитата:
Возможно это повязано с тем что таблица у меня очень большая в ней состоит 527 000 записей (527 тысяч)

нет. иначе бы смысла в БД вообще не было

Цитата:
не находит ничего, записи в базе есть 100%

покажите как выглядит запрос и как выглядит то, что в базе
может вы пробелы добавляете где то
Автор: SparcoCF
Дата сообщения: 25.06.2009 19:30
Вот запрос:

Код: mysql_query("SELECT * FROM mercedes WHERE Nomer LIKE '".mysql_real_escape_string($_REQUEST['number'])."%'");
Автор: Cheery
Дата сообщения: 25.06.2009 19:35
SparcoCF

Цитата:
самой работы программы.

никого не интересует.
сделайте после/перед mysql_query
вывод того, что выполняется. через echo
echo "SELECT * FROM mercedes WHERE Nomer LIKE '".mysql_real_escape_string($_REQUEST['number'])."%'";
покажите типы полей
уверены, что в базе именно Икс, а не русская буква?

Страницы: 1234

Предыдущая тема: Вопросы по CSS


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.