创建站点以查询表的数据库

时间:2012-11-26 12:17:18

标签: php sql sql-server database information-schema

我有一个小问题。我正在与一些未经过编程/数据库设计的手动测试人员合作。我们当前的流程意味着这些手动测试人员需要在特定时间将数据插入我们的数据库,同时我们构建GUI以便将来实现这一目标。

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

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

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

这里的任何输入都将非常感谢。非常感谢。

Tl; dr是粗体部分,适合忙碌的人:)

7 个答案:

答案 0 :(得分:3)

我认为你可以用一个简单的形式实现这一点,并且使用on key up进行一些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 :(得分: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 :(得分: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表中搜索具有任何这些关键字的任何列。根据命中数为每列分配一个重量。 (例如,如果搜索是“客户,金额,收入”,则列CUSTOMER_ID的权重为1.列CUSTOMER_INCOME的权重为2,CUSTOMER_INCOME_AMOUNT的权重为3.)计算权重每个表作为其列的权重之和。

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

每次在搜索中出现一个表格或列时,使用Elo评级系统为对手评级为1000.0提供WIN。每次用户选择要使用的列时,请将该列及其表格与对手评为1500.0的对象一起获胜。通过这种方式,最有用和最成功的表和列将随着时间的推移有机地浮动到搜索列表的顶部。

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

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

答案 3 :(得分:1)

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

看看这个:

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

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

答案 4 :(得分:1)

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

  1. 编写SQL脚本,使所有内容都能检索您需要的数据。
  2. 修改脚本以使用简单的html格式向结果集添加列,以使您获得如下结果记录:

    '<tr><td>', 'resultcolumn1', '</td><td>', 'resultcolumn2','</td></tr>'
    
  3. 使用带有输出选项的sqlcmd运行此脚本到文件。提供生成的文件.html扩展名。
  4. sqlcmd调用放在cmd文件中。调用sqlcmd调用Web浏览器后生成的html文件名作为参数。这将向测试人员显示您的结果。
  5. 因此,您的测试人员只运行带有一些参数的cmd文件并获取带有结果的html页面。当然你需要形成正确的html头部和身体标签,但这不是问题。

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

答案 5 :(得分:1)

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

INSERT INTO tablename

和其他东西只是阅读它。

答案 6 :(得分:1)

不确定您是否希望花时间撰写和支持您的解决方案。对于php / mysql,我会使用http://www.phpmyadmin.net/home_page/index.php或者如果用户可以直接访问db 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 USER -pPASSWORD database_name&lt; filename.sql