दिलचस्प पोस्ट
एक log4j कंसोल एपेन्डर बनाने के लिए विभिन्न धागे के लिए अलग-अलग रंग का उपयोग करें एंड्रॉइड में जेपीईजी से एक एनिमेटेड जीआईआईएफ़ कैसे बनाऊँ (विकास) आईआईएस 7.5+ पुट और रेस्टफ़ुल सेवा के लिए हटाएं, विस्तारहीन फ़ील्ड नाम के आसपास बैकट्क्स का उपयोग करना MySQL एक मेज को छोड़कर डेटाबेस को सभी विशेषाधिकारों को प्रदान करता है पायथन में टुकड़े-टुकड़े रैखिक फिट कैसे लागू करें? एक्सप्रेस में सभी पंजीकृत मार्ग कैसे प्राप्त करें? जावा कैलेंडर में तिथियों को अक्षम या उजागर कैसे करें JSG.NET को NuGet का उपयोग कैसे करें? समवर्ती हैशप बनाम सिंक्रनाइज़ हैशमैप MVVM के साथ कई चयन प्रबंधित करना कैसे हटाएं और हटाएंक्यूटी में सिग्नल और स्लॉट के संबंध में काम करता है? आईओएस 9 बीटा 5 अपडेट के साथ UITableView खाली है मैं UIScrollView में प्रोग्रामिंग कैसे रोक सकता हूं? एक जांच की बाधा किसी अन्य तालिका से संबंधित हो सकती है?

पीडीओ तैयार एक क्वेरी में एकाधिक पंक्तियों को सम्मिलित करता है

मैं वर्तमान में एक ही क्वेरी में मानों की एकाधिक पंक्तियों को सम्मिलित करने के लिए MySQL पर SQL के इस प्रकार का उपयोग कर रहा हूं:

INSERT INTO `tbl` (`key1`,`key2`) VALUES ('r1v1','r1v2'),('r2v1','r2v2'),... 

पीडीओ पर रीडिंग पर, उपयोग तैयार बयान मुझे स्थिर प्रश्नों की तुलना में बेहतर सुरक्षा देना चाहिए।

इसलिए मैं जानना चाहूंगा कि क्या तैयार कथनों का उपयोग करके "एक क्वेरी के इस्तेमाल से मूल्यों की कई पंक्तियों को सम्मिलित करना" संभव है।

यदि हां, तो मैं यह कैसे जान सकता हूँ कि मैं इसे कैसे लागू कर सकता हूं?

Solutions Collecting From Web of "पीडीओ तैयार एक क्वेरी में एकाधिक पंक्तियों को सम्मिलित करता है"

पीडीओ तैयार वक्तव्य के साथ एकाधिक मान डालें

एक निष्पादित बयान में एकाधिक मूल्यों को सम्मिलित करना। क्यों इस पृष्ठ के अनुसार यह नियमित रूप से आवेषण से भी तेज है

 $datafields = array('fielda', 'fieldb', ... ); $data[] = array('fielda' => 'value', 'fieldb' => 'value' ....); $data[] = array('fielda' => 'value', 'fieldb' => 'value' ....); 

अधिक डेटा मूल्य या आपके पास शायद एक लूप है जो डेटा को पॉप्युलेट करता है।

तैयार किए गए सम्मिलन से आपको उन क्षेत्रों को जानना होगा जिन्हें आप डालने जा रहे हैं, और बनाने के लिए फ़ील्ड की संख्या? अपने मापदंडों को बाध्य करने के लिए प्लेसहोल्डर्स

 insert into table (fielda, fieldb, ... ) values (?,?...), (?,?...).... 

यह मूल रूप से है कि हम कैसा बयान को दिखाना चाहते हैं।

