2013-01-05 14 views
5

मुझे डेटाबेस में एकाधिक रिकॉर्ड डालने के लिए पीडीओ का उपयोग करने में परेशानी हो रही है। मैं सफलतापूर्वक एक रिकॉर्ड जोड़ सकता हूं, लेकिन जैसे ही मैं foreach लूप जोड़ता हूं, यह विफल हो जाता है। इसके बारे में कई अन्य SO प्रश्न पढ़ने के बाद, मेरा मानना ​​है कि मुझे अपने चर "बाध्य" करने की आवश्यकता है, हालांकि मैं उचित वाक्यविन्यास पर पूरी तरह उलझन में हूं।PHP पीडीओ लूप का उपयोग करके सम्मिलित करें

<? function addToDatabase() { 
    //Get All Variables 
    $timestamp = date("Y-m-d H:i:s"); 
    $schoolName = $_SESSION['schoolName']; 
    $schoolStreet = $_SESSION['schoolStreet']; 
    $schoolCity = $_SESSION['schoolCity']; 
    $schoolState = $_SESSION['schoolState']; 
    $schoolZip = $_SESSION['schoolZip']; 
    $schoolContactName = $_SESSION['schoolContactName']; 
    $schoolContactTitle = $_SESSION['schoolContactTitle']; 
    $schoolContactPhone = $_SESSION['schoolContactPhone']; 
    $schoolCsontactEmail = $_SESSION['schoolContactEmail']; 
    $inputMethod = $_SESSION['inputMethod']; 

    $studentDataArray = $_SESSION['studentDataArray']; 

    $studentFirstNameField = $_SESSION['studentFirstNameField']; 
    $studentLastNameField = $_SESSION['studentLastNameField']; 
    $studentStreetField = $_SESSION['studentStreetField']; 
    $studentCityField = $_SESSION['studentCityField']; 
    $studentStateField = $_SESSION['studentStateField']; 
    $studentZipcodeField = $_SESSION['studentZipcodeField']; 
    $studentDOBField = $_SESSION['studentDOBField']; 
    $studentGenderField = $_SESSION['studentGenderField']; 
    $studentGradeField = $_SESSION['studentGradeField']; 

    //Connnect to Database 
    $host = 'myHost'; 
    $un = 'myUsername'; 
    $pw = 'myPassword'; 
    $db_name = 'myTable'; 

    try { 
     $conn = new PDO("mysql:host=$host;dbname=$dbName", $un, $pw); 
     echo 'Connected to database<br>'; 

     $sql = "INSERT INTO studentData (originallyAddedOn, inputMethod, studentFirst, studentLast, studentStreet, studentCity, studentState, studentZip, studentDOB, studentGender, studentGrade, schoolName, schoolStreet, schoolCity, schoolState, schoolZip, schoolContactName, schoolContactTitle, schoolContactEmail, schoolContactPhone) VALUES (:originallyAddedOn, :inputMethod, :studentFirst, :studentLast, :studentStreet, :studentCity, :studentState, :studentZip, :studentDOB, :studentGender, :studentGrade, :schoolName, :schoolStreet, :schoolCity, :schoolState, :schoolZip, :schoolContactName, :schoolContactTitle, :schoolContactEmail, :schoolContactPhone)"; 

     foreach ($studentDataArray as $student){ 
      $q = $conn->prepare($sql); 
      echo $student[$studentFirstNameField]."<br>"; 
      $q->execute(array( ':originallyAddedOn'=>$timestamp, 
          ':inputMethod'=>$inputMethod, 
          ':studentFirst'=>$student[$studentFirstNameField], 
          ':studentLast'=>$student[$studentLastNameField], 
          ':studentStreet'=>$student[$studentStreetField], 
          ':studentCity'=>$student[$studentCityField], 
          ':studentState'=>$student[$studentStateField], 
          ':studentZip'=>$student[$studentZipField], 
          ':studentDOB'=>$student[$studentDOBField], 
          ':studentGender'=>$student[$studentGenderField], 
          ':studentGrade'=>$student[$studentGradeField], 
          ':schoolName'=>$schoolName, 
          ':schoolStreet'=>$schoolStreet, 
          ':schoolCity'=>$schoolCity, 
          ':schoolState'=>$schoolState, 
          ':schoolZip'=>$schoolZip, 
          ':schoolContactName'=>$schoolContactName, 
          ':schoolContactTitle'=>$schoolContactTitle, 
          ':schoolContactEmail'=>$schoolContactEmail, 
          ':schoolContactPhone'=>$schoolContactPhone));   
      } 
      // close the database connection 
      $dbh = null; 
     } 
     catch(PDOException $e) { 
      echo $e->getMessage(); 
      } 
    } 

$studentDataArray इस के समान दिखता है:

0 => //student 1 
    array 
     [0] => 'Joe' //First 
     [1] => 'Smith' //Last 
     [2] => '101 Main St' //Street 
     [3] => 'Boston' //City 
     [4] => 'MA' //State 
     [5] => '' //Zip 
     [6] => '2000-01-01' //Date of Birth 
     [7] => 'Male' //Gender 
     [8] => '12' //Grade 

