2012-11-26 63 views
6

我有一个小问题。我正在与一些在编程/数据库设计方面未经培训的手动测试人员合作。我们目前的流程意味着这些手工测试人员需要在某些时候将数据插入到我们的数据库中,同时我们将构建一个GUI以促进这一点。创建一个站点来查询表的数据库

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

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

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

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

文艺青年最爱的是加粗的部分,为忙碌的人们:)

+6

你有一个奇怪的过程,我必须说 –

+1

如果你定义什么是“最合适”的意思,这将有所帮助。如果我输入“foo”,是否要在列名称或列数据中查找带'foo'的列? – Pondlife

+0

@ Dr.Dan我们的确做到了。这是暂时的:) –

回答

2

我想你可以用简单的表单和一些Ajax调用来实现这一点。 下面是一个简单的例子,其中每次用户在他们正在搜索的列名称中输入一个字母时,列表都会更新。

的Index.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'].'"'; 
         } 
    } 

当用户键入了一个列名都这样的列名将被即时返回并更新,而无需重新加载页面。希望这有帮助

1

我不知道如果我完全理解你的问题

在此请看:

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

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

+0

我想这应该这样做。特别是,如你所说,这个过程是暂时的。为此付出很多努力可能没有多大意义。如果你真的需要启用“模糊”搜索,我会说你应该在填充了你的数据库结构的表中使用全文索引。可以是Solr,也可以是纯粹的MyIsam表。不过,我相信这样做可能会带来比解决方案更多的麻烦。 – Muc

+2

-1,请不要推荐使用'mysql_'系列函数。在将来的PHP版本中,它们被弃用和删除。 – Charles

1

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

  1. 编写SQL脚本,它使得所有的东西都能检索到你需要的数据。
  2. 修改脚本添加列结果与简单的HTML格式化设置,使你得到像下面这样的记录:

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

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

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

1

使用mysql_connect方法,如果你使用MySQL和像输入数据:

INSERT INTO tablename 

和东西只是读到它。

+0

请不要**使用* mysql _ **系列函数。它们在未来的PHP版本中被弃用和删除 – Shoe

2

你应该做这样的事情:

形式:

<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>"; 

?> 
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_ID列将具有权重1. CUSTOMER_INCOME列将具有权重2,并且CUSTOMER_INCOME_AMOUNT将具有权重3.)计算每个表作为其列的权重的总和。

现在对于您的搜索返回的每个表格和列,将WEIGHT乘以RATING以确定SEARCH VALUE。按照搜索值的降序给测试人员提供匹配表的列表。在每个表中,还按照搜索值的降序列出列。

每次在搜索中出现表格或列时,请使用Elo评分系统对其评分为1000.0的对手给予胜利。每当用户选择要使用的列时,请将该列和其表格与对手评分1500.0进行比较。通过这种方式,最有用和最成功的表格和列将随着时间的推移有机地浮动到搜索列表的顶部。

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

这是另一个可选的增强功能 - 您可以在每个表格和列旁边放置一个(+)和( - )按钮,并且在用户点击(+)和损失如果用户点击( - ),则评级为零的对手。这将允许您的测试人员投票选择他们认为重要的列,并投票反对总是阻碍的列。

1

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

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

另一件事,你可以创建* .sql文件来自动填充数据库。

query.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用户-Ppassword数据库名称< filename.sql

相关问题