Создание сайта для запросов к базе данных таблиц

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

Тем временем я хотел бы создать простой сайт. Что я хотел бы сделать с сайтом, так это просто подключиться к нашей базе данных, позволить тестировщику вручную ввести некоторые ключевые слова и вернуть любые столбцы в таблицах, которые близки или связаны с предоставленными ключевыми словами. Это сэкономит много времени нашим тестировщикам, ищущим столбцы в нашей (довольно большой) базе данных.

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

На данный момент я думаю о простой PHP-странице с текстовым полем, которое позволяет пользователю вводить некоторые данные, разделенные запятыми. Взорвите данные на основе запятых, сохраните их в массиве. Подключитесь к моей базе данных, затем используйте представление информационной схемы для получения информации о столбце. Моя основная проблема заключается в том, как наиболее эффективно использовать представление информационной схемы для извлечения столбцов, связанных с ключевыми словами, введенными пользователями? Как убедиться, что возвращаемые столбцы являются наиболее подходящими?

Любой вклад здесь будет принят с благодарностью. Большое спасибо.

Tl;dr выделен жирным шрифтом, для занятых людей :)


person Simon Kiely    schedule 26.11.2012    source источник
comment
У вас странный процесс, я должен сказать   -  person Dr. Dan    schedule 26.11.2012
comment
Было бы полезно, если бы вы определили наиболее подходящие средства. Если я введу «foo», вы хотите найти столбцы с «foo» в имени столбца или в данных столбца?   -  person Pondlife    schedule 26.11.2012
comment
@Dr.Dan Действительно. Это временно :)   -  person Simon Kiely    schedule 26.11.2012
comment
@Pondlife Извините, я должен был быть более ясным. С foo в имени столбца было бы лучше! :)   -  person Simon Kiely    schedule 26.11.2012
comment
Почему бы не использовать существующее приложение, которое будет подключаться к вашей базе данных? Я не знаю, что вы используете в качестве языка SQL (MySQL, Oracle SQL ..), но я думаю, что у большинства языков есть приложение, которое позволяет легко редактировать. Если это действительно временно, то это лучший вариант для меня.   -  person ndsmyter    schedule 26.11.2012
comment
Я предполагаю, что из документации для INFORMATION_SCHEMA.COLUMNS очевидно, как получить информация вам нужна? Хотя sys.columns обычно предпочтительнее, поскольку «родное» представление метаданных, которое предоставляет больше информации, чем INFORMATION_SCHEMA.   -  person Pondlife    schedule 26.11.2012
comment
Зачем тестировщикам искать столбцы в базе данных? Не можете ли вы предоставить терминальный сервер и предоставить ему Management Studio (и заблокировать разрешения, чтобы они могли только читать/вставлять)? С натяжкой вы можете установить студию управления на машины тестировщиков (зависит от того, сколько). Существует отличный бесплатный инструмент поиска под названием Sql Search от Red Gate, который индексирует и позволяет легко выполнять поиск по всей схеме БД — вы можете использовать его вместо того, чтобы создавать свои собственные. Если это уже было изобретено, нет смысла изобретать его заново (поскольку это бесплатно!)   -  person Charleh    schedule 05.12.2012
comment
Просто создайте VIEW (если вам нужны объединения, в противном случае просто оставьте таблицы такими, какие они есть), а затем запустите простые поисковые запросы. Отобразите результаты, используя простую таблицу HTML. Вы можете использовать INFORMATION_SCHEMA, чтобы узнать, где у вас есть данные, совместимые с условиями LIKE, а где нет. Кроме того, если вы хотите еще меньше работы, настройте PHPMyAdmin с пользователем db и паролем с разрешениями только на чтение и позвольте вашим пользователям использовать встроенные формы поиска.   -  person Tiberiu-Ionuț Stan    schedule 10.12.2012


Ответы (7)


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

Индекс.html

  <!DOCTYPE html>
<html lang="en">
  <head>
  <script type="text/javascript"> 
      $(document).ready(function() {

$("#faq_search_input").keyup(function()
{
var faq_search_input = $(this).val();
var dataString = 'keyword='+ faq_search_input;
if(faq_search_input.length>1)

{
$.ajax({
type: "GET",
url: "ajax-search.php",
data: dataString,
success: function(server_response)
{
 document.getElementById("searchresultdata").style.display = "block";
$('#searchresultdata').html(server_response).show();

}
});
}return false;
});
});

