2012-11-30 6 views
6

मुझे बताया गया था कि एक लूप के भीतर एक क्वेरी (चयन) का उपयोग करने के लिए यह एक बुरा अभ्यास है क्योंकि यह सर्वर के प्रदर्शन को धीमा कर देता है।PHP लूप के भीतर एक क्वेरी का उपयोग करने के लिए वैकल्पिक

मैं ऐसे

Array ([1] => Los Angeles) 
Array ([2] =>New York) 
Array ([3] => Chicago) 

के रूप में ये सिर्फ 3 अनुक्रमित रहे हैं एक सरणी है। जिस सरणी का मैं उपयोग कर रहा हूं उसका निरंतर आकार नहीं है, इसलिए कभी-कभी इसमें 20 इंडेक्स हो सकते हैं।

अभी, क्या मैं कर रहा हूँ (इस कोड के सभी नहीं है, लेकिन मूल विचार) है

  1. पाश
  2. लिए
  3. क्वेरी सर्वर और सभी लोगों के नाम हैं, जो में रहते हैं चुनें " लॉस एंजिल्स "
  4. प्रिंट बाहर

आउटपुट के नाम इस तरह दिखेगा:

Los Angeles 
     Michael Stern 
     David Bloomer 
     William Rod 

New York 
     Kary Mills 

Chicago 
     Henry Davidson 
     Ellie Spears 

मुझे पता है कि यह वास्तव में अक्षम विधि है क्योंकि यह बहुत सी प्रश्न हो सकती है क्योंकि तालिका बाद में बड़ी हो जाती है।

तो मेरा सवाल यह है कि क्या एक सरणी के अंदर सामान के आधार पर जानकारी चुनने का एक बेहतर, अधिक कुशल तरीका है जो कि आकार हो सकता है?

+0

आप एक तैयार http: //fr2.php का उपयोग कर सकते हैं।नेट/मैनुअल/एन/pdo.prepare.php – Ajouve

+0

लोग, 8 स्वीकृत उत्तर पूरी तरह ठीक नहीं हैं। ओपी पहले से ही जानता है (जैसा कि उसने 5 बार किया था) एक जवाब कैसे स्वीकार करें। यह बहुत संभव है कि उन्हें अपने अन्य सवालों पर पर्याप्त उत्तर नहीं मिला। कृपया उसे एक ब्रेक दें। –

+0

मदर का बचाव करने के लिए धन्यवाद, आप बहुत अच्छे हैं: ...) – r1nzler

उत्तर

4

आगे MrCodes जवाब देने के लिए, यदि आप शुरू एक सरणी के साथ जोड़ने के लिए समस्या का समाधान करें, शायद आपके पास शहर के अलग-अलग टेबल में नाम होना चाहिए और उस व्यक्ति के लिए तालिका में वास्तविक शहर के नाम के बजाय शहर की आईडी शामिल है (सत्यापन को आसान, तेज़ बनाता है और वैधता के रिकॉर्ड को याद करने की संभावना कम होती है क्योंकि किसी के पास उनके घर के शहर को गलत टाइप किया गया)

+0

दोस्त .. आप बम हैं ... lol – r1nzler

0

यह तैयार बयान का उद्देश्य है। आप किसी प्लेसहोल्डर को किसी मान पर बाध्य करते हैं, और उसी क्वेरी के साथ इसे एक चर की तरह उपयोग करते हैं। चूंकि क्वेरी नहीं बदली है, इसलिए आप mysql सर्वर के साथ संचार को कम करते हैं, जिसके परिणामस्वरूप दक्षता में वृद्धि होती है।

उदाहरण पीडीओ का उपयोग कर:

$cities = array(
    "Los Angeles", 
    "New York", 
    "Chicago" 
); 

try { 
    //Change database parameters here (user, pass, database name) 
    $db = new PDO("mysql:host=localhost;dbname=users", "user", "pass"); 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

    $stmt = $db->prepare("SELECT * FROM `users` WHERE `city` = :city"); 

    foreach ($cities as $city) { 
     $stmt->bindValue(":city", $city); 
     $stmt->execute(); 

     $result = $stmt->fetchAll(PDO::FETCH_ASSOC); 
     //Output data here. You can format it however you'd like 
     var_dump($city, $result); 
    } 

} 
catch (PDOException $e) { 
    //Error handling here 
} 
+0