अब, कोड:

 function placeholders($text, $count=0, $separator=","){ $result = array(); if($count > 0){ for($x=0; $x<$count; $x++){ $result[] = $text; } } return implode($separator, $result); } $pdo->beginTransaction(); // also helps speed up your inserts. $insert_values = array(); foreach($data as $d){ $question_marks[] = '(' . placeholders('?', sizeof($d)) . ')'; $insert_values = array_merge($insert_values, array_values($d)); } $sql = "INSERT INTO table (" . implode(",", $datafields ) . ") VALUES " . implode(',', $question_marks); $stmt = $pdo->prepare ($sql); try { $stmt->execute($insert_values); } catch (PDOException $e){ echo $e->getMessage(); } $pdo->commit(); 

हालांकि मेरे परीक्षण में, एकाधिक सम्मिलन का उपयोग करते हुए और एकल मान के साथ नियमित रूप से तैयार किए गए सम्मिलन का उपयोग करते समय केवल 1 सेकंड का अंतर था।

श्री बालागटस के समान उत्तर, थोड़ा स्पष्ट …

हाल के संस्करण MySQL और PHP PDO बहु-पंक्ति INSERT स्टेटमेंट्स का समर्थन करते हैं I

एसक्यूएल अवलोकन

एसक्यूएल ऐसा कुछ दिखेगा, जिसमें 3-कॉलम टेबल है जिसे आप INSERT करना चाहते हैं।

 INSERT INTO tbl_name (colA, colB, colC) VALUES (?, ?, ?), (?, ?, ?), (?, ?, ?) [,...] 

ON DUPLICATE KEY UPDATE एक बहु-पंक्ति INSERT के साथ-साथ अपेक्षित काम करता है; इसे जोड़ें:

 ON DUPLICATE KEY UPDATE colA = VALUES(colA), colB = VALUES(colB), colC = VALUES(colC) 

PHP अवलोकन

आपका PHP कोड सामान्य $pdo->prepare($qry) और $stmt->execute($params) PDO कॉल का पालन करेंगे

INSERT को पास करने के लिए $params सभी मानों की एक 1-आयामी सरणी होगी

उपरोक्त उदाहरण में, इसमें 9 तत्व होना चाहिए; पीडीओ मूल्यों की एक पंक्ति के रूप में 3 के प्रत्येक सेट का उपयोग करेगा (3 कॉलम की प्रत्येक तीन पंक्तियों = 9 तत्व एरे को सम्मिलित करना।)

कार्यान्वयन

नीचे कोड स्पष्टता के लिए लिखा है, दक्षता नहीं। यदि आप चाहें तो अपने डेटा के माध्यम से मैप करने या चलने के बेहतर तरीके के लिए PHP array_*() फ़ंक्शंस के साथ कार्य करें चाहे आप लेनदेन का उपयोग कर सकते हैं, यह स्पष्ट रूप से आपके MySQL तालिका प्रकार पर निर्भर करता है।

मान लिया जाये कि:

  • $tblName – INSERT को तालिका का स्ट्रिंग नाम दें
  • $colNames – तालिका के स्तंभ नामों के 1-आयामी सरणी ये स्तंभ नाम मान्य MySQL कॉलम पहचानकर्ता होने चाहिए; बैकटीक्स (“) से बचें, अगर वे नहीं हैं
  • $dataVals$dataVals -आयामी सरणी, जहां प्रत्येक तत्व INSERT के मानों की एक पंक्ति का 1-डी सरणी है

नमूना कोड

 // setup data values for PDO // memory warning: this is creating a copy all of $dataVals $dataToInsert = array(); foreach ($dataVals as $row => $data) { foreach($data as $val) { $dataToInsert[] = $val; } } // (optional) setup the ON DUPLICATE column names $updateCols = array(); foreach ($colNames as $curCol) { $updateCols[] = $curCol . " = VALUES($curCol)"; } $onDup = implode(', ', $updateCols); // setup the placeholders - a fancy way to make the long "(?, ?, ?)..." string $rowPlaces = '(' . implode(', ', array_fill(0, count($colNames), '?')) . ')'; $allPlaces = implode(', ', array_fill(0, count($dataVals), $rowPlaces)); $sql = "INSERT INTO $tblName (" . implode(', ', $colNames) . ") VALUES " . $allPlaces . " ON DUPLICATE KEY UPDATE $onDup"; // and then the PHP PDO boilerplate $stmt = $pdo->prepare ($sql); try { $stmt->execute($dataToInsert); } catch (PDOException $e){ echo $e->getMessage(); } $pdo->commit(); 

