2012-11-26 106 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

相關問題