Простой скрипт выбора из базы данных.
Здравствуйте!
Требуется создать простой скрипт параметрического выбора из базы данных. Чем-то похоже на выбор в интернет-магазине, но с бОльшим количеством выбираемых параметров. Вот похожий аналог: http://www.compel.ru/catalog/interface/rs485-422 Вопрос №1: Может быть есть уже готовые скрипты под это? Если готового нету, то надо писать своё. Мне видется такая мысль - в отдельном файле лежит сама база (она подгружается вместе со страницей), а дальше - в зависимости от параметров выбора - переформируется таблица. Вопрос №2: Как переформировать полностью таблицу по скрипту? Вопрос №3: В каком формате сохранить базу данных, чтобы подгрузить ее потом, и достучаться до нее - из javascript.ru Заранее спасибо за ответы. |
Цитата:
|
Тут по сути ничего сложного... надо знать ajax и основы php...
|
А какого-нибудь примера, или готового решения - нету ?
|
Цитата:
|
Atridies,
есть другой вариант без ajax, это загружать с БД всю таблицу со всеми полями, а js уже по событиям выводить нужные поля... |
Цитата:
|
Цитата:
|
По ссылке пример посмотреть ..., а ведь база может вернуть весьма впечатляющий объем нефильтрованных данных. А уж отдавать клиенту таблицу базы да еще со всеми ее полями, структуру таблицы что-ли? Такого не стоит делать.
|
Пример я посмотрел, ничего объемного там не нашел))а что касается данных которых база вернет, то смотря какой запрос делать)))
|
Это просто пример "типа такого нужно", а сколько будет реально неизвестно.
Не важно какой запрос, вы же предлагаете все скопом на клиента скинуть. |
конечно сервер не гарантирует получение данных в том порядке в которых вы их ввели в БД, но тогда в чем проблема завести счетчик по id и сортировать по id ?
|
Нее, база там будет не особо большая. И первая моя идея - была как раз - отдавать всю таблицу, а потом уже js, чтобы отбирал необходимое.
Выдать пользователю всю базу - тоже нет проблем, пущай смотрят. Мне просто хотелось бы уменьшить писанину этого. С ajax - мне не разобраться быстро. Идеально было бы, если бы сервак отдавал статические данные, а на стороне клиента - уже все делалось. Вопрос: как мне тогда перезаполнить таблицу по событию? Как само событие перехватить я знаю. А вот как перестроить таблицу. Мне ее надо перестраивать ? Но откуда тогда брать источник? Или перестраивать прямо то, что уже есть на странице? P.S. Прошу простить, я в js - как-то совсем дуб дубом. Сам инженер-электронщик: на бейские писал, на сях, на ассемблере, на дельфях... Но с js - как-то много вопросов, ибо язык имеет другую идеологию. P.P.S. Во какая идея рождается: первоначально дается полная таблица, а после нажатия - прямо на лету осуществляется сортировка таблицы и в зависимости от параметров - меняются строки местами (реализация сортировки). Такое проканает ? |
https://jsfiddle.net/1rev1rmv/1/
Вот небольшой пример, есть колонка с чекбоксами , есть колонка с таблицей... Самовызывающаяся функция перебирает все чекбоксы получает от каждого его data-item , далее перебирает всю шапку таблицы и получает от каждого name, если нашел совпадение проверяет чекнут ли чекбокс, false -> колонку в шапке скрывает и перебирает все tr где находит td соответствующего номеру колонки в шапке и скрывает его тоже... Такой же принцип и у функции которая вызывается по клику на чекбоксы |
Я уверен что laimas,
в силах упростить этот скрипт...))))):help: |
Цитата:
Не надо заниматься ерундой когда есть готовое, нужно только научиться использовать это. Да, можно организовать базу данных на клиенте, и не надо ничего мудрить с localStorage, есть готовые решения. Но, они не обладают теми возможностями, которые изначально заложены в СУБД, а значит это нужно будет писать самому, и как вы это будете делать не зная даже простейшего из JS? Или вы думает, что написать такое проще чем написать ajax-запрос? Это заблуждение. Открывайте отладчик браузера и контролируйте сеть, просматривая пример по вашей ссылке. Это и есть ответ на ваш вопрос как сделать - клиент отправляет запрос серверу как набор параметров фильтра, SQL нужно лишь сделать единственный запрос согласно этим параметрам. Результаты запроса возвращаются как json. Из этих данных клиент строит таблицу. |
laimas,
Я думаю что Atridies сделает всю таблицу в html (не будет он её из БД загружать) а на js уже реализует фильтры...)) ибо молод он для php и ajax) |
Цитата:
Тут вопрос в том, что для каждой задачи - есть свое оптимальное решение. Наверное с ajax - это более правильно. Но мне не хочется тратить время на его изучение (ибо мне это мало где пригодится в жизни), а кроме того, это потребует поднятия на сервере БД, установки серверного js, разбирательства в том, как это поставить на хостинге. На первом этапе - для меня наиболее оптимально: сделать статическую страницу и перебирать ее на стороне клиента. По мере роста проекта - переделаю это. Точнее - закажу специалисту и он - сделает как надо. Еще спасибо за пример. Я там пока мало что понял, но это дело времени. Вещица полезная. И, кстати, я проверял: сайт компэла - действительно не дает запрос на сервер при пересортировке. Так что похоже он также сделан... |
Цитата:
|
Цитата:
Мне все равно как он сделает, но если речь идет о некой базе, то это и должна быть СУБД, не надо ее подменять расплывчатыми понятиями ради сомнительных идей. СУБД, это не просто хранение данных, это их сопровождение, что подразумевает большой спектр понятий. Именно данные конкретной СУБД и будут определять дальнейший скелет веб приложения. Но даже не зная, что скрывается за страшной аббревиатурой СУБД, ему никто не мешает задать вопрос относительно ее - как сделать выборку данных по условиям, ответ будет короткий: SELECT require_fields, filter_keys FROM table WHERE filter_keys=>filter_values ORDER BY filter_sort СУБД под приложение проектируют так, чтобы данные в ней были оптимизированы, в частности, если по примеру, то производителей лучше хранить в отдельной связанной таблице, как и некоторые характеристики, которые могут распределять изделия описанные в СУБД по неким классам. Тогда запрос дополнится всего лишь вложенным запросом/запросами для объединения таблиц: SELECT require_fields, filter_keys FROM table_name LEFT JOIN table_property join_conditions WHERE filter_keys=>filter_values ORDER BY filter_sort где join_conditions условия по равенству полей, по которым происходит объединение данных в запросе. Все остальное это: require_fields - поля SQL таблицы, которые должны быть всегда отображаться на клиенте не зависимо от параметров фильтра, если такое необходимо, filter_keys - ключи массива filter параметров фильтра полученного от клиента и определяющие запрашиваемые поля SQL таблицы, filter_keys=>filter_values - ключи->значения массива filter параметров фильтра определяющие условия выборки, если это необходимо и выбрано, filter_sort - поля определяющие сортировку результата выборки данных. Если при этом работать в PDO, то предварительная обработка полей массива filter перед передачей их в запрос не требуется - в качестве полей условий выборки подставляются именованные параметры :filter_key или неименованные (знак вопроса ?), а в качестве данных соответственно ассоциативный массив фильтра (как есть), или только его значения. Отдать клиенту полученное при этом совсем просто - echo json_encode($pdo->fetchAll()). В случае работы непосредственно с MySQL, что настоятельно не рекомендуется разработчиком, будет добавлена предварительная обработка входных данных (параметров фильтра), а получение массива данных из записей, это цикл while. И здесь больше моих слов, чем будет символов в реальном коде выборки данных из базы, который даже на средненьком форуме ему покажут. Мои слова ради объяснения того, что все просто. Если есть необходимость работать с базой на клиенте, то и в этом случае нужно работать с базой, а не localStorage в чистом виде, и для этого тоже уже есть готовое, не надо изобретать лисапеда. И только, если данные, это бублики с дырочками или без них, с маком или без него, и бублики будут вечны, можно рассуждать о плюшках, которые легко вписываются в нечто легкое для localStorage. Вот только по ссылке "типа этого" данные ну никак не вписываются в простоту, о которой вы утверждаете, значит вы не понимаете ни как подобные данные организуются, как связываются и как обслуживаются. А автору темы описывать свои конкретные данные, которые как он пишет будут просты до смешного, и забудет о понятие базы, и прописывает их сразу в js-файл объектом, или грузит единожды в localStorage, поступая по личному вкусу. Иначе получается, что ссылаются на серьезные темы, а разговор хрен знает о чем. |
Цитата:
|
Вот запрос сервер при выборе параметра "Напряжение питания"
Параметры _FV 8S-true actCatalog filter-visible eng SKp fid 8S page 1 Исходный код fid=8S&actCatalog=filter-visible&_FV=8S-true&page=1&eng=SKp А это маленький кусочек из json ответа сервера: {"s":{"c":"Catalog","a":"filter-visible","t":49.796,"tl":null},"stat":"ok","filter ":"on","thead":"<thead class=\"sorting\"><tr><td class=\"tc\"> <\/td><td class=\"tc\"><a href=\"#\" data-act-catalog= \"filter-show\" data-fid=\"_STOCK\" class=\"filter\"><img src=\"data:image\/png;base64,iVBORw Как видно из ответа, сервер вообще готовую html таблицу отдает. |
Цитата:
По нажатию "Источники питания" - да, грузится таблица. А если внути таблицы сделать выборку по питанию - то запроса не будет. |
Цитата:
Но чтобы поднять ее на хостинге - у меня займет несколько недель. Чтобы разобраться как отдавать данные - еще столько же. Нет желания разбираться в этом. Я электронщик и делаю инструмент, удобный для себя как для электронщика. Хочу сделать его как можно быстрее по времени и менее затратно по силам. Возможно поставить базу и настроить с js - совсем не сложно. Но это несложно для спеца. Мне сформировать гербер-файлы из альтиум - тоже очень просто, а вы будете разбираться несколько недель. Вот поэтому я ищу путь наименее сложный и наиболее дешевый на хостинге. Поставить на хостинге сервер, отдающий HTML - проблем не составит. Он у меня есть. |
Цитата:
Цитата:
Если же серьезно, то нужно описать данные, именно формат их, а уж затем вопрос как делать. Вот только смотря что за данные и что именно нужно, ибо написать на JS, которого вы не знаете, что-то, о чем тоже представление смутное, это не проще. |
Цитата:
|
Почему вы меня не слышите?
Занести данные в БД - не проблема совершенно. Важнее - что надо эту БД иметь на хостинге. А еще в том, что ее надо как-то связать с js. Это всё для меня - задача, требующая времени. Я знаю, что человеку подвластно многое, не надо из меня делать глупца. Вопрос для меня стоит не в этом, а в том, что ВСЕ ЗНАТЬ - нереально. И есть знания, полезные для меня, а есть - не очень. У меня список на изучение - чрезвычайно большой. И там нету ни js, ни ajax. Просто потому, что в моей специальности - это не требуется. И если у меня будет свободная минута, я ее потрачу на изучение ядра linux, чем на js. Дело не в возможности, а дело - во времени. Но вот незадача - я столкнулся с тем, что в определенных условиях я не могу работать также эффективно, как и раньше. В частности - при разработке оборудования из отечественных микросхем. Решил сделать для себя и не только - инструментарий, повышающий эффективность. А вы мне предлагаете - изучить ajax... Представьте: вы в Индии в городе вдруг придавило в туалет. Вам надо сказать: "где туалет" на хинди. А вам предлагают изучить грамматику и расстановку знаков препинания на хинди.... |
Цитата:
А с этим какие проблемы? Хост для вас не проблема как вы пишите, так хост чей, собственный, кроме статичных html-файлов ничего не отдающий? Ну так разве проблема взять платный хост, что в общем то недорого, который представляет и возможность базы данных, и язык серверный? Вы ведь тоже пишите такое, что ну прямо по космическим меркам не доступно. В вашем случае, если данные совсем просты, то "поднять базу" на сервере, это добавить ее имя в панели управления хостом и завести в ней таблицу. Все, что еще надо, а тем более что нет проблем заполнить ее данными и как это делается вам известно? А ajax запрос это вообще смешно, и учить чего-то неподъемного вас никто не заставляет, подключайте jQuery, а в используйте метод $.ajax или если удовлетворит простое, то еще проще: <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <script> $(function() { $('form').submit(function() { $.post('url_запроса', $(this).serializeArray(), function(data) { //data содержит ответ сервера, в данном случае ожидается json-формат, и он сразу будет преобразован в объект, из которого остается получить данные, обрамить тегами элементов таблицы и... }, 'json') }) }); </script> где, $(this).serializeArray(), это параметры выбранных фильтров, собственно поля формы, которые будут отправлены для сервера как массив - имя поля как ключ => значение поля. Как делать запросы к базе вы знаете. Эта часть вам неизвестная как раз очень проста. |
Прошу прощения, что пропал надолго.
Я разобрал Ваш код - он генерит POST-запрос к определенной странице не сервере. Вопрос №1. К какой странице я должен сделать запрос? У меня есть доступ по FTP к файловой системе моего сайта, есть адрес админки SQL. Имени файла БД - я не знаю. Вопрос №2. Как и где указать SQL-запрос в приведенном Вами примере? Например вот такой: "SELECT * FROM interface ORDER BY datarate" Вопрос №3. Как обрамить тегами ответ? Заранее спасибо за ответы. |
Цитата:
Цитата:
Цитата:
Вот к серверному скрипту (исполняемому файлу), который и должен содержать запрос к базе "SELECT * FROM interface ORDER BY datarate", и должен обращаться клиент (Ajax запрос в данном случае). Что именно за файл, а также путь к нему (страница), к которой будет обращение, это уже вам решать согласно вашим задумкам. Тут вариаций может быть много. Цитата:
Если данные для формы и их нужно связать с полями SQL таблицы, то это будут ассоциативный массив от сервера, а значит на клиенте будет объект. Для того чтобы поместить эти данные в таблицу в элементы формы нужно обойти их в цикле (методом .each() jQuery) и помещая свойство объекта в качестве имени для поля формы, а значение свойства в свойство value поля. Нужно отметить, что если данные из базы это строки, а тем более не являются доверенными, то на сервере их нужно обязательно обработать функцией htmlspecialchars(). Как в этом случае конкретно будет выглядеть код этот я затрудняюсь сказать, ибо для этого нужно знать конкретно не только структуру данных, но и то каким образом данные этой формы предполагается обрабатывать на сервере. Не охота чего-то написать общего, а потом долго утрясать мелочи. Если же данные нужно только отобразить на клиенте, то с сервера достаточно получить многомерный индексный массив (стоит отметить, что его же будет достаточно даже в случае, если данные не просто для отображения, но и для полей формы, но это отдельный разговор). В этом случае тоже может быть много способов построения из них таблицы на клиенте, но это будет опять таки обход их циклом. Если нужно что-то конкретно, поясните конкретно что к чему, ну или приведите пример того что нужно получить на клиенте с пояснением. |
по поводу безопасности - да, я понимаю, что такие права нельзя никому давать.
Везде в примерах - идет запрос к некому файлу *.php (если я правильно понимаю - это скрипт php, собственно - драйвер БД). Работа предполагается с MySQL. Как подключить mysqli в phpMyAdmin - я не нашел. "серверному скрипту который и должен содержать запрос". Этот файл не является каким-то стандартным? Я его самостоятельно должен написать на PHP? Т.е. правильно я понимаю: с клиента идет запрос на *.php файл, который преобразует этот запрос в определенный запрос к БД (вида "SELECT...") ? С сервера на страницу - достаточно вывести результат ответа за различные запросы в БД. Т.е. по запросу SELECT - выдается блок данных (таблица по сути) - вот ее бы и вывести. Этого будет вполне достаточно. Вот пример ответа: 5559ИН13У2, НПО Физика, МКИО, 2-х пров., 1, 1, 0, Н04.16-1В, 16, нет, 0, 4.5, 5.5, -60, 125, АЕЯР.431230.591ТУ 5559ИН15У, Миландр, LIN2.1, LVTTL, 1, 1, нет, 20, Н02.8-1В, 8, да, 0, 5, 27, -60, 125, АЕЯР.431230.653ТУ и т.д. |
Цитата:
Баз данных существует много, частое использование MySQL обусловлено не тем, что это лучшее решение, а тем, что это одна из бесплатных баз (она осталась такой даже после того как ее прибрала к рукам Oracle). РНР имеет набор функций для работы с различными базами, а эти функции как раз и есть расширение/драйвер для соответствующей базы. Они находятся в каталоге ext расширений РНР, и например для работы с MySQL из этого каталога должна быть подключена библиотека php_mysql.dll. Но как говорилось ранее, с версии РНР 5.5.0 она не рекомендуется (интерпретатор будет выдавать сообщения), и рекомендуют либо mysqli (библиотека - php_mysqli.dll), либо PDO MySQL (библиотека - php_pdo_mysql.dll). Данные библиотеки, в зависимости от выбора, подключаются в файле php.ini. Но в случае хостинга хостер зачастую уже подключает php_mysql.dll, а драйверы для mysqli или PDO MySQL нужно подключать самому. Но это делается не через php.ini в явном виде (хост к данному файлу дает доступ редко и не по всем настройкам, если конечно не случай VPS), а через панель управления хостом, в котором нужно выбрать модули (расширения) необходимые для работы, в том числе и эти драйверы (один из них). После сохранения выбора они будут прописаны в php.ini. И уже в зависимости от выбранного расширения для работы с MySQL в сценариях РНР пишут запросы и их обработку функциями соответствующего расширения. РМА - это инструмент для администрирования баз данных, то есть в нем можно непосредственно создавать/удалять базы данных, создавать/удалять в базе таблицы, видеть их параметры и изменять их, и .д.. Подключениями расширений РМА не занимается. Цитата:
Цитата:
if($q = mysql_query("SELECT * FROM interface ORDER BY datarate")) { //здесь получение строк записей из возвращенного ресурса $q //для просто поместить эти данные на клиенте в таблицу, достаточно индексного набора if(mysql_num_rows($q)) { $a = []; while ($r = mysql_fetch_row($q)) $a[] = array_map('htmlspecialchars', $r); //выдача данных клиенту //сайт должен работать в UTF, так как только с этой кодировкой работает json_encode //хотя можно прибегнуть к конвертированию, но это лишняя и неоправданная нагрузка echo json_encode($a); } else { //иначе база данных не содержит записей } } else { //в случае ошибки запроса к базе } где, mysql_query - функция делающая запрос к базе и она есть часть библиотеки php_mysql.dll. Читайте по ссылке о функциях РНР для работы с базами данных (соответственно выбранного расширения). На клиенте по получению данных (метод .ajax()): success: function(data){ if(!!data) { //будем считать, что таблица имеет описанный заголовок колонок ее в THEAD, а данные помещаются в TBODY, и таблица имеет id="mytable" var t = $('#mytable tbody').empty(), r; while(r = data.pop()) t.prepend('<tr><td>' + r.join('</td><td>') + '</td></tr>'); } } |
Часовой пояс GMT +3, время: 04:20. |