2012-11-26 15 views
6

डेटाबेस के डेटाबेस से पूछताछ करने के लिए साइट बनाना मुझे एक छोटी सी समस्या है। मैं कुछ मैनुअल टेस्टर्स के साथ काम कर रहा हूं जो प्रोग्रामिंग/डेटाबेस डिज़ाइन में अनियंत्रित हैं। हमारी वर्तमान प्रक्रिया का मतलब है कि इन मैनुअल टेस्टर्स को कुछ समय पर हमारे डेटाबेस में डेटा डालने की आवश्यकता होती है, जबकि हम भविष्य में इसे सुविधाजनक बनाने के लिए एक जीयूआई बनाते हैं।तालिका

अंतरिम में, मैं एक साधारण साइट बनाना चाहता हूं। मैं साइट के साथ क्या करना चाहता हूं, बस, हमारे डेटाबेस से कनेक्ट करें, मैन्युअल परीक्षक को कुछ कीवर्ड दर्ज करने दें, और प्रदान किए गए कीवर्ड से संबंधित/संबंधित तालिकाओं के भीतर कोई भी कॉलम लौटाएं। यह हमारे परीक्षकों के लिए हमारे (बल्कि बड़े) डेटाबेस में कॉलम खोजने के लिए बहुत समय बचाएगा।

मैं इस तरह की साइट कैसे बना सकता हूं? मुझे लगता है कि यह बहुत से लोगों के लिए उपयोगी हो सकता है, इसलिए मैंने स्टैक ओवरफ्लो के विचारों को इकट्ठा करने के लिए यहां प्रश्न पोस्ट करने का निर्णय लिया है।

फिलहाल, मैं एक टेक्स्टबॉक्स के साथ एक साधारण PHP पृष्ठ सोच रहा हूं, जो उपयोगकर्ता को अल्पविराम से अलग कुछ डेटा दर्ज करने की अनुमति देता है। अल्पविरामों के आधार पर डेटा विस्फोट करें, इसे एक सरणी में रखें। मेरे डेटाबेस से कनेक्ट करें, फिर कॉलम जानकारी पुनर्प्राप्त करने के लिए Information Schema View का उपयोग करें। मेरी मुख्य समस्या यह है कि उपयोगकर्ताओं द्वारा दर्ज किए गए कीवर्ड से संबंधित कॉलम पुनर्प्राप्त करने के लिए सूचना स्कीमा व्यू का उपयोग करने का सबसे प्रभावी तरीका क्या है? मैं कैसे सुनिश्चित कर सकता हूं कि लौटाए गए कॉलम सबसे उपयुक्त हैं?

यहां कोई भी इनपुट बहुत सराहना की जाएगी। बहुत बहुत धन्यवाद।

Tl, डॉ बोल्ड हिस्सा है, व्यस्त लोगों के लिए :)

+6

आपकी अजीब प्रक्रिया हो रही है, मुझे –

+1

कहना चाहिए यदि आप "सबसे उपयुक्त" साधनों को परिभाषित करते हैं तो इससे मदद मिलेगी। अगर मैं 'foo' दर्ज करता हूं, तो क्या आप कॉलम नाम में, या कॉलम डेटा में 'foo' वाले कॉलम ढूंढना चाहते हैं? – Pondlife

+0

@ डॉदान हम वास्तव में करते हैं। यह अस्थायी है :) –

उत्तर

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

मुझे लगता है कि यह करना चाहिए। खासकर अगर, जैसा कि आप कहते हैं, यह प्रक्रिया अस्थायी है। यह शायद इसमें बहुत प्रयास करने के लिए ज्यादा समझ में नहीं आता है। यदि आपको वास्तव में "अस्पष्ट" खोजों को सक्षम करने की आवश्यकता है, तो मैं कहूंगा कि आपको अपनी डेटाबेस संरचना के साथ आबादी वाली तालिका में पूर्ण-पाठ अनुक्रमणिका का उपयोग करना चाहिए। सौर, या सादा MyIsam टेबल हो सकता है। फिर भी, मुझे विश्वास है कि इस तरह से जाने से समाधानों की तुलना में अधिक परेशानी होगी। – Muc

+2

-1, कृपया कार्यों के 'mysql_' परिवार के उपयोग की अनुशंसा न करें। वे PHP के भविष्य के संस्करणों में * बहिष्कृत और हटाए जा रहे हैं। – Charles

1

मुझे लगता है कि यह किया जा सकता है किसी भी PHP प्रोग्रामिंग के बिना निम्न चरणों और किसी भी वेब-सर्वर में आवश्यकता के बिना भी।

  1. एसक्यूएल-स्क्रिप्ट लिखें जो आपको आवश्यक डेटा पुनर्प्राप्त करने के लिए सबकुछ बनाता है। सरल html-स्वरूपण के साथ सेट परिणाम के लिए
  2. संशोधित स्क्रिप्ट स्तंभ जोड़ने आप निम्नलिखित की तरह रिकॉर्ड परिणाम बनाने के लिए:

    '<tr><td>', 'resultcolumn1', '</td><td>', 'resultcolumn2','</td></tr>' 
    
  3. भागो इस स्क्रिप्ट फाइल करने के लिए उत्पादन के विकल्प के साथ sqlcmd का उपयोग कर। परिणामस्वरूप फ़ाइल .html एक्सटेंशन दें।
  4. स्थान sqlcmd cmd फ़ाइल के अंदर कॉल करें। sqlcmd कॉल करने के बाद परिणामस्वरूप HTML फ़ाइल नाम पैरामीटर के रूप में कॉल करें। यह आपके परिणाम परीक्षक को प्रदर्शित करेगा।

