2016-05-25 17 views
0

私は重複した質問を作成しようとしておらず、私の状況に当てはまる回答を見出すことなく2日間検索しています。そうであれば重複した質問をしてください。多くの変数を簡単にデータベースに挿入する方法

私はユーザーがExcelファイルをアップロードするWebフォームを持っています。このExcelファイルは、Excelファイルとまったく同じようにmySQLデータベースに配置する必要があります。同じ列とヘッダーに一致するようにデータベースを設定しました。問題は、このファイルには約260の列があり、各アップロードには約100-500レコード/行が含まれることです。私はmysqli bind_param()を使用することに慣れていますが、これを1つのステートメントを持つ配列として挿入する方法を見つけるのが難しいので、300個の変数の近くに書き込む必要はありません。私はPDOを使用して配列を簡単にバインドすることができますが、15を超えるさまざまな例を実装していますが、さまざまな理由で機能することができません。以下は私の今のコードです。私はPHPにはあまり経験はありませんが、誰かが私を正しい方向に向けることができます。私は、ファイルデータを抽出し、行の配列を作成するPHPExcelを使用しています:

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'); 

注:マスタークラスは、単に接続機能である(私は接続には問題がありません)

$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>'; 
     }; 
    ?> 

このコードは語っています私はSQL構文エラーがあります。私はあなたが必要とするものを何でも手がけています。

EDIT:これは私が持っているものである "ONCE BIND" しようとしましたは、アドバイスしてください:私はこのためLOAD DATA INFILEを使用することになり

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

あなたがすることはできませんバインド値:4。名前を設定する必要があります::somename、次に '$ req-> bindValue(":somename "、4、$ param);'。今度は '$ req-> bindValue(":4 "、4、$ param);'があります。 ':name'の代わりに'? 'を使うこともできます。 – nospor

+1

あなたはそれを間違ってやっています。 ** ONCE **ステートメントを準備し、** ONCE **パラメーターをバインドし、そのたびにバインドされたパラメーターに新しい値を再割り当てして、その準備済みのステートメントをループ内で複数回再利用します。ループの準備/結合は、最初にステートメントを準備する主な目的の1つを否定します。コンパイル/バインド価格を1回支払うことです。 –

+0

しかし ':param4'を使うことができます – Pred

答えて

0

。 Excelファイルをcsvとして保存する必要があります。

$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

ANSWER:わかりましたので、私は@Marc Bとこの便利なリンクの疑似方向でこれを考え出した:ここhttp://thisinterestsme.com/pdo-prepared-multi-inserts/

は私の作業コードは次のとおりです。

  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: 
      } 
関連する問題