2016-05-25 7 views
0

Ich versuche, keine doppelte Frage zu erstellen und habe seit 2 Tagen gesucht, ohne eine Antwort zu finden, die auf meine Situation zutreffen scheint, also entschuldige ich mich im Voraus dafür eine doppelte/stumme Frage stellen, wenn das der Fall ist.Wie man viele Variablen mit größter Leichtigkeit und Geschwindigkeit in die Datenbank einfügt

So habe ich ein Webformular, die der Benutzer eine Excel-Datei hochlädt. Diese Excel-Datei muss genau wie in der Excel-Datei in unserer mySQL-Datenbank abgelegt werden. Ich habe die Datenbank so eingerichtet, dass sie denselben Spalten und Headern entspricht. Das Problem ist, dass diese Datei ungefähr 260 Spalten enthält und jeder Upload ungefähr 100-500 Datensätze/Zeilen enthält. Ich bin gewohnt, mysqli bind_param() zu verwenden, aber ich habe Schwierigkeiten, einen Weg zu finden, dies als ein Array mit 1 Anweisung einzufügen, so dass ich nicht in der Nähe von 300 Variablen schreiben muss. Ich habe gelesen, dass die Verwendung von PDO die Bindung mit einem Array erleichtert, aber trotz der Implementierung von mehr als 15 verschiedenen Beispielen, kann ich aus verschiedenen Gründen nicht zur Arbeit kommen. Unten ist der Code, den ich gerade habe. Ich bin nicht sehr erfahren mit PHP, aber vielleicht kann mir jemand in die richtige Richtung zeigen. Ich verwende PHPExcel die Dateidaten zu extrahieren und eine Reihe Array erstellen:

if(isset($_POST['source']) && $_POST['source'] > 0){ 
     $source = $_POST['source']; 
     if($_FILES['myFile']['name']){ 
      $error = $_FILES['myFile']['error']; 
      if ($error == UPLOAD_ERR_OK) { 
       $inputFileName = $_FILES['myFile']['tmp_name']; 
       include_once '../Assets/plugins/PHPExcel-1.8/Classes/PHPExcel.php'; 

       $filetype = PHPExcel_IOFactory::identify($inputFileName); 
       $objReader = PHPExcel_IOFactory::createReader($filetype); 
       $objReader->setReadDataOnly(true); 
       $objPHPExcel = $objReader->load($inputFileName); 
       $objWorksheet = $objPHPExcel->getActiveSheet(); 
       $highestRow = $objWorksheet->getHighestRow(); 
       $highestColumn = $objWorksheet->getHighestColumn(); 
       $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); 

       include_once('../Auth/masterClass.php'); 

HINWEIS: Masterclass ist einfach eine Verbindungsfunktion (Ich habe keine Probleme mit der Verbindung)

$add = new master; 
        $con = $add->con(); 
        switch ($source) { 
         case 1: 
          $headerData = $objWorksheet->rangeToArray('A1:'.$highestColumn.'1',NULL,TRUE,FALSE); 
          for ($row = 2; $row <= $highestRow; $row++) { 
           $table_name = 'books'; 
           $data = array(); 
           $rowData = $objWorksheet->rangeToArray('A'.$row.':'.$highestColumn.$row,NULL,TRUE,FALSE); 
           $result_set = $con->prepare("INSERT INTO `$table_name` (".implode(', ',$headerData[0]).") VALUES (:".implode(', :',$rowData[0]).")"); 
           function bindArrayValue($sql, $array){ 
            if(is_object($req) && ($req instanceof PDOStatement)){ 
             foreach($array as $key => $value){ 
              if(is_int($value)){ 
               $param = PDO::PARAM_INT; 
              }elseif(is_bool($value)){ 
               $param = PDO::PARAM_BOOL; 
              }elseif(is_null($value)){ 
               $param = PDO::PARAM_NULL; 
              }elseif(is_string($value)){ 
               $param = PDO::PARAM_STR; 
              }else{ 
               $param = FALSE; 
               if($param){ 
                $req->bindValue(":$value",$value,$param); 
               }; 
              }; 
             }; 
            }; 
           } 
           bindArrayValue($result_set,$rowData); 
           $result_set->execute(); 
    //       $sql = "INSERT INTO `books` (
    //       `id`, `title`, `author`, `status` 
    //       ) VALUES (NULL,?,?,?)"; 
    //       if($stmt = $con->prepare($sql)){ 
    //        $stmt->bind_param("sss", $data[0], $data[1], $data[2]); 
    //        if($stmt->execute()){ 
    //         $success = 1; 
    //        } else { 
    //         echo '<div class="alert alert-danger">Error: '.$sql."<br>".$con->error.'</div>'; 
    //        } 
    //       } 
          } 
          if($success == 1){ 
           echo '<div class="alert alert-success">File successfully saved to the database!</div>'; 
          } 
          break; 
         default: 
          echo '<div class="alert alert-danger">Source match not found!</div>'; 
        } 
        $con->close(); 
       }else{ 
        echo '<div class="alert alert-danger">File upload error!</div>'; 
       }; 
      }else{ 
       echo '<div class="alert alert-danger">ERROR: File cannot upload!</div>'; 
      }; 
     }else{ 
      echo '<div class="alert alert-danger">ERROR: File source not set!</div>'; 
     }; 
    ?> 

