2009-04-09 8 views
10

मेरे पास अक्सर बड़े एरे होते हैं, या PHP में गतिशील डेटा की बड़ी मात्रा होती है जिसे मुझे प्रबंधित करने के लिए MySQL क्वेरी चलाने की आवश्यकता होती है।क्या PHP लूप में MySQL क्वेरी डालना बुरा है?

INSERT-UP या UPDATE-ed होने के लिए जानकारी के माध्यम से लूपिंग किए बिना INSERT या UPDATE जैसी कई प्रक्रियाओं को चलाने का कोई बेहतर तरीका है?

उदाहरण (मैं संक्षिप्तता खातिर तैयार बयान का उपयोग नहीं किया):

 
$myArray = array('apple','orange','grape'); 

foreach($myArray as $arrayFruit) { 
$query = "INSERT INTO `Fruits` (`FruitName`) VALUES ('" . $arrayFruit . "')"; 
mysql_query($query, $connection); 
} 
+0

अच्छा सवाल;) – markus

+0

haha ​​... खेद है कि मैं वास्तव में उत्सुक था, और मैं चाहता हूँ नहीं था एक झटका hounding की तरह लग रहे आप – johnnietheblack

उत्तर

20

विकल्प 1 आप वास्तव में एक साथ कई क्वेरी चला सकें।

$queries = ''; 

foreach(){ 
    $queries .= "INSERT....;"; //notice the semi colon 
} 

mysql_query($queries, $connection); 

यह आपके प्रसंस्करण पर बचाएगा।

विकल्प 2

यदि आपका डालने कि एक ही तालिका के लिए आसान है, आप अनेक निवेशन एक क्वेरी

$fruits = "('".implode("'), ('", $fruitsArray)."')"; 
mysql_query("INSERT INTO Fruits (Fruit) VALUES $fruits", $connection); 

में क्वेरी कुछ इस तरह लग रही समाप्त होता है क्या कर सकते हैं:

$query = "INSERT INTO Fruits (Fruit) 
    VALUES 
    ('Apple'), 
    ('Pear'), 
    ('Banana')"; 

यह संभवतः आप जिस तरह से जाना चाहते हैं।

+0

सही है ... तो एक बड़े पेलोड (संभावित 100 डालने बयान बंडल) पर अलग। समझ में आता है ... धन्यवाद :) – johnnietheblack

+1

विकल्प # 2 वास्तव में जाने का बेहतर तरीका है यदि आप इसे स्विंग कर सकते हैं। – jerebear

+0

हाहा कि कुछ समझदार implosion है ... चालाक। धन्यवाद – johnnietheblack

5

यदि आपके पास MySQL क्लास है, तो आप तैयार कथन का उपयोग करके मूल्यों को फिर से भर सकते हैं। jerebear की विविधता विधि पर अपने मूल समाधान (जो मैंने पहले का इस्तेमाल किया है, और प्रेम) के बारे में नोट करने के लिए

$sth = $dbh->prepare("INSERT INTO Fruits (Fruit) VALUES (?)"); 
foreach($fruits as $fruit) 
{ 
    $sth->reset(); // make sure we are fresh from the previous iteration 
    $sth->bind_param('s', $fruit); // bind one or more variables to the query 
    $sth->execute(); // execute the query 
} 
3

एक बात यह पढ़ने में आसान है। प्रत्यारोपण समझने के लिए अधिक प्रोग्रामर मस्तिष्क चक्र लेता है, जो प्रोसेसर चक्र से अधिक महंगा हो सकता है। समय से पहले अनुकूलन, बकवास, बकवास, blah ... :)

+0

अच्छा बिंदु का उल्लेख किया ... के रूप में यह बेशक – johnnietheblack

+0

है मेरी दिमाग तले कर रहे हैं, आप सभी विविधता और अन्य भद्दा बिट्स के पीछे छिपा कर सकते हैं एक समारोह या कक्षा को पढ़ने में आसान बनाने के लिए और अभी भी लाभ प्राप्त करने के लिए। – Zoredache

+1

मैं अभी भी लोगों का तर्क होता समारोह एक उम्मीद के मुताबिक और समझने योग्य बात यह है कि क्या करने की जरूरत है कि, मूल php लूप को पढ़ने के लिए और मुझे यकीन है चाहता हूँ वहाँ बहुत प्रदर्शन के संदर्भ में प्राप्त किया जा करने के लिए नहीं है कि बहुत सरल है। मैं एक शैतान का एक सा इस पर वकालत, जैसा कि मैंने 'चतुर' समाधान प्यार होने के स्वीकार करना होगा। –

0

मैं jerebear के जवाब से प्रेरित था मेरे वर्तमान परियोजनाओं में से एक के लिए अपने दूसरे विकल्प की तरह कुछ बनाने के लिए। रिकॉर्ड की कतरनी मात्रा के कारण मैं एक ही समय में सभी डेटा को सहेज नहीं सकता था और कर सकता था। तो मैंने आयात करने के लिए this बनाया। आप अपना डेटा जोड़ते हैं, और फिर प्रत्येक रिकॉर्ड किए जाने पर एक विधि को कॉल करें। एक निश्चित, विन्यास, अभिलेखों की संख्या के बाद स्मृति में डेटा jerebear का दूसरा विकल्प की तरह एक बड़े पैमाने पर डालने के साथ सहेज लिया जाएगा।

यह डेटा की वास्तव में बड़ी मात्रा के लिए बल्कि खतरनाक है क्योंकि ज्यादातर डीबीएमएस के आकार पर एक ऊपरी सीमा है हो सकता है,: एक सम्मिलित में एक से अधिक मूल्य ब्लॉक के साथ jerebear के जवाब के बारे में नोट करने के लिए

// CREATE TABLE example (Id INT, Field1 INT, Field2 INT, Field3 INT); 
$import=new DataImport($dbh, 'example', 'Id, Field1, Field2, Field3'); 
foreach ($whatever as $row) { 
    // add data in the order of your column definition 
    $import->addValue($Id); 
    $import->addValue($Field1); 
    $import->addValue($Field2); 
    $import->addValue($Field3); 
    $import->nextRow(); 
} 
$import->lastRow(); 
2

एक बात वे आदेश जो वे संभाल सकते हैं। यदि आप इसे बहुत से VALUE-ब्लॉक से अधिक करते हैं, तो आपका सम्मिलन विफल हो जाएगा। उदाहरण के लिए MySQL पर सीमा आमतौर पर 1 एमबी AFAIK है।

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

+0

इस मामले में, यह संभावना array_chunk और पाश का एक संयोजन लागू करने के लिए सीमा से टकराने से बचने के लिए बुद्धिमान होगा। – jerebear

0
foreach ($userList as $user) { 
$query = 'INSERT INTO users (first_name,last_name) VALUES("'.$user['first_name'].'",  "' . $user['last_name'] . '")'; 
mysql_query($query); 

}

Insted एक पाश का उपयोग कर के निम्नलिखित .Instead कोशिश ऊपर का उपयोग करके आप एक एकल डाटाबेस क्वेरी में डेटा जोड़ सकते हैं।

$userData = array(); 
foreach ($userList as $user) { 
$userData[] = '("' . $user['first_name'] . '", "' . $user['last_name'] . '")'; 
} 
$query = 'INSERT INTO users (first_name,last_name) VALUES' . implode(',', $userData); 
mysql_query($query); 

Produces: 

INSERT INTO users (first_name,last_name) VALUES("John", "Doe"),("Jane", "Doe")... 
संबंधित मुद्दे