</script>


  </head>
  <body>
<div class="searchholder">
    <input  name="query" class="quicksearch" type="text" id="faq_search_input" />
        <div id="searchresultdata" class="searchresults" style="display:none;"> </div>
</div>
  </body>
</html>

далее нам нужен скрипт для выполнения нашего поиска

ajax-search.php

    //you must define your database settings
define("DB_HOST", "FOO");
define("DB_USERNAME", "BAR");
define("DB_PASSWORD", "YOUR PASSWORD");
define("DB_NAME", "DATABASE NAME");
if(isset($_GET['keyword']))
    {
        $search = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);
            if ($search->connect_errno)
            {
                echo "Failed to connect to MySQL: (" . $search->connect_errno . ") " . $search->connect_error;
                $search->close();
            }
                $keyword =  trim($_GET['keyword']) ;
                $query ="SELECT COLUMN_NAME FROM ".DB_NAME.".INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE '%".$keyword."%'";
                $values = $search->query($query);
                    if($values->num_rows != 0)
                    {
                        while($row = $values->fetch_assoc())
                        { 
                            echo $row['COLUMN_NAME']."<br>";
                        } 
                    }
                    else
                        {
                            echo 'No Results for :"'.$_GET['keyword'].'"';
                        }
    }

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

person ROY Finley    schedule 12.12.2012

Вы должны сделать что-то вроде этого:

Форма:

<form action="search.php" method="post">
<textarea name="words"></textarea>
<input type="submit">
</form>

search.php

<?php

// You will need a DB user with enough permissions
$link = mysqli_connect($server,$user,$pass);
mysqli_select_db($link,$database_name);

print "<table>";

// Comma separated
$words = explode(",",$_POST['words']);

foreach ($words as $word)
{

 $sql = "SELECT COLUMN_NAME FROM ".$database_name.".INFORMATION_SCHEMA.COLUMNS
 WHERE COLUMN_NAME LIKE '%".$word."%'";

 $res = mysqli_query($link,$sql);

 while ($row = mysqli_fetch_assoc($res))
 {
  print "<tr><td>".$row['COLUMN_NAME']."</td></tr>";
 }

}

print "</table>";

?>
person Mickle Foretic    schedule 10.12.2012

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

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

Сначала создайте две простые таблицы для хранения рейтинговой информации для таблиц и столбцов в вашей базе данных. Вот начальная структура.

TEST_SEARCH_TABLES:
  TABLE_ID
  TABLE_NAME
  RATING

TEST_SEARCH_COLUMNS:
   COLUMN_ID
   TABLE_ID
   COLUMN_NAME
   RATING

Заполните TEST_SEARCH_TABLES именем каждой таблицы в вашей базе данных. Заполните TEST_SEARCH_COLUMNS именем каждого столбца и свяжите его с соответствующей таблицей. Инициализируйте все столбцы РЕЙТИНГА значением 1000.0 — вы будете использовать Систему рейтинга Эло чтобы дополнить ваш рейтинг, потому что он прост, легко реализуем и отлично работает.

Когда пользователь вводит список ключевых слов, не используйте представление информационной схемы. Вместо этого выполните поиск в таблице TEST_SEARCH_COLUMNS любых столбцов, содержащих любое из этих ключевых слов. Назначьте каждому столбцу ВЕС в зависимости от количества обращений. (Например, если поиск «клиент, сумма, доход», тогда столбец CUSTOMER_ID будет иметь вес 1. Столбец CUSTOMER_INCOME будет иметь вес 2, а CUSTOMER_INCOME_AMOUNT будет иметь вес 3.) Вычислите WEIGHT каждая таблица как сумма весов ее столбцов.

Теперь для каждой таблицы и столбца, возвращенных вашим поиском, умножьте ВЕС на РЕЙТИНГ, чтобы определить ЦЕННОСТЬ ПОИСКА. Дайте тестеру список совпадающих таблиц в порядке убывания значения поиска. В каждой таблице также перечислите столбцы в порядке убывания их поискового значения.

Каждый раз, когда таблица или столбец появляются в результатах поиска, используйте рейтинговую систему Эло, чтобы присвоить ей ВЫИГРЫШ над соперником с рейтингом 1000,0. Каждый раз, когда пользователь выбирает столбец для работы, дайте этому столбцу и его таблице победу над противником с рейтингом 1500,0. Таким образом, наиболее полезные и успешные таблицы и столбцы со временем будут органично всплывать в верхней части ваших списков поиска.

