6

小さな問題があります。私はプログラミング/データベース設計の訓練を受けていない手動テスターと協力しています。現在のプロセスでは、これらの手動テスターは特定の時間にデータベースにデータを挿入する必要がありますが、将来的にはこれを容易にするためにGUIを構築します。

とりあえず、簡単なサイトを作りたいと思います。私がこのサイトでやりたいのは、データベースに接続し、手動テスターがいくつかのキーワードを入力できるようにし、提供されたキーワードに近い/関連するテーブル内の列を返すことです。これにより、テスターが(かなり大きな)データベースで列を検索する時間を大幅に節約できます。

どうすればこのようなサイトを作成できますか?多くの人に役立つと思うので、ここに質問を投稿して、StackOverflowの考えをまとめることにしました。

現時点では、ユーザーがコンマで区切ってデータを入力できるテキストボックスを備えた単純なPHPページを考えています。カンマに基づいてデータを分解し、配列に保持します。データベースに接続し、情報スキーマビューを使用して列情報を取得します。 私の主な問題は、ユーザーが入力したキーワードに関連する列を取得するために情報スキーマビューを使用する最も効果的な方法は何ですか?返された列が最適であることを確認するにはどうすればよいですか?

ここでの入力をいただければ幸いです。どうもありがとう。

Tl; drは、忙しい人のための太字の部分です:)

4

7 に答える 7

3

これは、単純なフォームと、キーアップを使用したいくつかの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'].'"';
                        }
    }

ユーザーが列名を入力すると、このようなすべての列名が返され、ページをリロードせずにその場で更新されます。お役に立てれば

于 2012-12-12T00:44:17.007 に答える
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 評価システムを使用してランキングを補完します。これはシンプルで実装が簡単で、うまく機能するためです。

ユーザーがキーワードのリストを入力するときは、情報スキーマ ビューを使用しないでください。代わりに、TEST_SEARCH_COLUMNS テーブルを検索して、これらのキーワードのいずれかを持つ列を探します。ヒット数に基づいて各列に WEIGHT を割り当てます。(たとえば、検索が「customer,amount,income」の場合、列 CUSTOMER_ID の重みは 1 になります。列 CUSTOMER_INCOME の重みは 2 になり、CUSTOMER_INCOME_AMOUNT の重みは 3 になります。)各テーブルは、その列の重みの合計として表されます。

検索で返された各テーブルと列について、WEIGHT に RATING を掛けて、検索値を決定します。検索値の降順で一致するテーブルのリストをテスターに​​渡します。各テーブル内で、検索値の降順で列もリストします。

表または列が検索に表示されるたびに、Elo レーティング システムを使用して、レーティング 1000.0 の対戦相手に対して勝利を与えます。ユーザーが操作する列を選択するたびに、その列とそのテーブルの両方に、レーティング 1500.0 の相手に対して勝利を与えます。このようにして、最も有用で成功したテーブルと列が、時間の経過とともに有機的に検索リストの上位に表示されます。

このアプローチ (情報スキーマ ビューの代わりにテーブルを使用する) の副次的な利点は、このアプローチがより拡張可能であることです。拡張機能として、DESCRIPTION 列と COMMENTS 列を TEST_SEARCH_TABLES および TEST_SEARCH_COLUMNS テーブルに配置し、これらの列でキーワードの一致も検索できます。

別のオプションの拡張機能を次に示します。各テーブルと列の横に (+) と (-) ボタンを配置し、ユーザーが (+) をクリックするとレーティング 2000 の対戦相手に対して勝利し、レーティング 0 の対戦相手に対して敗北を与えることができます。ユーザーが (-) をクリックすると対戦相手。これにより、テスターは重要な列に投票し、常に邪魔になる列に反対票を投じることができます。

于 2012-12-11T17:52:42.833 に答える
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 に答える
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. sqlcmdcmd ファイル内に呼び出しを配置し​​ます。sqlcmd結果のhtmlファイル名をパラメータとしてWebブラウザを呼び出した後。これにより、結果がテスターに​​表示されます。

したがって、テスターはいくつかのパラメーターを指定して cmd ファイルのみを実行し、結果を含む html ページを取得します。もちろん、正しい html の head タグと body タグを作成する必要がありますが、これは問題ではありません。

返された列が最適であることを確認する方法についての主な質問について。最も単純な方法で最も信頼できるのは、列名の同義語を含むシソーラス テーブルを作成することだと思います。(これは、テスター自身が行うことができます)。そのため、INFORMATION_SCHEMA.COLUMNS およびシソーラス テーブルで LIKE を使用して、情報スキーマ ビューから列名を検索できます。

于 2012-12-06T18:48:48.463 に答える
1

ソリューションの作成とサポートに時間を費やしたいかどうかわからない. php/mysqlのhttp://www.phpmyadmin.net/home_page/index.php場合、またはユーザーがdbに直接アクセスできる場合 に使用しますhttp://dev.mysql.com/downloads/gui-tools/5.0.html

使い方を教えるには時間がかかるかもしれませんが、長期的には多くの問題を解決できます。

もう 1 つのこととして、db に自動的に入力される *.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

于 2012-12-11T18:49:11.387 に答える
1

mysql を使用mysql_connectし、次のようなデータを入力する場合は、メソッドを使用します。

INSERT INTO tablename

そして、それについて読んだだけのもの。

于 2012-12-08T20:56:10.100 に答える