Dieser Code sagt Ich habe einen SQL-Syntaxfehler. Ich kann alles ausarbeiten, was Sie brauchen.

EDIT: versucht, "BIND ONCE" das ist, was ich habe, informieren Sie bitte:

case 1: 
         $table_name = 'books'; 
         $headerData = $objWorksheet->rangeToArray('A1:'.$highestColumn.'1',NULL,TRUE,FALSE); 
         $result_set = $con->prepare("INSERT INTO $table_name ".implode(', ',$headerData[0])."=:".implode(', ',$headerData[0]).")"); 
         bindArrayValue($result_set,$rowData); 
         for ($row = 2; $row <= $highestRow; $row++) { 
          $rowData = $objWorksheet->rangeToArray('A'.$row.':'.$highestColumn.$row,NULL,TRUE,FALSE); 
          function bindArrayValue($sql, $array){ 
           if(is_object($req) && ($req instanceof PDOStatement)){ 
            foreach($array as $key => $value){ 
             if(is_int($value)){ 
              $param = PDO::PARAM_INT; 
             }elseif(is_bool($value)){ 
              $param = PDO::PARAM_BOOL; 
             }elseif(is_null($value)){ 
              $param = PDO::PARAM_NULL; 
             }elseif(is_string($value)){ 
              $param = PDO::PARAM_STR; 
             }else{ 
              $param = FALSE; 
              if($param){ 
               $req->bindValue(":$key",$value,$param); 
              }; 
             }; 
            }; 
           }; 
          } 
          $result_set->execute(); 
         } 
+0

Sie können nicht Bindewerte zB : 4. Sie müssen Namen eingeben, zB:: somename und dann '$ req-> bindValue (": somename ", 4, $ param);'. Jetzt haben Sie '$ req-> bindValue (": 4 ", 4, $ param);'. Sie können auch anstelle von ': name'' '' ' – nospor

+1

Sie tun alles falsch. Sie erstellen eine Anweisung ** ONCE **, binden Parameter ** ONCE ** und verwenden diese vorbereitete Anweisung mehrmals in einer Schleife, indem Sie den gebundenen Parametern jedes Mal neue Werte zuweisen. Vorbereiten/Binden INNERHALB der Schleife negiert einer der Hauptzwecke der Erstellung von Anweisungen an erster Stelle: Einmaliger Kompilierungs-/Bindungspreis. –

+0

Aber Sie können ': param4' – Pred

Antwort

0

ich LOAD DATA INFILE dafür verwenden würde. Um zu verwenden, müssen Sie Excel-Datei als CSV speichern.

$sql ="LOAD DATA INFILE 'csvfile.csv' 
    INTO TABLE tablename 
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"' 
    LINES TERMINATED BY '\r\n' 
    IGNORE 1 LINES;" 
$db->exec($sql); 
0

ANTWORT: Okay, so das ich dachte, mit der Pseudo-Richtung @Marc B und diesem praktischen Link: http://thisinterestsme.com/pdo-prepared-multi-inserts/

hier ist mein Arbeitscode:

  include_once('../Auth/masterClass.php'); 
      $upload = new master; 
      $pdoObject = $upload->conn(); 

      switch ($source) { 
       case 1: 
        $tableName = 'books'; 
        $data = array(); 
        $headerData = $objWorksheet->rangeToArray('A1:'.$highestColumn.'1',NULL,TRUE,FALSE); 
        for ($rec = 2; $rec <= $highestRow; $rec++) { 
         $rowData = $objWorksheet->rangeToArray('A'.$rec.':'.$highestColumn.$rec,NULL,TRUE,FALSE); 
         $comb_data = array_combine($headerData[0],$rowData[0]); 
         $data[] = $comb_data; 
        } 
        function pdoMultiInsert($tableName, $data, $pdoObject){ 
          //Will contain SQL snippets. 
          $rowsSQL = array(); 
          //Will contain the values that we need to bind. 
          $toBind = array(); 
          //Get a list of column names to use in the SQL statement. 
          $columnNames = array_keys($data[0]); 
          //Loop through our $data array. 
          foreach($data as $arrayIndex => $row){ 
            $params = array(); 
            foreach($row as $columnName => $columnValue){ 
              $param = ":" . $columnName . $arrayIndex; 
              $params[] = $param; 
              $toBind[$param] = $columnValue; 
            } 
            $rowsSQL[] = "(" . implode(", ", $params) . ")"; 
          } 
          //Construct our SQL statement 
          $sql = "INSERT INTO `$tableName` (" . implode(", ", $columnNames) . ") VALUES " . implode(", ", $rowsSQL); 
          //Prepare our PDO statement. 
          $pdoStatement = $pdoObject->prepare($sql); 
          //Bind our values. 
          foreach($toBind as $param => $val){ 
            $pdoStatement->bindValue($param, $val); 
          } 
          //Execute our statement (i.e. insert the data). 
          return $pdoStatement->execute(); 
        } 
        if(pdoMultiInsert($tableName, $data, $pdoObject)){ 
         echo '<div class="alert alert-success">File successfully saved to the database!</div>'; 
        } 
        break; 
       default: 
      } 
Verwandte Themen