2011-12-02 15 views
7

मैं तैयार बयानों के लिए this question में staticsan's जवाब उपयोग करने के लिए कोशिश कर रहा हूँ। इस उदाहरण लेते हैं:तैयार कथन के साथ एक बार MySQL डेटाबेस में एकाधिक पंक्तियों को कैसे सम्मिलित करें?

$stmt = $mysqli->prepare("INSERT INTO something (userid, time, title) VALUES (?, ?, ?)"); 
$stmt->bind_param('iis', $userid, time(), $title); 
$stmt->execute(); 

staticsan's जवाब में imploding सरणी mysql बयान में सभी मूल्यों को जोड़ रहा है ताकि अंत में हम सिर्फ एक बयान के साथ डेटाबेस में एक से अधिक डेटा सम्मिलित कर सकते हैं। यह मेरे उदाहरण में कैसे किया जाएगा?

+0

आपका उदाहरण यह पहले से ही है मानकों की एक निश्चित संख्या है, इसलिए हल किया। क्या आप अपनी समस्या को थोड़ा और विस्तारित कर सकते हैं? अब तक तुमने क्या प्रयास किये हैं? इसे मूल रूप से वही काम करना चाहिए लेकिन अधिक पैरामीटर जोड़ना चाहिए, उदा। एक 'foreach' पाश में। – hakre

+0

आप यहाँ उल्लेख किया कोड का उपयोग कर तैयार बयान फार्म कर सकते हैं http://stackoverflow.com/questions/1176352/pdo-prepared-inserts-multiple-rows-in-single-query –

उत्तर

5

यह पूरी तरह से वैध है:

$stmt = $mysqli->prepare("INSERT INTO something (userid, time, title) VALUES (?, ?, ?)"); 

$stmt->bind_param('iis', $userid, time(), $title); 
$stmt->execute(); 

$stmt->bind_param('iis', $userid, time(), $title); 
$stmt->execute(); 

$stmt->bind_param('iis', $userid, time(), $title); 
$stmt->execute(); 

$stmt->bind_param('iis', $userid, time(), $title); 
$stmt->execute(); 

आप मूल्यों के अपने सरणी डालने और बाँध और हर बार निष्पादित करने के लिए खत्म हो गया foreach कर सकते हैं। यह आपके द्वारा लिंक किए गए उदाहरण में थोक सम्मिलन जितना तेज़ नहीं होगा, लेकिन यह अधिक सुरक्षित होगा।

+1

धन्यवाद, कि काम करता है। लेकिन निष्पादन() प्रत्येक सरणी तत्व के लिए निष्पादित किया जाएगा, इसलिए प्रत्येक पंक्ति डेटाबेस में अलग-अलग डाली जाएगी और सभी एक ही समय में नहीं। क्या मैं सही हू? मैं एक समाधान जहां पहले bind_param सभी मूल्यों को देखने के लिए उम्मीद कर रही थी और अंत में यह एक बार निष्पादित। – phpheini

+0

हां, यह सही है, लेकिन मुख्य लाभ गति से तैयार बयान द्वारा प्रदान की वृद्धि हुई है - एक बार बयान तैयार करने और कई बार में चल रहा यह हर बार की तैयारी की तुलना में बहुत तेजी से होता है। –

+0

यह अभी भी एक अच्छी पुरानी स्थिर 'INSERT' क्वेरी की तुलना में धीमा है, है ना? मेरा मतलब है, एक लूप में क्वेरी निष्पादित करने से प्रत्येक क्वेरी के बीच ~ 2ms देरी होती है। बड़े सरणी के साथ यह हमेशा के लिए ले जाएगा, नहीं? – NoobishPro

-2

क्वेरी इस तरह दिखता है:

INSERT INTO people (name, age) 
    VALUES 
    ('Helen', 24), 
    ('Katrina', 21), 
    ('Samia', 22), 
    ('Hui Ling', 25), 
    ('Yumie', 29) 
+4

हाँ, लेकिन तैयार बयानों के लिए नहीं। सवाल है, मैं लिखने की क्या ज़रूरत है '$ mysqli-> तैयार (", INSERT कुछ जांच (userid, समय, शीर्षक)?,?,? ?,?,? मूल्यों(),() (?,? ,?) ");' और फिर 'bind_param ('iisiisiis', $ userid [0], समय(), $ शीर्षक, $ userid [0], समय(), $ शीर्षक [0], $ उपयोगकर्ता आईडी [1], समय(), $ शीर्षक [1], $ userid [2], समय(), $ शीर्षक [2]); ' – phpheini

2

आप तैयार बयान कोड का उपयोग कर निर्माण कर सकते हैं यहाँ उल्लेख किया,

PDO Prepared Inserts multiple rows in single query

पीएचपी तर्क की तरह तरह की हो जाएगा,

/** 
* Insert With Ignore duplicates in Mysql DB. 
* 
* @param string $date Date. 
*/ 
public static function insertWithIgnore($em, $container, $tableName, $fields, $rows) 
{ 
    $query = "INSERT IGNORE INTO $tableName (`" . implode('`,`', $fields) . "`) VALUES "; 
    $placeHolr = array_fill(0, count($fields), "?"); 
    $qPart = array_fill(0, count($rows), "(" . implode(',', $placeHolr) . ")"); 
    $query .= implode(",", $qPart); 

    $pdo = self::getPDOFromEm($em, $container); 
    $stmt = $pdo->prepare($query); 
    $i = 1; 
    foreach ($rows as $row) { 
     $row['created_at'] = date("Y-m-d H:i:s"); 
     foreach ($fields as $f) { 
      if (!isset($row[$f])) { 
       $row[$f] = null; 
      } 
      $stmt->bindValue($i++, $row[$f]); 
     } 
    } 

    $result = $stmt->execute(); 

    if ($result == false) { 
     $str = print_r($stmt->errorInfo(), true); 
     throw new \Exception($str); 
    } 

    $stmt->closeCursor(); 
    $pdo = null; 
} 

/** 
* Replace old rows in Mysql DB. 
* 
* @param string $date Date. 
*/ 
public static function replace($em, $container, $tableName, $fields, $rows, $extraFieldValues = null) 
{ 
    if ($extraFieldValues != null) { 
     $fields = array_unique(array_merge($fields, array_keys($extraFieldValues))); 
    } 

    $query = "REPLACE INTO $tableName (`" . implode('`,`', $fields) . "`) VALUES "; 
    $placeHolr = array_fill(0, count($fields), "?"); 
    $qPart = array_fill(0, count($rows), "(" . implode(',', $placeHolr) . ")"); 
    $query .= implode(",", $qPart); 

    $pdo = self::getPDOFromEm($em, $container); 
    $stmt = $pdo->prepare($query); 
    $i = 1; 
    foreach ($rows as $row) {    
     if ($extraFieldValues != null) { 
      $row = array_merge($row, $extraFieldValues); 
     } 
     foreach ($fields as $f) { 
      $stmt->bindValue($i++, $row[$f]); 
     }       
    } 
    $stmt->execute(); 
    if (!$stmt) { 
     throw new \Exception("PDO::errorInfo():" . print_r($stmt->errorInfo(), true)); 
    } 
    $stmt->closeCursor(); 
    $pdo = null; 
} 
संबंधित मुद्दे

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