私は重複した質問を作成しようとしておらず、私の状況に当てはまる回答を見出すことなく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();
}
あなたがすることはできませんバインド値:4。名前を設定する必要があります::somename、次に '$ req-> bindValue(":somename "、4、$ param);'。今度は '$ req-> bindValue(":4 "、4、$ param);'があります。 ':name'の代わりに'? 'を使うこともできます。 – nospor
あなたはそれを間違ってやっています。 ** ONCE **ステートメントを準備し、** ONCE **パラメーターをバインドし、そのたびにバインドされたパラメーターに新しい値を再割り当てして、その準備済みのステートメントをループ内で複数回再利用します。ループの準備/結合は、最初にステートメントを準備する主な目的の1つを否定します。コンパイル/バインド価格を1回支払うことです。 –
しかし ':param4'を使うことができます – Pred