mysql> select version();
+———–+
| version() |
+———–+
| 8.0.22 |
+———–+
1 row in set (0.00 sec)
まず適当にテーブルを作ります。
create table news( id int auto_increment PRIMARY KEY, name varchar(20), body text ); mysql> describe news; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int | NO | PRI | NULL | auto_increment | | name | varchar(20) | YES | | NULL | | | body | text | YES | | NULL | | +-------+-------------+------+-----+---------+----------------+ 3 rows in set (0.01 sec)
insert intoでは\nで改行になる。
INSERT INTO news(name, body) VALUE ('NHK', '公務員に冬のボーナス 国家公務員平均約65万円 3年連続の減少'); INSERT INTO news(name, body) VALUE ('NHK', '公務員に冬のボーナス\n国家公務員平均約65万円 3年連続の減少');
### pdo
pdoで入れる際は、\r\nをつける。
$sql = 'INSERT INTO news (name, body) VALUE (:name, :body)'; $prepare = $pdo->prepare($sql); $text = "公務員に冬のボーナス\r\n国家公務員平均約65万円 3年連続の減少"; $prepare->bindValue(':name', 'NHK', PDO::PARAM_STR); $prepare->bindValue(':body', $text, PDO::PARAM_STR); $prepare->execute(); echo "insert done";
### csv
L insertする前に、str_replace(‘\r\n’,”\r\n”,$csv);でエスケープする必要がある
$fp = fopen("test.csv", "r"); while(! feof($fp)){ $csv = fgets($fp); $csv = trim($csv,'"'); $csv = mb_convert_encoding($csv, "UTF-8", "utf-8"); $csv = str_replace('"','',$csv); $csv = str_replace('\r\n',"\r\n",$csv); $csv_array = explode(",",$csv); $stmt = $pdo->prepare("INSERT INTO news (name, body) VALUE (:name, :body)"); $stmt->bindValue(":name", $csv_array[0], PDO::PARAM_STR); $stmt->bindValue(":body", $csv_array[1], PDO::PARAM_STR); // $stmt->bindValue(":body", str_replace(["\\r","\\n"], ["\r", "\n"], $csv_array[1]), PDO::PARAM_STR); $stmt->execute(); }
fgetcsv
L fgetcsvだと、わざわざ\r\nを入れなくても、改行データをそのままmysqlに入れてくれる。
$fp = fopen("hoge.csv", "r"); while(($data[]=fgetcsv($fp))!==FALSE){ } fclose($fp); var_dump($data); foreach($data as $result){ $stmt = $pdo->prepare("INSERT INTO news (name, body) VALUE (:name, :body)"); $stmt->bindValue(":name", $result[0], PDO::PARAM_STR); $stmt->bindValue(":body", $result[1], PDO::PARAM_STR); $stmt->execute(); } echo "done";
素晴らしい。