1 => //Student 2 
    array 
     [0] => 'Jane' 
     [1] => 'Smith' 
     [2] => '99 Main St' 
     [3] => 'Boston' 
     [4] => 'MA' 
     [5] => '' 
     [6] => '2000-02-02' 
     [7] => 'Female' 
     [8] => '10' 


अद्यतन: उन है कि रुचि रखते हैं के लिए, यहाँ मेरा अंतिम समारोह है

यहाँ मूल कार्य मैं बनाया है त्रुटियों को ठीक करने के बाद:

<? function addToDatabase ($dataArray) { 

    //Connnect to Database 
    $host = 'myHost'; 
    $un = 'myUsername'; 
    $pw = 'myPassword'; 
    $db_name = 'myTable';  

    try { 
     $conn = new PDO("mysql:host=$host;dbname=$dbName", $un, $pw); 
     echo 'Connected to database<br>'; 

     $sql = "INSERT INTO studentData (originallyAddedOn, inputMethod, studentFirst, studentLast, studentStreet, studentCity, studentState, studentZip, studentDOB, studentGender, studentGrade, schoolName, schoolStreet, schoolCity, schoolState, schoolZip, schoolContactName, schoolContactTitle, schoolContactEmail, schoolContactPhone) VALUES (:originallyAddedOn, :inputMethod, :studentFirst, :studentLast, :studentStreet, :studentCity, :studentState, :studentZip, :studentDOB, :studentGender, :studentGrade, :schoolName, :schoolStreet, :schoolCity, :schoolState, :schoolZip, :schoolContactName, :schoolContactTitle, :schoolContactEmail, :schoolContactPhone)"; 
     $q = $conn->prepare($sql); 

     foreach ($dataArray as $student){ 
      $a = array (':originallyAddedOn'=>$student['timestamp'], 
         ':inputMethod'=>$student['inputMethod'], 
         ':studentFirst'=>$student['studentFirst'], 
         ':studentLast'=>$student['studentLast'], 
         ':studentStreet'=>$student['studentStreet'], 
         ':studentCity'=>$student['studentCity'], 
         ':studentState'=>$student['studentState'], 
         ':studentZip'=>$student['studentZip'], 
         ':studentDOB'=>$student['studentDOB'], 
         ':studentGender'=>$student['studentGender'], 
         ':studentGrade'=>$student['studentGrade'], 
         ':schoolName'=>$student['schoolName'], 
         ':schoolStreet'=>$student['schoolStreet'], 
         ':schoolCity'=>$student['schoolCity'], 
         ':schoolState'=>$student['schoolState'], 
         ':schoolZip'=>$student['schoolZip'], 
         ':schoolContactName'=>$student['schoolContactName'], 
         ':schoolContactTitle'=>$student['schoolContactTitle'], 
         ':schoolContactEmail'=>$student['schoolContactEmail'], 
         ':schoolContactPhone'=>$student['schoolContactPhone']); 

      if ($q->execute($a)) {   
       // Query succeeded. 
       } else { 
        // Query failed. 
        echo $q->errorCode(); 
        } 
      // close the database connection 
      $dbh = null; 
      echo "Insert Complete!"; 
     } 
     } 
     catch(PDOException $e) { 
      echo $e->getMessage(); 
      } 
    } 
+2

कोड है कि यह की अपनी के एक समारोह में डेटाबेस में सरणी सम्मिलित करता है को स्थानांतरित करें। यहां आपके प्रश्न के लिए इसे कोई भी भूमिका प्रपत्र नहीं खेलना चाहिए जहां वह सरणी आती है (उदाहरण के लिए आप यहां '$ _SESSION' के साथ क्या करते हैं, केवल एक अच्छे उदाहरण के रास्ते में)। इस तरह के एक समारोह को बनाने से दुष्प्रभावों को कम करने में भी मदद मिलेगी जो आप त्रुटियों के लिए कुछ जगहों को खोल सकते हैं। – hakre

+0

धन्यवाद @ hakre! यह मेरा कोड _should_ काम किया है पता चला है। मेरे कोड में कई त्रुटियां थीं जो अभी तक पॉप अप नहीं हुई थीं। –

उत्तर

7

आपको अपने चर को बांधने की आवश्यकता नहीं है। मैंने पहले इसी कोड के साथ ऐसा किया था। यह कहना मुश्किल है कि क्या गलत हो रहा है। क्या आपको अपवाद मिलता है - यदि ऐसा है तो यह क्या है?

try { 
     $conn = new PDO("mysql:host=$host;dbname=$dbName", $un, $pw); 
     echo 'Connected to database<br>'; 

     $sql = "INSERT INTO studentData (originallyAddedOn, inputMethod, studentFirst, studentLast, studentStreet, studentCity, studentState, studentZip, studentDOB, studentGender, studentGrade, schoolName, schoolStreet, schoolCity, schoolState, schoolZip, schoolContactName, schoolContactTitle, schoolContactEmail, schoolContactPhone) VALUES (:originallyAddedOn, :inputMethod, :studentFirst, :studentLast, :studentStreet, :studentCity, :studentState, :studentZip, :studentDOB, :studentGender, :studentGrade, :schoolName, :schoolStreet, :schoolCity, :schoolState, :schoolZip, :schoolContactName, :schoolContactTitle, :schoolContactEmail, :schoolContactPhone)"; 

     // prepare once... exceute many :-) 
     $q = $conn->prepare($sql); 

     foreach($studentDataArray as $student) { 
      $q->execute($yourDataArray); 
      // do other stuff if needed 

     } 

} catch(PDOException $e) { 
    echo $e->getMessage(); 
} 
+1

