Перейти к содержанию
senty

[Студентам] Выборка из MySQL посредством PHP

Рекомендуемые сообщения

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

Выслали тестовое задание:

Дано:

есть база 10 девушек. У каждой девушки есть несколько параметров (цвет глаз, фигура, цвет волос, длина волос, увлечения). Все параметры у каждой девушки обязательно заполнены.

Возможные варианты:

цвет глаз (голубые, карие, темные, зеленые),

фигура (стройная, упитанная, плотная, толстая),

цвет волос (светлые, темные, рыжие),

длина волос (наголо, коротко, средне, длинные),

увлечения (футбол, спорт, атлетика, прогулки, книги, диско).

Задача:

сделать форму подбора девушки по нескольким полям (если выбрано несколько полей, то при поиске они соединяются логическим выражением "И", т.е. чем больше полей выбрано тем меньше результатов выдачи).

Можно использовать, но не обязательно, что все сразу (используйте столько сколько необходимо, чтобы это было юзабилити и максимально просто технически:

html, css, php, javaScript, jQuery, MySQL, ajax

Внимательно перепроверьте на ошибки - это не допустимо!

Пожелания:

Максимальное удобство в работе за счет размеров и расположения кнопок, форм, сообщений, подсказок (оформление картинками не нужно).

Максимально простой, понятный код.

Структурность.

Я предложил решение:

<html>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<head><style type="text/css">li {list-style-type: none}ul {margin-left: 0; padding-left: 0}</style><title>Тестовое задание</title></head>
<body>
<form action="test.php" method=post>
<table style="text-align: left; width: 100%;" border="1" cellpadding="2" cellspacing="2">
<tbody><tr><td>Цвета глаз
<ul><li><input type="radio" name="color_eye" value="Зелёные">Зелёные</li>
<li><input type="radio" name="color_eye" value="Голубые">Голубые</li>
<li><input type="radio" name="color_eye" value="Карие">Карие</li>
<li><input type="radio" name="color_eye" value="Тёмные">Тёмные</li></ul></td>
<td>Фигура
<ul><li><input type="radio" name="figure" value="стройная">Стройная</li>
<li><input type="radio" name="figure" value="упитанная">Упитанная</li>
<li><input type="radio" name="figure" value="плотная">Плотная</li>
<li><input type="radio" name="figure" value="толстая">Толстая</li></ul></td>
<td>Цвет волос
<ul><li><input type="radio" name="color_hair" value="светлые">Светлые</li>
<li><input type="radio" name="color_hair" value="тёмные">Тёмные</li>
<li><input type="radio" name="color_hair" value="рыжие">Рыжие</li></ul></td>
<td>Длина волос
<ul><li><input type="radio" name="length_hair" value="наголо">Наголо</li>
<li><input type="radio" name="length_hair" value="коротко">Коротко</li>
<li><input type="radio" name="length_hair" value="средне">Средне</li>
<li><input type="radio" name="length_hair" value="длинные">Длинные</li></ul></td>
<td>Увлечения
<ul><li><input type="radio" name="hobbies" value="футбол">Футбол</li>
<li><input type="radio" name="hobbies" value="спорт">Спорт</li>
<li><input type="radio" name="hobbies" value="атлетика">Атлетика</li>
<li><input type="radio" name="hobbies" value="прогулки">Прогулки</li>
<li><input type="radio" name="hobbies" value="книги">Книги</li>
<li><input type="radio" name="hobbies" value="диско">Диско</li>
</ul></td></tr></tbody></table>
<input type=submit name="filter" value=".."></form>
<?php
//Имя базы данных
$mysql_database="3colors_testwork";
//Имя пользователя базы данных
$mysql_username="root";
//Пароль пользователя базы данных
$mysql_password="000000";
//Сервер базы данных
$mysql_host="localhost";
//Подключение
$mysql_connect = mysql_connect($mysql_host, $mysql_username, $mysql_password);
//Выбираем базу данных для работы
mysql_select_db($mysql_database);
//Устанавливаем кодировку для соединения базы данных
mysql_query("SET NAMES utf8");
//Выборка данных из таблицы
$result=mysql_query("SELECT * FROM `girls`
WHERE `color_eye` like '".(isset($_POST['color_eye']) ? $_POST['color_eye'] : '%' )."'
AND `figure` like '".(isset($_POST['figure']) ? $_POST['figure'] : '%' )."'
AND `color_hair` like '".(isset($_POST['color_hair']) ? $_POST['color_hair'] : '%' )."'
AND `length_hair` like '".(isset($_POST['length_hair']) ? $_POST['length_hair'] : '%' )."'
AND `hobbies` like '".(isset($_POST['hobbies']) ? $_POST['hobbies'] : '%' )."'
");
//Вывод на страницу
echo '<table border="1">
<thead>
<td>Имя</td>
<td>Цвет глаз</td>
<td>Фигура</td>
<td>Цвет волос</td>
<td>Длина волос</td>
<td>Увлечение</td>
</thead>
<tbody>';
//данных помещенных в массивеse
while ($array = mysql_fetch_array($result))
{echo '<tr>
<td>'.$array['name'].'</td>
<td>'.$array['color_eye'].'</td>
<td>'.$array['figure'].'</td>
<td>'.$array['color_hair'].'</td>
<td>'.$array['length_hair'].'</td>
<td>'.$array['hobbies'].'</td>
</tr>';}
echo '</tbody></table>'?>
</body>
</html>

Я конечно понимаю, что лучше все это реализовывать с использованием функций и т.п., но это я смог сделать лишь при своих знаниях и немного подглядывая в гугл.

Может-быть кто-то тут такие задачи как "орехи щелкает" и подскажет в чем мои ошибки? Так сказать набудующее.

Я вообще все это себе представлял по-другому, а именно:

1. Выборка из БД всех девушек

2. Отображение таблицы с девушками

3. Фильтрация в живом режиме по выбранным параметрам, которые указаны в тэге

<input type="checkbox">

ps моё решение их не устроило =) Думал что вышлют пример решения, но увы - они сами не решали..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Думаю использование LIKE было основной причиной отказа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

во первых LIKE не совсем уместен тут, хотя работать и будет, во вторых вы выводите только 1 девушку, а если их больше с такими запросами?)

по поводу:

Я вообще все это себе представлял по-другому, а именно:

1. Выборка из БД всех девушек

2. Отображение таблицы с девушками

3. Фильтрация в живом режиме по выбранным параметрам, которые указаны в тэге

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

ну и выбирать лучше не по "карие", а например карие это 1, голубые 2 и тд.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну тут несколько причин:

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

Всегда быстрее делать что-либо с целыми числами, поэтому вместо поиска символьных значений, нужно было присвоить каждому значению свой идентификатор, так, например, ваши критерии выглядели бы:

...
<td>Увлечения
<ul><li><input type="radio" name="hobbies" value="10">Футбол</li>
<li><input type="radio" name="hobbies" value="11">Спорт</li>
<li><input type="radio" name="hobbies" value="12">Атлетика</li>
<li><input type="radio" name="hobbies" value="13">Прогулки</li>
<li><input type="radio" name="hobbies" value="14">Книги</li>
<li><input type="radio" name="hobbies" value="15">Диско</li>
</ul></td></tr></tbody></table>
...

тогда запрос выглядел бы:

SELECT * FROM `girls` WHERE ... `color_eye` = `3` AND `hobbies` = `15` ...

Второе, не следовало вставлять проверку на существование POST переменной прямо в запрос

(isset($_POST['figure']) ? $_POST['figure'] : '%' )

Это не критично, но и нежелательно.

Вполне приемлемый вариант имеет вид:

if (isset($_POST['color_hair'])) {
  $sql .= " AND `color_hair` LIKE '%" . mysql_real_escape_string($_POST['color_hair']) . "%'";
}

Третье, если уж вы решили искать по символьным выражениям, не мешало бы пропустить их через функцию mysql_real_escape_string($string), не боясь о недопустимых символах в строке.

Посему желаю не сдаваться и немного почитать про оптимизацию MySQL запросов.

P.S. Я, когда-то пытаясь устроиться, тоже получил подобное задание, неуверенность в своих знаниях отбило желание даже пытаться решить задачу, а вы, вот, попробовали, зато теперь знаете. Удачи!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.