यह क्या है इसके लिए, मैंने बहुत से उपयोगकर्ता देखा है कि इन्हें एक ही स्ट्रिंग क्वेरी के रूप में तैयार करने के बजाय INSERT स्टेटमेंट्स के माध्यम से चलने की सलाह दी गई है क्योंकि चयनित उत्तर था। मैंने सिर्फ दो फ़ील्ड के साथ एक साधारण परीक्षण चलाने का फैसला किया और एक बहुत ही बुनियादी सम्मिलन वक्तव्य:

 <?php require('conn.php'); $fname = 'J'; $lname = 'M'; $time_start = microtime(true); $stmt = $db->prepare('INSERT INTO table (FirstName, LastName) VALUES (:fname, :lname)'); for($i = 1; $i <= 10; $i++ ) { $stmt->bindParam(':fname', $fname); $stmt->bindParam(':lname', $lname); $stmt->execute(); $fname .= 'O'; $lname .= 'A'; } $time_end = microtime(true); $time = $time_end - $time_start; echo "Completed in ". $time ." seconds <hr>"; $fname2 = 'J'; $lname2 = 'M'; $time_start2 = microtime(true); $qry = 'INSERT INTO table (FirstName, LastName) VALUES '; $qry .= "(?,?), "; $qry .= "(?,?), "; $qry .= "(?,?), "; $qry .= "(?,?), "; $qry .= "(?,?), "; $qry .= "(?,?), "; $qry .= "(?,?), "; $qry .= "(?,?), "; $qry .= "(?,?), "; $qry .= "(?,?)"; $stmt2 = $db->prepare($qry); $values = array(); for($j = 1; $j<=10; $j++) { $values2 = array($fname2, $lname2); $values = array_merge($values,$values2); $fname2 .= 'O'; $lname2 .= 'A'; } $stmt2->execute($values); $time_end2 = microtime(true); $time2 = $time_end2 - $time_start2; echo "Completed in ". $time2 ." seconds <hr>"; ?> 

हालांकि समग्र क्वेरी ने मिलीसेकेंड या उससे कम की, हालांकि, बाद (एकल स्ट्रिंग) क्वेरी लगातार 8 गुना तेज या अधिक थी अगर यह कहने के लिए बनाया गया था कि कई और स्तंभों पर हजारों पंक्तियों के आयात को प्रतिबिंबित किया गया है, तो अंतर बहुत बड़ा हो सकता है

हरबर्ट बालगाटस द्वारा स्वीकार किए जाते हैं जवाब अच्छी तरह से काम करता है जब $ डेटा एआररी छोटा होता है बड़ा $ डेटा arrays के साथ array_merge फ़ंक्शन निषेध धीमा हो जाता है। $ डेटा एआरएम बनाने के लिए मेरी परीक्षण फ़ाइल में 28 कॉलम हैं और लगभग 80,000 लाइनें हैं अंतिम स्क्रिप्ट को पूरा करने के लिए 41 का ले लिया गया।

Array_push () का उपयोग करके array_merge () के बजाय $ insert_values ​​बनाने का परिणामस्वरूप 0.41s के निष्पादन समय के साथ 100X गति में वृद्धि हुई

समस्याग्रस्त array_merge ():

 $insert_values = array(); foreach($data as $d){ $question_marks[] = '(' . placeholders('?', sizeof($d)) . ')'; $insert_values = array_merge($insert_values, array_values($d)); } 

