6

我有一个小问题。我正在与一些未受过编程/数据库设计培训的手动测试人员合作。我们当前的流程意味着这些手动测试人员需要在某些时候将数据插入我们的数据库,而我们会构建一个 GUI 来促进这一点。

在此期间,我想创建一个简单的站点。我想对该站点做的就是简单地连接到我们的数据库,允许手动测试人员输入一些关键字,并返回表中与提供的关键字密切/相关的任何列。这将为我们的测试人员在我们(相当大的)数据库中搜索列节省大量时间。

我怎么能创建这样的网站?我认为它可能对很多人有用,所以我决定在这里发布这个问题来收集 StackOverflow 的想法。

目前,我正在考虑一个带有文本框的简单 PHP 页面,它允许用户输入一些数据,用逗号分隔。根据逗号分解数据,将其保存在数组中。连接到我的数据库,然后使用信息架构视图检索列信息。 我的主要问题是 - 使用信息架构视图检索与用户输入的关键字相关的列的最有效方法是什么?如何确保返回的列是最合适的

这里的任何输入将不胜感激。非常感谢。

Tl;博士是粗体部分,对于忙碌的人:)

4

7 回答 7

3

我认为你可以通过一个简单的表单和一些使用 on key up 的 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'].'"';
                        }
    }

当用户输入列名时,所有像这样的列名都将被返回并即时更新,无需重新加载页面。希望这可以帮助

于 2012-12-12T00:44:17.007 回答
2

你应该这样做:

形式:

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

搜索.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>";

?>
于 2012-12-10T02:25:09.460 回答
2

我明白你为什么要问这个有趣的问题。如果测试人员输入关键字列表,而您使用信息模式视图获取匹配列的列表,则存在大量错误匹配的危险,这可能会浪费时间或导致测试人员输入错误信息进入你的系统。您想知道如何确定哪些列与测试人员的查询最匹配。但是你想保持简单,因为这只是一个临时的解决方法,它不是你的主要应用程序。

答案是使用基于信誉的系统来补充搜索结果。这是一个非常简单的,应该适用于您的应用程序。

首先,创建两个简单的表来存储数据库中表和列的评级信息。这是起始结构。

TEST_SEARCH_TABLES:
  TABLE_ID
  TABLE_NAME
  RATING

TEST_SEARCH_COLUMNS:
   COLUMN_ID
   TABLE_ID
   COLUMN_NAME
   RATING

使用数据库中每个表的名称填充 TEST_SEARCH_TABLES。使用每列的名称填充 TEST_SEARCH_COLUMNS,并将其链接到相应的表。将所有 RATING 列初始化为 1000.0 - 您将使用Elo Rating System来补充您的排名,因为它简单、易于实施并且效果很好。

当用户输入关键字列表时,不要使用信息架构视图。相反,在 TEST_SEARCH_COLUMNS 表中搜索具有这些关键字的任何列。根据点击数为每列分配一个 WEIGHT。(例如,如果搜索是“customer,amount,income”,则 CUSTOMER_ID 列的权重为 1。CUSTOMER_INCOME 列的权重为 2,CUSTOMER_INCOME_AMOUNT 的权重为 3。)计算 WEIGHT每个表作为其列的权重之和。

现在,对于搜索返回的每个表和列,将 WEIGHT 乘以 RATING 以确定搜索值。给测试者一个按搜索值降序排列的匹配表列表。在每个表中,还按搜索值的降序列出列。

每次在搜索中出现表格或列时,使用 Elo 评级系统使其与评级为 1000.0 的对手获胜。每次用户选择要使用的列时,都要让该列和它的表格战胜一个评分为 1500.0 的对手。通过这种方式,最有用和最成功的表格和列将随着时间的推移自然地浮到搜索列表的顶部。

这种方法的一个附带好处(使用表而不是信息模式视图)是这种方法更具可扩展性。作为一项增强功能,您可以将DESCRIPTION 和COMMENTS 列放在TEST_SEARCH_TABLES 和TEST_SEARCH_COLUMNS 表上,并且还可以在这些列中搜索关键字匹配项。

这是另一个可选的增强功能 - 您可以在每个表和列旁边放置一个 (+) 和 (-) 按钮,如果用户单击 (+),则它可以战胜 2000 评分的对手,而输给零评分的对手如果用户单击 (-),则为对手。这将允许您的测试人员投票支持他们认为重要的列,并投票反对总是妨碍您的列。

于 2012-12-11T17:52:42.833 回答
1

我不确定我是否完全理解您的问题

看看这个:

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

您可以获取数据库中的所有表,将它们存储在一个数组中,然后使用您的关键字过滤它们

于 2012-12-06T01:26:26.837 回答
1

我认为这可以在以下步骤中完成,无需任何 PHP 编程,甚至不需要任何 Web 服务器。

  1. 编写 SQL 脚本,使一切都可以检索您需要的数据。
  2. 修改脚本以使用简单的 html 格式将列添加到结果集中,以使您的结果记录如下:

    '<tr><td>', 'resultcolumn1', '</td><td>', 'resultcolumn2','</td></tr>'
    
  3. sqlcmd使用带有输出选项的文件运行此脚本。给出生成的文件.html扩展名。
  4. 在cmdsqlcmd文件中调用。在sqlcmd使用生成的 html 文件名作为参数调用 web 浏览器之后。这会将您的结果显示给测试人员。

因此,您的测试人员只运行带有一些参数的 cmd 文件并获得带有结果的 html 页面。当然你需要形成正确的 html 头和体标签,但这不是问题。

现在关于您如何确定返回的列是最合适的主要问题。我认为最简单的方法中最可靠的方法是创建包含列名同义词的词库表。(这可以由测试人员自己完成)。因此,您可以使用 INFORMATION_SCHEMA.COLUMNS 以及同义词表中的 LIKE 从信息架构视图中搜索列名。

于 2012-12-06T18:48:48.463 回答
1

如果您使用 mysql 并输入如下数据,请使用mysql_connect方法:

INSERT INTO tablename

和刚刚读到的东西。

于 2012-12-08T20:56:10.100 回答
1

不确定您是否想花时间编写和支持您的解决方案。对于 php/mysql 我会使用http://www.phpmyadmin.net/home_page/index.php或者如果用户可以直接访问 db http://dev.mysql.com/downloads/gui-tools/5.0.html

可能需要一些时间来技术他们如何使用它,但从长远来看会节省很多问题。

另一件事,您可以创建 *.sql 文件来自动填充 db。

查询.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

于 2012-12-11T18:49:11.387 回答