
phpでcsvファイルをフォルダにアップロードし、これをMySQLにインポートするプログラムを作成しています。
以下のソースを実行したところエラーが発生しました。
-----food.csv----------------------------------------------------------------------
"No","name","price"
"1","うどん","100"
"2","ぱすた","500"
"3","カレー","300"
----------------------------------------------------------------------------------
-----BaseDAO.php------------------------------------------------------------------
<?php
class BaseDAO{
function connect(){
try {
$dsn = "mysql:host=localhost;dbname=food";
$option = array(
// エラーモードを例外スローに設定
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// local ファイルからload可能にする
PDO::MYSQL_ATTR_LOCAL_INFILE => true
);
$user = 'username';
$password = 'password';
$pdo = new PDO($dsn, $user, $password, $option);
$pdo->exec("SET NAMES utf8");
return $pdo;
//var_dump($pdo);
} catch (PDOException $ex) {
print($ex->getMessage());
die("データベース接続に失敗しました");
}
return null;
}
function disconnect($dao){
$dao = null;
}
}
?>
----------------------------------------------------------------------------------
------uploadcsv.php-----------------------------------------------------------------
<?php
require_once 'BaseDAO.php';
//csvファイルのアップロード
if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) {
//「files」という名前のフォルダを同じ階層に設置。ここにCSVファイルをアップロード
if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])) {
chmod("files/" . $_FILES["upfile"]["name"], 0644);
//fileパス
$file = "files/" .$_FILES["upfile"]["name"];
$sql_src = <<<SQL
LOAD DATA LOCAL INFILE %s INTO TABLE `%s`
CHARACTER SET sjis
fields terminated by ',' enclosed by '"'
lines terminated by '\\r\\n'
IGNORE 1 LINES
SQL;
$table= 'food'; //テーブル名
$inport=new BaseDAO(); //インスタンス作成
$pdo=$inport->connect(); //pdoクラスに接続
$sql = sprintf($sql_src , $pdo->quote($file), $table);
//sql文の実行
$stmt = $pdo->query($sql);
echo "インポートが完了しました!";
//失敗したとき
} else {
echo "ファイルをアップロードできません。";
}
} else {
echo "ファイルが選択されていません。";
}
?>
-----index.html---------------------------------------------------------------------
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>sample</title>
</head>
<body>
<form action="uploadcsv.php" method="POST" enctype="multipart/form-data">
ファイル:<br>
<input type="file" name="upfile" size="30"><br>
<br>
<input type="submit" value="アップロード">
</form>
</body>
</html>
----------------------------------------------------------------------------------
--------foodテーブルを作成するSQL文------------------------------------------------
CREATE TABLE IF NOT EXISTS `food` (
`No` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
`price` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
----------------------------------------------------------------------------------
実行したところ以下のエラーが発生しました。
Warning: PDO::query() [pdo.query]: LOAD DATA LOCAL INFILE forbidden in C:\xampp\htdocs\food\uploadcsv.php on line 30
<当方のPC環境>
phpMyAdmin:3.3.9
PHP: 5.3.5
Apache 2.2.17
MySQL 5.5.8
XAMPP version 1.7.4
フォルダ(files)にcsvファイルがアップロードされているところまでは確認できましたが、MySQLにインポートされていないようです。
BaseDAO.php内の「PDO::MYSQL_ATTR_LOCAL_INFILE => true」が効いていないように思えます。
初歩的な質問で凝縮ですが、原因を教えていただきたく存じます。
No.2ベストアンサー
- 回答日時:
xamppでload data local がエラーになるのは知ってましたが、日本語で検索してもでてきませんねぇ。
http://osdir.com/ml/ProfessionalPHPDevelopers/20 …
なにやら linux でも同じ問題があるらしい。
→検索キーワード「PDO, mysqlnd bug load」で漸く、、、
https://bugs.php.net/bug.php?id=54158
mysqli では問題ないので pdo_mysql の問題のようです。
どうやら、pdo_mysql driver の再コンパイルが必要らしい。
でもって、php5.4でも配布版では直ってないらしいです。上記ページの最後に以下の記述が!。
>I still seem to have this problem on: PHP 5.4.17-1~precise+1
Ubuntu 12.04
windows での再コンパイルは、Cのコンパイラー持ってないと無理なので
対策1:load だけ、mysqli でやってしまう
対策2:windowsのlocalhost なら、php側ファイルであっても、絶対パスにすれば、mysql serverからも読み込み可能なので、local はずして、実行させる。
emulation mode (オプションの PDO::MYSQL_ATTR_DIRECT_QUERY =>true またはこのキー省略)で実行すればいけます。PDO::MYSQL_ATTR_DIRECT_QUERY =>false にすると、windowsのversionによってはまた違うエラーが出たりして、pdo_mysqlのload文への対応おかしいです。
<?php
// ファイル名を絶対パスにする。$fileに相対パスが入ってるとする。
$file = dirname(__FILE__) .DIRECTORY_SEPARATOR. $file;
参考URL:https://bugs.php.net/bug.php?id=54158
返信が大変遅くなってしまい申し訳ございません。
mysqli関数での接続と、絶対パスでのsql文実行の両方の方法でコードを修正して実行してみましたが、インポートされませんでした。sql文の中身を試しにechoで出力し、そのsql文をコピーしてmysqlから実行してみたところインポートできました。という事はsql文は正しいようです。そうなるとおっしゃる通りphp側のバグという事になります。
悩み続けましたがやむおえずPHPのバージョン5.4.19とMySQLのバージョン5.5.32にそれぞれバージョンアップ、質問に記載したコードをそのままコピペしただけで実行できました。どうやらバージョンによっては不具合が生じるようです。
ともかく解決しましたので非常に助かりました。ご返信の内容の中には当方のほかのコードの参考になる内容(PDO接続の際のオプション記載について)も含まれていましたのでさっそく修正させていただきました。
ありがとうございました(#^.^#)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ftpでアップロードが出来ない
-
BASP21を利用してリネームファ...
-
onedrive にexcelファイルをア...
-
phpファイルの編集について
-
曲名をしりたい曲があるのです...
-
ファイルのアップロードで、フ...
-
FTPClientで転送結果(OKかFAIL)
-
FTP接続の例外処理
-
ファイルアップロードしたもの...
-
VBでクラウドストレージにア...
-
ファイルアップロードの上限を...
-
FTPコマンドでディレクトリごと...
-
PHPのif文でその処理を途中で抜...
-
バッチを用いたフォルダの自動移動
-
PHPSpreadsheetによる書き出し...
-
Subversionのリポジトリの削除
-
phpの中でphpを書けないか
-
リンク先を隠す方法はないでし...
-
トランザクションが原因?DBに...
-
VBSの「MsgBox」について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
onedrive にexcelファイルをア...
-
「クラウドにアップロード」」...
-
youtubeに音声のみのmp4ファイ...
-
ファイルのアップロードで、フ...
-
ファイルサイズがpost_max_size...
-
ftpでアップロードが出来ない
-
違法アップロードについて
-
DUMPした巨大SQLファイルをイン...
-
VBでクラウドストレージにア...
-
SmartyでHTMLソースの変更が反...
-
複数ファイルのアップロードに...
-
FTPClientで転送結果(OKかFAIL)
-
ファイルアップロードしたもの...
-
大容量のファイルアップロード...
-
unlinkでどうしてもファイルが...
-
one drive のアップロード失敗...
-
ファイルアップロードの上限を...
-
ファイルアップロードの日付に...
-
画像ファイルの名前をそのままU...
-
ファイルをGET送信でアップロー...
おすすめ情報