Array_merge () की आवश्यकता को समाप्त करने के लिए, आप इसके बजाय निम्नलिखित दो सरणियों का निर्माण कर सकते हैं:

 //Note that these fields are empty, but the field count should match the fields in $datafields. $data[] = array('','','','',... n ); //getting rid of array_merge() array_push($insert_values, $value1, $value2, $value3 ... n ); 

इन सरणियों का उपयोग निम्न प्रकार से किया जा सकता है:

 function placeholders($text, $count=0, $separator=","){ $result = array(); if($count > 0){ for($x=0; $x<$count; $x++){ $result[] = $text; } } return implode($separator, $result); } $pdo->beginTransaction(); foreach($data as $d){ $question_marks[] = '(' . placeholders('?', sizeof($d)) . ')'; } $sql = "INSERT INTO table (" . implode(",", array_keys($datafield) ) . ") VALUES " . implode(',', $question_marks); $stmt = $pdo->prepare ($sql); try { $stmt->execute($insert_values); } catch (PDOException $e){ echo $e->getMessage(); } $pdo->commit(); 

यह केवल आपके द्वारा तैयार बयान का तरीका नहीं है।

प्रति क्वेरी एक पंक्ति सम्मिलित करने के लिए पूरी तरह से ठीक है क्योंकि आप विभिन्न मानदंडों के साथ एक तैयार कथन कई बार निष्पादित कर सकते हैं। वास्तव में यह सबसे बड़ा लाभ है क्योंकि यह आपको एक कुशल, सुरक्षित और आरामदायक तरीके से बहुत सी पंक्तियों को सम्मिलित करने की अनुमति देता है।

तो संभवत: आपके द्वारा प्रस्तावित योजना को लागू करने के लिए संभवतः कम से कम निश्चित पंक्तियों के लिए, लेकिन यह लगभग गारंटी है कि यह वाकई वास्तव में आपके लिए क्या नहीं है।

दो संभव दृष्टिकोण:

 $stmt = $pdo->prepare('INSERT INTO foo VALUES(:v1_1, :v1_2, :v1_3), (:v2_1, :v2_2, :v2_3), (:v2_1, :v2_2, :v2_3)'); $stmt->bindValue(':v1_1', $data[0][0]); $stmt->bindValue(':v1_2', $data[0][1]); $stmt->bindValue(':v1_3', $data[0][2]); // etc... $stmt->execute(); 

या:

 $stmt = $pdo->prepare('INSERT INTO foo VALUES(:a, :b, :c)'); foreach($data as $item) { $stmt->bindValue(':a', $item[0]); $stmt->bindValue(':b', $item[1]); $stmt->bindValue(':c', $item[2]); $stmt->execute(); } 

यदि सभी पंक्तियों का डेटा एक ही सरणी में है, तो मैं दूसरे समाधान का उपयोग करूँगा।

 $stmt = $db->prepare('INSERT INTO ids VALUES (0, :url)'); try { $db->beginTransaction(); foreach ($ursl as $url) { $stmt->bindValue(':url', $url); $stmt->execute(); } $db->commit(); } catch (PDOException $e) { $db->rollBack(); } 

एक छोटा जवाब: कॉलम द्वारा क्रमबद्ध डेटा की सरणी समतल करें

 //$array = array( '1','2','3','4','5', '1','2','3','4','5'); $arCount = count($array); $rCount = ($arCount ? $arCount - 1 : 0); $criteria = sprintf("(?,?,?,?,?)%s", str_repeat(",(?,?,?,?,?)", $rCount)); $sql = "INSERT INTO table(c1,c2,c3,c4,c5) VALUES$criteria"; 

1,000 या इतने रिकॉर्ड डालने के दौरान आप प्रत्येक रिकॉर्ड के माध्यम से पाश को नहीं डालना चाहते हैं, जब आपको सभी की आवश्यकता होती है, मानों की संख्या।

