2013-01-05 76 views
5

我无法使用PDO将多个记录插入到数据库中。我可以成功添加一条记录,但只要添加foreach循环,就会失败。在阅读了一些关于此的其他SO问题之后,我相信我需要“绑定”我的变量,尽管我对正确的语法感到困惑。使用循环插入PHP PDO

这里是原来的功能,我创建:

<? 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' 


UPDATE:对于那些有兴趣,这里是我最后的作用我修正了错误后:

<? 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!事实证明我的代码应该工作。我的代码中有多个错误,直到现在还没有弹出。 –

回答

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!在接受@hakre建议将$ _SESSION方面移出函数之外,我发现了一些错误,直到最后一步才会弹出。 –

+0

你能举一个例子来说明“$ yourDataArray” –

2

For循环,这样做(PDO或支持预处理语句其他数据库客户端库) :

  1. 准备SQL INSERT查询。
  2. 绑定变量。
  3. 将您的数组循环绑定变量,每次迭代执行一次。

利润。

对于数组中要插入数据的阵列上基于PDO的示例,该表需要一列名为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);'); 

现在让我们将命名参数绑定到变量。请注意,该变量是前缀(这里是insert)。这实际上是混叠到输入数组中option关键:

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

所以现在从上面的编号列表,点1)准备SQL INSERT查询。和2.)绑定变量。已经完成。

只有左边的是循环在$options阵列插入值:

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

利用的extract允许基于在产生一个混淆的方式输入数组而不无事生非上一次设置多个变量。

完整的例子:

$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

为什么要这样构建而不是仅仅创建一个准备好的查询呢?无需在PDO插入执行循环。 – JM4