Дополнительным преимуществом этого подхода (с использованием таблиц вместо представления информационной схемы) является то, что этот подход является более расширяемым. В качестве улучшения вы можете поместить столбцы DESCRIPTION и COMMENTS в таблицы TEST_SEARCH_TABLES и TEST_SEARCH_COLUMNS, а также искать в этих столбцах совпадения ключевых слов.

Вот еще одно необязательное улучшение — вы можете поместить кнопки (+) и (-) рядом с каждой таблицей и столбцом и дать ему победу над противником с рейтингом 2000, если пользователь нажмет (+), и проигрыш против игрока с нулевым рейтингом. противника, если пользователь нажмет (-). Это позволит вашим тестировщикам голосовать за столбцы, которые они считают важными, и против столбцов, которые всегда мешают.

person Community    schedule 11.12.2012

Я не уверен, что полностью понял вашу проблему

Взгляните на это:

http://php.net/manual/en/function.mysql-list-tables.php

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

person Ardavan Kalhori    schedule 06.12.2012
comment
Я думаю, это должно сделать это. Особенно если, как вы говорите, этот процесс временный. Наверное, нет смысла прилагать к этому много усилий. Если вам действительно нужно включить нечеткий поиск, я бы сказал, что вы должны использовать полнотекстовые индексы в таблице, заполненной структурой вашей базы данных. Это может быть Solr или простые таблицы MyIsam. Тем не менее, я считаю, что этот путь, вероятно, принесет больше проблем, чем решений. - person Muc; 08.12.2012
comment
-1, не рекомендуется использовать семейство функций mysql_. Они устарели и удаляются в будущих версиях PHP. - person Charles; 08.12.2012

Я думаю, что это можно сделать в следующих шагах без какого-либо программирования на PHP и даже без необходимости в каком-либо веб-сервере.

  1. Напишите SQL-скрипт, который сделает все, чтобы получить нужные вам данные.
  2. Измените скрипт, чтобы добавить столбцы в результирующий набор с простым форматированием html, чтобы сделать результирующую запись, как показано ниже:

    '<tr><td>', 'resultcolumn1', '</td><td>', 'resultcolumn2','</td></tr>'
    
  3. Запустите этот скрипт, используя sqlcmd с параметром вывода в файл. Дайте полученному файлу расширение .html.
  4. Поместите вызов sqlcmd в файл cmd. После вызова sqlcmd вызовите веб-браузер с результирующим именем файла html в качестве параметра. Это отобразит ваши результаты тестировщику.

Итак, ваши тестеры запускают только cmd-файл с некоторыми параметрами и получают html-страницу с результатами. Конечно нужно формировать правильные html теги head и body, но это не проблема.

Теперь о вашем основном вопросе о том, как вы можете быть уверены, что возвращаемые столбцы являются наиболее подходящими. Я думаю, что наиболее надежным из самых простых способов является создание таблицы тезауруса, которая содержит синонимы для имен ваших столбцов. (Это могут сделать сами тестировщики). Таким образом, вы можете искать имена столбцов в представлении информационной схемы, используя LIKE в INFORMATION_SCHEMA.COLUMNS, а также в таблице тезауруса.

person Serg    schedule 06.12.2012

Не уверен, что вы хотите тратить время на написание и поддержку вашего решения. Для php/mysql я бы использовал http://www.phpmyadmin.net/home_page/index.php или если пользователи могут напрямую обращаться к БД http://dev.mysql.com/downloads/gui-tools/5.0.html

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

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

запрос.sql

CREATE TABLE "example" (
    "id" INT NOT NULL AUTO_INCREMENT, 
    "name" VARCHAR(30), 
    "age" INT
);

INSERT INTO "example" VALUES
('1', 'a', 1),    
('2', 'b', 2);

чем вы можете запустить его из командной строки:

mysql -u USER -pPASSWORD имя_базы_данных ‹ имя_файла.sql

person E_p    schedule 11.12.2012

Используйте метод mysql_connect, если вы используете mysql и вводите такие данные, как:

INSERT INTO tablename

и прочее только что прочитал об этом.

person Community    schedule 08.12.2012
comment
Пожалуйста, не рекомендуйте использовать семейство функций mysql_*. Они устарели и будут удалены в будущих версиях PHP. - person Shoe; 12.12.2012