यहां एक क्लास है जिसे मैंने पुर्ज विकल्प के साथ कई प्रविष्टियां लिखी हैं:

 <?php /** * $pdo->beginTransaction(); * $pmi = new PDOMultiLineInserter($pdo, "foo", array("a","b","c","e"), 10); * $pmi->insertRow($data); * .... * $pmi->insertRow($data); * $pmi->purgeRemainingInserts(); * $pdo->commit(); * */ class PDOMultiLineInserter { private $_purgeAtCount; private $_bigInsertQuery, $_singleInsertQuery; private $_currentlyInsertingRows = array(); private $_currentlyInsertingCount = 0; private $_numberOfFields; private $_error; private $_insertCount = 0; function __construct(\PDO $pdo, $tableName, $fieldsAsArray, $bigInsertCount = 100) { $this->_numberOfFields = count($fieldsAsArray); $insertIntoPortion = "INSERT INTO `$tableName` (`".implode("`,`", $fieldsAsArray)."`) VALUES"; $questionMarks = " (?".str_repeat(",?", $this->_numberOfFields - 1).")"; $this->_purgeAtCount = $bigInsertCount; $this->_bigInsertQuery = $pdo->prepare($insertIntoPortion.$questionMarks.str_repeat(", ".$questionMarks, $bigInsertCount - 1)); $this->_singleInsertQuery = $pdo->prepare($insertIntoPortion.$questionMarks); } function insertRow($rowData) { // @todo Compare speed // $this->_currentlyInsertingRows = array_merge($this->_currentlyInsertingRows, $rowData); foreach($rowData as $v) array_push($this->_currentlyInsertingRows, $v); // if (++$this->_currentlyInsertingCount == $this->_purgeAtCount) { if ($this->_bigInsertQuery->execute($this->_currentlyInsertingRows) === FALSE) { $this->_error = "Failed to perform a multi-insert (after {$this->_insertCount} inserts), the following errors occurred:".implode('<br/>', $this->_bigInsertQuery->errorInfo()); return false; } $this->_insertCount++; $this->_currentlyInsertingCount = 0; $this->_currentlyInsertingRows = array(); } return true; } function purgeRemainingInserts() { while ($this->_currentlyInsertingCount > 0) { $singleInsertData = array(); // @todo Compare speed - http://www.evardsson.com/blog/2010/02/05/comparing-php-array_shift-to-array_pop/ // for ($i = 0; $i < $this->_numberOfFields; $i++) $singleInsertData[] = array_pop($this->_currentlyInsertingRows); array_reverse($singleInsertData); for ($i = 0; $i < $this->_numberOfFields; $i++) array_unshift($singleInsertData, array_pop($this->_currentlyInsertingRows)); if ($this->_singleInsertQuery->execute($singleInsertData) === FALSE) { $this->_error = "Failed to perform a small-insert (whilst purging the remaining rows; the following errors occurred:".implode('<br/>', $this->_singleInsertQuery->errorInfo()); return false; } $this->_currentlyInsertingCount--; } } public function getError() { return $this->_error; } } 

मैंने इस तरह से इसे किया:

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

 $cols = 'name', 'middleName', 'eMail'; $table = 'people'; 

अब, मान लें कि आपके पास पहले से तैयार एक दो आयामी सरणी है। इसे बदलना, और अपनी पंक्ति मानों के साथ एक स्ट्रिंग बनाना, जैसे:

 foreach ( $people as $person ) { if(! $rowVals ) { $rows = '(' . "'$name'" . ',' . "'$middleName'" . ',' . "'$eMail'" . ')'; } else { $rowVals = '(' . "'$name'" . ',' . "'$middleName'" . ',' . "'$eMail'" . ')'; } 

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

यह सब करने के लिए छोड़ दिया गया है बयान तैयार करें और निष्पादित करें, जैसे:

 $stmt = $db->prepare ( "INSERT INTO $table $cols VALUES $rowVals" ); $stmt->execute (); 

अब तक 2000 से अधिक पंक्तियों के साथ परीक्षण किया गया है, और निष्पादन समय निराशाजनक है। कुछ और परीक्षण चलाएंगे और यहां वापस आने पर मेरे पास योगदान करने के लिए कुछ और है।

सादर।

यहां मेरा सरल दृष्टिकोण है

  $values = array(); foreach($workouts_id as $value){ $_value = "(".$value.",".$plan_id.")"; array_push($values,$_value); } $values_ = implode(",",$values); $sql = "INSERT INTO plan_days(id,name) VALUES" . $values_.""; $stmt = $this->conn->prepare($sql); $stmt->execute(); 

आप इस फ़ंक्शन के साथ एक एकल क्वेरी में कई पंक्तियां सम्मिलित कर सकते हैं:

 function insertMultiple($query,$rows) { if (count($rows)>0) { $args = array_fill(0, count($rows[0]), '?'); $params = array(); foreach($rows as $row) { $values[] = "(".implode(',', $args).")"; foreach($row as $value) { $params[] = $value; } } $query = $query." VALUES ".implode(',', $values); $stmt = $PDO->prepare($query); $stmt->execute($params); } } 

$ पंक्ति मूल्यों के सरणियों का एक सरणी है आपके मामले में आप फ़ंक्शन को कॉल करेंगे

 insertMultiple("INSERT INTO tbl (`key1`,`key2`)",array(array('r1v1','r1v2'),array('r2v1','r2v2'))); 

इसका एक लाभ है जिसका उपयोग आप तैयार कथनों का उपयोग करते हैं, जबकि एक एकल क्वेरी के साथ कई पंक्तियाँ डालते हैं। सुरक्षा!

यह मेरे लिए काम किया

  $sql = 'INSERT INTO table(pk_pk1,pk_pk2,date,pk_3) VALUES '; $qPart = array_fill(0, count($array), "(?, ?,UTC_TIMESTAMP(),?)"); $sql .= implode(",", $qPart); $stmt = DB::prepare('base', $sql); $i = 1; foreach ($array as $value) { $stmt->bindValue($i++, $value); $stmt->bindValue($i++, $pk_pk1); $stmt->bindValue($i++, $pk_pk2); $stmt->bindValue($i++, $pk_pk3); } $stmt->execute(); 

यहाँ मेरा समाधान है: https://github.com/sasha-ch/aura.SQL , आरुप / आरा। SQL पुस्तकालय पर आधारित है।

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

 $q = "insert into t2(id,name) values (?,?), ... on duplicate key update name=name"; $bind_values = [ [[1,'str1'],[2,'str2']] ]; $pdo->perform($q, $bind_values); 

Bugreports स्वागत है

सभी जर्मन पोस्टकोड को खाली तालिका में डालने के लिए मेरा वास्तविक दुनिया उदाहरण (बाद में शहर के नामों को जोड़ने के लिए):

 // obtain column template $stmt = $db->prepare('SHOW COLUMNS FROM towns'); $stmt->execute(); $columns = array_fill_keys(array_values($stmt->fetchAll(PDO::FETCH_COLUMN)), null); // multiple INSERT $postcode = '01000';// smallest german postcode while ($postcode <= 99999) {// highest german postcode $values = array(); while ($postcode <= 99999) { // reset row $row = $columns; // now fill our row with data $row['postcode'] = sprintf('%05d', $postcode); // build INSERT array foreach ($row as $value) { $values[] = $value; } $postcode++; // avoid memory kill if (!($postcode % 10000)) { break; } } // build query $count_columns = count($columns); $placeholder = ',(' . substr(str_repeat(',?', $count_columns), 1) . ')';//,(?,?,?) $placeholder_group = substr(str_repeat($placeholder, count($values) / $count_columns), 1);//(?,?,?),(?,?,?)... $into_columns = implode(',', array_keys($columns));//col1,col2,col3 // this part is optional: $on_duplicate = array(); foreach ($columns as $column => $row) { $on_duplicate[] = $column; $on_duplicate[] = $column; } $on_duplicate = ' ON DUPLICATE KEY UPDATE' . vsprintf(substr(str_repeat(', %s = VALUES(%s)', $count_columns), 1), $on_duplicate); // execute query $stmt = $db->prepare('INSERT INTO towns (' . $into_columns . ') VALUES' . $placeholder_group . $on_duplicate);//INSERT INTO towns (col1,col2,col3) VALUES(?,?,?),(?,?,?)... {ON DUPLICATE...} $stmt->execute($values); } 

जैसा कि आप इसकी पूरी तरह लचीलापन देख सकते हैं आपको कॉलम की मात्रा की जांच करने की आवश्यकता नहीं है या चेक करें कि आपका कॉलम किस स्थान पर है आपको डालने के डेटा को सेट करने की आवश्यकता है:

  $row['postcode'] = sprintf('%05d', $postcode); 

मुझे क्वेरी स्ट्रिंग कन्स्ट्रक्टरों में से कुछ पर गर्व है क्योंकि वे array_merge जैसी भारी ऑरे-फ़ंक्शन के बिना काम करते हैं। विशेष रूप से बनामप्रिंट () एक अच्छा खोज था

अंत में मुझे मेमोरी सीमा से अधिक होने से बचने के लिए () 2x जोड़ने की आवश्यकता थी I यह आपकी स्मृति सीमा पर निर्भर करता है, लेकिन समस्याओं से बचने के लिए एक सामान्य सामान्य समाधान पर (और 10 प्रश्न होने पर अभी भी 10.000 से बेहतर है)।

चूंकि यह अभी तक सुझाव नहीं दिया गया है, इसलिए मुझे पूरा यकीन है कि LOAD डेटा INFILE अभी भी डेटा लोड करने का सबसे तेज़ तरीका है क्योंकि यह अनुक्रमण को अक्षम करता है, सभी डेटा सम्मिलित करता है, और फिर अनुक्रमणिका को फिर से सक्षम करता है – सभी एक ही अनुरोध में।

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

तैयार किए गए प्रश्नों को बनाने के लिए यहां दिए गए अधिकांश समाधान अधिक जटिल हैं जिनके लिए उन्हें होना चाहिए पीएचपी में निर्मित कार्यों का उपयोग करके आप आसानी से एसक्यूएल कथन तैयार कर सकते हैं बिना महत्वपूर्ण ओवरहेड।

$records को देखते हुए, $records एक सरणी जहां प्रत्येक रिकॉर्ड स्वयं एक इंडेक्स्ड अरै है ( field => value ), निम्न फ़ंक्शन केवल पीडीओ कनेक्शन $connection पर दिए गए तालिका $table में रिकॉर्ड डालेगा एक भी तैयार बयान नोट करें कि यह एक PHP 5.6+ समाधान है क्योंकि array_push में कॉल में array_push के उपयोग के तर्क:

 private function import(PDO $connection, $table, array $records) { $fields = array_keys($records[0]); $placeHolders = substr(str_repeat(',?', count($fields)), 1); $values = []; foreach ($records as $record) { array_push($values, ...array_values($record)); } $query = 'INSERT INTO ' . $table . ' ('; $query .= implode(',', $fields); $query .= ') VALUES ('; $query .= implode('),(', array_fill(0, count($records), $placeHolders)); $query .= ')'; $statement = $connection->prepare($query); $statement->execute($values); } 

अर्रे यूनियन array_push तुलना में तेज़ होना चाहिए, तो ऐसा कुछ:

 $cumulativeArray += $rowArray; 

यद्यपि एक पुराना सवाल है कि सभी योगदानों ने मुझे बहुत मदद की, तो यह मेरा समाधान है, जो अपने खुद के DbContext क्लास के भीतर काम करता है। $rows पैरामीटर केवल पंक्तियों या मॉडलों का प्रतिनिधित्व करने वाली सहायक इकाईयों का एक सरणी है: field name => insert value

यदि आप एक मॉडल का उपयोग करते हैं जो ToRowArray का उपयोग करते हैं तो यह एक सरणी के रूप में मॉडल डेटा पारित करते समय अच्छी तरह से फिट होता है, तो मॉडल कक्षा में एक ToRowArray विधि से कहें।

नोट : यह बिना कहने के लिए जाना चाहिए, लेकिन इन तरीकों से उपयोगकर्ता के संपर्क में आने वाले तर्कों को कभी भी अनुमति नहीं दी जाती है, या डालने के मूल्यों के अलावा किसी अन्य उपयोगकर्ता इनपुट पर निर्भर करता है, जो कि मान्य और सिनिअट किया गया है। $tableName तर्क और स्तंभ नामों को कॉलिंग तर्क द्वारा परिभाषित किया जाना चाहिए; उदाहरण के लिए User मॉडल को उपयोगकर्ता तालिका में मैप किया जा सकता है, जिसकी कॉलम सूची मॉडल के सदस्य क्षेत्रों में मैप की गई है।

 public function InsertRange($tableName, $rows) { // Get column list $columnList = array_keys($rows[0]); $numColumns = count($columnList); $columnListString = implode(",", $columnList); // Generate pdo param placeholders $placeHolders = array(); foreach($rows as $row) { $temp = array(); for($i = 0; $i < count($row); $i++) $temp[] = "?"; $placeHolders[] = "(" . implode(",", $temp) . ")"; } $placeHolders = implode(",", $placeHolders); // Construct the query $sql = "insert into $tableName ($columnListString) values $placeHolders"; $stmt = $this->pdo->prepare($sql); $j = 1; foreach($rows as $row) { for($i = 0; $i < $numColumns; $i++) { $stmt->bindParam($j, $row[$columnList[$i]]); $j++; } } $stmt->execute(); } 

test.php

 <?php require_once('Database.php'); $obj = new Database(); $table = "test"; $rows = array( array( 'name' => 'balasubramani', 'status' => 1 ), array( 'name' => 'balakumar', 'status' => 1 ), array( 'name' => 'mani', 'status' => 1 ) ); var_dump($obj->insertMultiple($table,$rows)); ?> 

database.php

 <?php class Database { /* Initializing Database Information */ var $host = 'localhost'; var $user = 'root'; var $pass = ''; var $database = "database"; var $dbh; /* Connecting Datbase */ public function __construct(){ try { $this->dbh = new PDO('mysql:host='.$this->host.';dbname='.$this->database.'', $this->user, $this->pass); //print "Connected Successfully"; } catch (PDOException $e) { print "Error!: " . $e->getMessage() . "<br/>"; die(); } } /* Insert Multiple Rows in a table */ public function insertMultiple($table,$rows){ $this->dbh->beginTransaction(); // also helps speed up your inserts. $insert_values = array(); foreach($rows as $d){ $question_marks[] = '(' . $this->placeholders('?', sizeof($d)) . ')'; $insert_values = array_merge($insert_values, array_values($d)); $datafields = array_keys($d); } $sql = "INSERT INTO $table (" . implode(",", $datafields ) . ") VALUES " . implode(',', $question_marks); $stmt = $this->dbh->prepare ($sql); try { $stmt->execute($insert_values); } catch (PDOException $e){ echo $e->getMessage(); } return $this->dbh->commit(); } /* placeholders for prepared statements like (?,?,?) */ function placeholders($text, $count=0, $separator=","){ $result = array(); if($count > 0){ for($x=0; $x<$count; $x++){ $result[] = $text; } } return implode($separator, $result); } } ?>