तो क्या आप कह रहे हैं कि मैंने अपनी पोस्ट में बनाई गई विधि ठीक है? – r1nzler

4

एक IN क्वेरी का उपयोग करें, जो किसी एक क्वेरी में परिणाम के सभी हड़पने जाएगा:

SELECT * FROM people WHERE town IN('LA', 'London', 'Paris') 
+0

और फिर वांछित फैशन में परिणामों को कैसे आउटपुट करता है? ओपी से पूछे गए प्रश्न को हल करने में यह जवाब पूरी तरह विफल रहता है। – eggyal

+1

@eggyal असली सवाल यह है कि बार-बार पूछे जाने वाले प्रश्नों की दक्षता में सुधार कैसे किया जाए, जिसका मैंने उत्तर दिया। ओपी ने वास्तव में कभी नहीं पूछा कि इस तरह से इसे कैसे आउटपुट किया जाए। यदि ओपी के आउटपुट के साथ विशिष्ट समस्याएं हैं तो मैं खुशी से मदद करता हूं। – MrCode

1

@MrCode mentions रूप में, आप लाने के लिए MySQL के IN() ऑपरेटर का उपयोग कर सकते हैं सभी वांछित शहरों के लिए रिकॉर्ड एक बार में जाते हैं, लेकिन यदि आप sort अपने परिणाम मुख्य रूप से शहर से करते हैं तो आप परिणामस्वरूप लूप को आखिरी शहर के ट्रैक को ट्रैक कर सकते हैं और नए शहर को आउटपुट करते समय पहली बार एनक्यू कर सकते हैं ntered।

सुनिश्चित करना है कि resultset अपने मूल सरणी के रूप में एक ही क्रम में है (यदि आप उस के बारे में परवाह नहीं है MySQL के FIELD() समारोह के साथ, PDO का उपयोग करते हुए एक साथ, आप बस ORDER BY city है, जो एक बहुत अधिक कुशल हो जाएगा कर सकता है, एक डेटाबेस घ के रूप में

$Cities = array(1=>'Los Angeles', 2=>'New York', 3=>'Chicago'); 
$query = "SELECT town, personname FROM people WHERE town IN('".implode("','", $Cities)."') ORDER BY town"; 
if ($sql = $mysqliconnection->prepare($query)) 
{ 
    $sql->execute(); 
    $result = $sql->get_result(); 
    $PrevCity = ''; 
    while ($row = $result->fetch_assoc()) 
    { 
     if ($row['town'] != $PrevCity) 
     { 
      echo $row['town']."<br />"; 
      $PrevCity = $row['town']; 
     } 
     echo $row['personname']."<br />"; 
    } 
} 

-: विशेष रूप से city स्तंभ पर एक उपयुक्त सूचकांक) के साथ:

$arr = ['Los Angeles', 'New York', 'Chicago']; 
$placeholders = rtrim(str_repeat('?, ', count($arr)), ', '); 

$dbh = new PDO("mysql:dbname=$dbname", $username, $password); 
$qry = $dbh->prepare(" 
    SELECT city, name 
    FROM  my_table 
    WHERE city IN ($placeholders) 
    ORDER BY FIELD(city, $placeholders) 
"); 

if ($qry->execute(array_merge($arr, $arr))) { 

    // output headers 
    echo '<ul>'; 

    $row = $qry->fetch(); 
    while ($row) { 
    $current_city = $row['city']; 

    // output $current_city initialisation 
    echo '<li>'.htmlentities($current_city).'</li><ul>'; 
    do { 
     // output name $row 
     echo '<li>'.htmlentities($row['name']).'</li>'; 
    } while ($row = $qry->fetch() and $row['city'] == $current_city); 
    // output $current_city termination 
    echo '</ul>'; 
    } 

    // output footers 
    echo '</ul>'; 
} 
+0

धन्यवाद दोस्त, यह वास्तव में बहुत मदद की! : डी – r1nzler

संबंधित मुद्दे