アップデート
この質問を投稿してから2回目は、結果のクエリの構文が強調表示されたおかげで、何がうまくいかなかったのかがわかりました。$pl
文字列が閉じたバックティックで開かなかったのです。今、私はそれを次のように変更しました:
$pk = ',`%1$sUSER`,`%1$sTYPE`,`%1$sCODE`,`%1$sVALUE`,`%1$s';//WRONG
$pk = '`,`%1$sUSER`,`%1$sTYPE`,`%1$sCODE`,`%1$sVALUE`,`%1$s';//OK
しかし、これは新しい疑問を提起します:なぜPDOオブジェクトはこれについて私にエラーを吐き出さなかったのですか?fld2_AGE,
クエリを手動で実行すると、末尾にコンマが付いた、というフィールドがないというエラーが返されます。エラーが発生しなかったのはなぜですか?何か案は?
PS:私の問題を解決するためにSOのシンタックスハイライトに賛成する方法はありますか?:-)
元の質問は参照/例として残していますが、もう解決する必要はありません
さて、私はしばらく前に書いたスクリプトを使用して、巨大なファイルからいくつかのcsvファイルをインポートして生成し、データをいくつかのmysqlテーブルにすばやくインポートしました。このスクリプトは、私が2番目のスクリプトを作成するまで、過去にうまく機能していませんでした。このスクリプトでは、誤ってテーブルを切り捨ててしまいました(ばかげていると思います)。「大したことはありません」私はスクリプトを持っていたので、データを復元するのはほんの数秒だと思いました。残念ながら、現在インポートされているファイルは1つだけであり、エラーは表示されていません。以下に、スクリプトのdbセクション全体を貼り付けました。このコードを実行すると、出力だけが得られますfiles imported successfully
。これは、コードの最後の行です...
失敗した大きなコードブロックであり、文字列形式の印刷が多く、読みやすさが向上しないことはわかっているので、結果のクエリ文字列も以下に示します。私が知る限り、ファイルと同様に、それらは適切にフォーマットされているように見えます(私はチェックしました)。誰かが私がエラーを探すことになっている他の場所を教えてもらえますか?それは大きな助けになるでしょう...ありがとう!
<?php
$files = array_fill_keys(array('filename1','filename2','filename3','filename4'),'');
//$files === array of handles fputcsv($files['filename1'],array('values','from','other','files'),';');
$tbls = array_combine($files,array('tblname1','tblname2','tblname3','tblname4'));
$path = dirname(__FILE__)'/';
$qf = 'LOAD DATA LOCAL INFILE \'%s%s.csv\' INTO TABLE my_db.tbl_prefix_%s FIELDS TERMINATED BY \';\' OPTIONALLY ENCLOSED BY \'"\' LINES TERMINATED BY \'\n\'';
$pref = array_combine($files,array('fld1_','fld2_','fld3_','fld3_'));
$pkA = ' (`%1$sNAME`,`%1$sAGE';
$pk = '`,`%1$sUSER`,`%1$sTYPE`,`%1$sCODE`,`%1$sVALUE`,`%1$s';
try
{
$db = new PDO('mysql:host=mysqlhostn','user','pass');
foreach($files as $f)
{
$db->beginTransaction();
$db->exec(sprintf('TRUNCATE TABLE my_db.tbl_prefix_%s',$tbls[$f]));
$db->commit();
}
}
catch(PDOException $e)
{
if ($db)
{
$db->rollBack();
$db = null;
}
die('DB connection/truncate failed: '.$e->getMessage()."\n");
}
try
{
while($f = array_shift($files))
{
$db->beginTransaction();
$q = sprintf($qf,$path,$f,$tbls[$f]).sprintf($pkA.($f !== 'agent' ? $pk : ''),$pref[$f]);
switch($f)
{
case 'filename3':
$q .= 'tbl3_specific_field';
break;
case 'filename2':
$q .= sprintf('tbl2_specific_field`,`%1$tbl2_specific_field2',$pref[$f]);
break;
case 'filename4':
$q .= sprintf('tbl4_specific_field`,`%1$tbl4_specific_field2`,`%1$tbl4_specific_field3`,`%1$tbl4_specific_field4',$pref[$f]);
break;
}
$stmt = $db->prepare($q.'`)');
$stmt->execute();
$db->commit();
}
}
catch(PDOException $e)
{
$db->rollBack();
$e = 'CSV import Failed: '.$e->getMessage();
$db=null;
die($e."\n");
}
$db = null;
exit('files imported successfully'."\n");
?>
生成されたクエリ-実行出力:
TRUNCATE TABLE my_db.tbl_prefix_tblname1
TRUNCATE TABLE my_db.tbl_prefix_tblname2
TRUNCATE TABLE my_db.tbl_prefix_tblname3
TRUNCATE TABLE my_db.tbl_prefix_tblname4
LOAD DATA LOCAL INFILE '/local/path/to/files/filename1.csv' INTO TABLE my_db.tbl_prefix_tblname1 FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' (`fld1_NAME`,`fld1_AGE`)
LOAD DATA LOCAL INFILE '/local/path/to/files/filename2.csv' INTO TABLE my_db.tbl_prefix_tblname2 FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' (`fld2_NAME`,`fld2_AGE,`fld2_USER`,`fld2_TYPE`,`fld2_CODE`,`fld2_VALUE`,`fld2_tbl2_specific_field`,`fld2_tbl2_specific_field2`)
LOAD DATA LOCAL INFILE '/local/path/to/files/filename3.csv' INTO TABLE my_db.tbl_prefix_tblname3 FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' (`fld3_NAME`,`fld3_AGE,`fld3_USER`,`fld3_TYPE`,`fld3_CODE`,`fld3_VALUE`,`fld3_tbl3_specific_field`)
LOAD DATA LOCAL INFILE '/local/path/to/files/filename4.csv' INTO TABLE my_db.tbl_prefix_tblname4 FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' (`fld4_NAME`,`fld4_AGE,`fld4_USER`,`fld4_TYPE`,`fld4_CODE`,`fld4_VALUE`,`fld4_tbl4_specific_field`,`fld4_tbl4_specific_field2`,`fld4_tbl4_specific_field3`,`fld4_tbl4_specific_field4`)
csvが正常にインポートされました
File1は、必要に応じてインポートされます。最初のファイルの例です。
11; 9
file2の実際のコンテンツ(インポートされていない)は次のようになります。
11; 9; 25; 5; FOOBAR; Z; 333; 321; 123
最初のフィールドには両方とも同じデータが含まれているはずですが、両方のテーブルには同じフィールド定義、同じストレージエンジン(InnoDB)、照合(UTF-8)があります...問題の原因がわからないので、アドバイスは大変感謝しております。