目的: 改行テキストをPDOでCSVからMySQLにinsertしたい。
問題: 改行箇所を"\r\n"としてPDOでMySQLにインサートすると、mysqlに\r\nが文字列として入ってしまう。
mysql: 8.0.22
csvテキスト
csv
1name1,サンプル1\r\nテキスト1 2name2,サンプル2\r\nテキスト2
pdo
php
1try { 2 $pdo = new PDO("mysql:host=localhost;dbname=test;charaset=utf8","*","*", 3 array(PDO::ATTR_EMULATE_PREPARES => false)); 4 } catch (PDOException $e){ 5 exit('データベース接続失敗.'.$e->getMessage()); 6 } 7 8$fp = fopen("news.csv", "r"); 9 10while(! feof($fp)){ 11 $csv = fgets($fp); 12 $csv = trim($csv,'"'); 13 $csv = mb_convert_encoding($csv, "UTF-8", "utf-8"); 14 $csv = str_replace('"','',$csv); 15 $csv_array = explode(",",$csv); 16 17 $stmt = $pdo->prepare("INSERT INTO news (name, body) VALUE (:name, :body)"); 18 19 $stmt->bindValue(":name", $csv_array[0], PDO::PARAM_STR); 20 $stmt->bindValue(":body", $csv_array[1], PDO::PARAM_STR); 21 var_dump($stmt); 22 $stmt->execute(); 23 24}
mysql
1mysql> select * from news; 2+----+----------+----------------------------------+ 3| id | name | body | 4+----+----------+----------------------------------+ 5| 1 | name1 | サンプル1\r\nテキスト1 6 | 7| 2 | name2 | サンプル2\r\nテキスト2 | 8+----+----------+----------------------------------+ 92 rows in set (0.00 sec)
ちなみに、以下のように変数として書くと、\r\nが改行と認識されてmysqlで改行されてinsertされます。
php
1 $text = "name1,サンプル1\r\nテキスト1"; 2 3 $stmt = $pdo->prepare("INSERT INTO news (name, body) VALUE (:name, :body)"); 4 5 $stmt->bindValue(":name", $csv_array[0], PDO::PARAM_STR); 6 // $stmt->bindValue(":body", $csv_array[1], PDO::PARAM_STR); 7 $stmt->bindValue(":body", $text, PDO::PARAM_STR);
mysql
1mysql> select * from news; 2+----+----------+------------------------------------+ 3| id | name | body | 4+----+----------+------------------------------------+ 5| 1 | name1 | name1,サンプル1 6テキスト1 | 7| 2 | name2 | name1,サンプル1 8テキスト1 | 9+----+----------+------------------------------------+ 102 rows in set (0.00 sec) 11コード
解決法を教えていただけないでしょうか?
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/10 10:38
2020/12/10 10:50
2020/12/10 12:21