तो, आपके परीक्षक केवल कुछ पैरामीटर के साथ cmd फ़ाइल चलाते हैं और परिणाम के साथ HTML पृष्ठ प्राप्त करते हैं। बेशक आपको सही एचटीएमएल हेड और बॉडी टैग बनाने की जरूरत है, लेकिन यह कोई समस्या नहीं है।

अब आपके मुख्य प्रश्न के बारे में कि आप कैसे सुनिश्चित कर सकते हैं कि कॉलम लौटे सबसे उपयुक्त हैं। मुझे लगता है कि सबसे सरल तरीकों से सबसे विश्वसनीय तरीका थिसॉरस टेबल बनाना है जिसमें आपके कॉलम नामों के समानार्थी शामिल हैं।(यह स्वयं परीक्षकों द्वारा किया जा सकता है)। तो आप INFORMATION_SCHEMA.COLUMNS के साथ-साथ थिसॉरस तालिका में LIKE का उपयोग करके सूचना स्कीमा व्यू से अपने कॉलम नामों को खोज सकते हैं।

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 पॉप्युलेट करें, और इसे संबंधित तालिका से लिंक करें। सभी रेटिंग कॉलम को 1000.0 में शुरू करें - आप अपनी रैंकिंग को पूरक करने के लिए Elo Rating System का उपयोग करेंगे क्योंकि यह सरल, कार्यान्वित करने में आसान है और यह बहुत अच्छा काम करता है।

उपयोगकर्ता कीवर्ड की सूची में प्रवेश करती है, सूचना स्कीमा देखें उपयोग नहीं करते। इसके बजाय, उन किसी भी कॉलम के लिए TEST_SEARCH_COLUMNS तालिका खोजें जिनमें से कोई भी कीवर्ड है। प्रत्येक कॉलम को हिट की संख्या के आधार पर एक वजन निर्दिष्ट करें। (उदाहरण के लिए, यदि खोज "ग्राहक, राशि, आय" है तो कॉलम CUSTOMER_ID का वजन 1 होगा। एक कॉलम CUSTOMER_INCOME का वजन 2 होगा, और CUSTOMER_INCOME_AMOUNT का वजन 3 होगा।) वजन की गणना करें प्रत्येक तालिका अपने कॉलम के वजन के योग के रूप में।

अब अपनी खोज द्वारा लौटाए गए प्रत्येक तालिका और स्तंभ के लिए, वजन बार रेटिंग खोज मान निर्धारित करने के लिए गुणा। परीक्षक को खोज मूल्य के अवरोही क्रम में मिलान करने वाली तालिकाओं की एक सूची दें। प्रत्येक तालिका में, कॉलम को उनके खोज मूल्य के अवरोही क्रम में सूचीबद्ध करें।

हर बार एक मेज या स्तंभ एक खोज में प्रकट होता है, एलो रेटिंग सिस्टम का उपयोग यह एक प्रतिद्वंद्वी 1000.0 मूल्यांकन के खिलाफ जीत देने के लिए। हर बार जब उपयोगकर्ता काम करने के लिए कॉलम का चयन करता है, तो उस कॉलम और उसकी मेज दोनों को 1500.0 रेटेड प्रतिद्वंद्वी के खिलाफ जीत दें। इस तरह, सबसे उपयोगी और सफल टेबल और कॉलम समय के साथ आपकी खोज सूचियों के शीर्ष पर व्यवस्थित रूप से फ़्लोट करेंगे।

इस दृष्टिकोण (सूचना स्कीमा दृश्य के बजाय तालिकाओं का उपयोग) के बग़ल का लाभ यह है कि इस दृष्टिकोण अधिक विस्तृत है। एक वृद्धि के रूप में, आप TEST_SEARCH_TABLES और TEST_SEARCH_COLUMNS तालिकाओं पर विवरण और COMMENTS कॉलम डाल सकते हैं, और कीवर्ड मिलानों के लिए भी उन स्तंभों को खोज सकते हैं।

यहां एक और वैकल्पिक वृद्धि है - आप प्रत्येक तालिका और कॉलम के बगल में एक (+) और (-) बटन डाल सकते हैं और यदि उपयोगकर्ता क्लिक (+) और इसके खिलाफ हानि के खिलाफ 2000-रेटेड प्रतिद्वंद्वी के खिलाफ जीत दे सकता है यदि उपयोगकर्ता क्लिक करता है तो एक शून्य-रेटेड प्रतिद्वंद्वी (-)। इससे आपके परीक्षकों को कॉलम के लिए मतदान करने की अनुमति मिल जाएगी जो उन्हें महत्वपूर्ण लगती हैं और हमेशा कॉलम के खिलाफ वोट देती हैं जो हमेशा रास्ते में आ रही हैं।

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 उपयोगकर्ता -pPASSWORD Database_Name < filename.sql