बस परिवर्तनीय बाध्यकारी के साथ एक उदाहरण जोड़ा गया है जो * * * (अगर कोई पसंद करता है) एलियासिंग को हल करता है। बाकी आपके जैसा ही है, मैं यह भी कहूंगा कि शुरुआत में केवल एक बार क्वेरी तैयार करना बहुत ही महत्वपूर्ण है लेकिन कई बार निष्पादित करना बहुत महत्वपूर्ण है। http://stackoverflow.com/a/14167897/367456 – hakre

+0

धन्यवाद @prodigitalson! समारोह के $ _SESSION पहलू को स्थानांतरित करने के @ नकरे सुझाव लेने के बाद, मुझे कई त्रुटियां मिलीं जो इस अंतिम चरण तक पॉप अप नहीं हुईं। –

+0

क्या आप "$ yourDataArray" –

2

छोरों के लिए, यह (पीडीओ या कि तैयार बयान का समर्थन अन्य डेटाबेस क्लाइंट लाइब्रेरी) कार्य करें:

केवल एक चीज मैं गलत देख आप और अधिक की तरह पाश अंदर अपनी तैयारी ... होना चाहिए है :

  1. एसक्यूएल INSERT क्वेरी तैयार करें।
  2. चर बाध्य करें।
  3. बाध्य चर के खिलाफ अपनी सरणी लूप, प्रति पुनरावृत्ति एक बार निष्पादित करें।

लाभ।

कुछ तालिका में डालने के लिए डेटा के साथ एक सरणी पर पीडीओ आधारित उदाहरण के लिए जिसके लिए option नामक एक कॉलम की आवश्यकता होती है।

पहले कुछ डेटा डेटाबेस में सम्मिलित करने के:

$options = [ 
    ['option' => "Insert Option A " . uniqid()], 
    ['option' => "Insert Option B " . uniqid()], 
    ['option' => "Insert Option C " . uniqid()], 
]; 

कहीं और, चलो करने के लिए उस $options सरणी और डाटाबेस संपर्क के बारे में परवाह मान लें। इसके लिए एक कनेक्शन की आवश्यकता है:

$conn = new PDO('mysql:dbname=test;host=localhost', 'testuser', 'test'); 

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE); 

अब आइए सम्मिलित क्वेरी तैयार करें। प्रश्न में की तरह नामित पैरामीटर का उपयोग करना यहाँ, यकीन है कि यह क्रमांकित मानकों के साथ भी काम करता है:

$stmt = $conn->prepare('INSERT INTO config (`OPTION`) VALUES (:OPTION);'); 

अब चलो यहाँ एक चर करने के लिए नामित पैरामीटर बाध्य करते हैं। ध्यान दें, वैरिएबल prefixed है (यहां insert के साथ)। तो अब

$stmt->bindParam(':OPTION', $insert_option); 

ऊपर क्रमांकित सूची से, अंक 1.) एसक्यूएल INSERT क्वेरी को तैयार: यह वास्तव में इनपुट सरणी में option कुंजी को अलियासिंग है। और 2.) चर बाध्य करें। हो गया है।

foreach ($options as $insert) { 
    extract($insert, EXTR_PREFIX_ALL, 'insert'); 
    $stmt->execute(); 
} 

बनाना extract के उपयोग ज्यादा हलचल के बिना एक aliased फैशन में इनपुट सरणी के आधार पर एक साथ कई चर सेट करने के लिए अनुमति देता है:

केवल बाईं $options सरणी पर पाश मूल्यों डालने के लिए है।

पूर्ण उदाहरण:

$options = [ 
    ['option' => "Insert Option A " . uniqid()], 
    ['option' => "Insert Option B " . uniqid()], 
    ['option' => "Insert Option C " . uniqid()], 
]; 

$conn = new PDO('mysql:dbname=test;host=localhost', 'testuser', 'test'); 

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE); 

# 1. Prepare  
$stmt = $conn->prepare('INSERT INTO config (`OPTION`) VALUES (:OPTION);'); 

# 2. Bind 
$stmt->bindParam(':OPTION', $insert_option); 

# 3. Loop & Execute 
foreach ($options as $insert) { 
    extract($insert, EXTR_PREFIX_ALL, 'insert'); 
    $stmt->execute(); 
} 
+0

केवल एक ही तैयार क्वेरी बनाने के बजाय आप इस तरह क्यों निर्माण करेंगे? पीडीओ सम्मिलित निष्पादन पर लूप की कोई आवश्यकता नहीं है। – JM4

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