csv-put.csvファイルをデータベース(MySQ)に

2020年5月30日

現在30日分の安い宿一覧表示について、

1.ローカルのxampp上で楽天APIのデータをcsvファイルとしてハードディスクに保存2.coreserver上のMySQLにアクセスし、テーブルyasuiyadoを選択し先ほどエクスポートしたcsvファイルをインポートする。
フォーマット特有のオプションUpdate data when duplicate keys found on import (add ON DUPLICATE KEY UPDATE)にチェックを入れてインポート)

という作業について、1の部分はPHPで自動でやっているのですが、2の部分は手動でやっているのです。
2の部分もPHPで自動で動作できれば、凄く楽になります。
なんとかならないか調べてみました。

xampp上のPHPからxampp上にあるcsvファイルをcoreserver上にアップロードする事は、なんとかできました。
あとはアップロードしたcsv-put.csvの内容を、サーバーのデータベース(MySQ)に登録することに成功すれば、データベースの自動更新が完成します。

2020年6月7日

結構、苦戦しています。
PHPはバージョンによって仕様が変わるので、過去の情報が役に立たない場合が多いのです。
参考書も、現在のPHPのバージョンにものでないと正常に動作しないし、ネットの情報も、ほとんど役立ちません。

coreserverのデータベースに接続するのは、データベース名がkimassi_yado、ユーザー名がkimassi_yadoなので

<?php
try {
$dsn=’mysql:host=127.0.0.1;dbname=kimassi_yado’;
$db = new PDO($dsn, ‘kimassi_yado’, ‘パスワード’);
} catch (PDOException $e) {
echo ‘DB接続エラー: ‘ . $e->getMessage();
}
?>

csv-put2.csvを開いてデータを配列に変換するのは

<?php
$row = 1;
// ファイルが存在しているかチェックする
if (($handle = fopen(“csv-put2.csv”, “r”)) !== FALSE) {
// 1行ずつfgetcsv()関数を使って読み込む
while (($data = fgetcsv($handle))) {
$row++;

//ここに処理の内容を記入
}
}
fclose($handle);
?>

でできます。テーブルのカラムはid,no,date,check,hotelNo,yadomeiで、配列は

idの内容が$data[0]
noの内容が$data[1]
dateの内容が$data[2]
checkの内容が$data[3]
hotelNoの内容が$data[4]
yadomeiの内容が$data[5]
ryoukinの内容が$data[6]

であることは確認できています。それをデータベースに登録保存するところがうまくいきません。
テーブル名がyasuiyadoなので

$sql =’INSERT INTO yasuiyado (no,date,check,hotelNo,yadomei,ryoukin) VALUES (“$data[1]”,”$data[2]”,”$data[3]”,”$data[4]”,”$data[5]”,”$data[6]”) ‘;
$stmt = $pdo->prepare($sql);
$stmt->execute();

上記で正常に動作するはずなんですが、一行も保存されません。

$sql =”UPDATE yasuiyado SET no=$date[1],date=$date[2],check=$date[3],hotelNo=$date[4],yadomei=$date[5],ryoukin=$date[6]) WHERE id=$date[0]”;

でも一行も保存されません。

2020年6月8日

正常に動作しない原因は、coreserverのデータベースにデータを保存する場合の$sql の構文の問題のようです。

$sql =”INSERT INTO `yasuiyado` (`id`, `no`, `date`, `check`, `hotelNo`, `yadomei`, `ryoukin`) VALUES (‘$data[0]’, ‘$data[1]’, ‘$data[2]’, ‘$data[3]’, ‘$data[4]’, ‘$data[5]’, ‘$data[6]’)”;
$stmt = $db->prepare($sql);
$stmt->execute();

で動作するようになりました。” と ` と ‘ の使い分けが重要のようです。
ちなみにsqlの書式はサーバーによって違うようです。
$sqlは、実際に手動でデータを1件登録してみて、その時のsqlを表示させて調べることができました。

<?php
try {
$dsn=’mysql:host=127.0.0.1;dbname=kimassi_yado’;
$db = new PDO($dsn, ‘kimassi_yado’, ‘パスワード’);
} catch (PDOException $e) {
echo ‘DB接続エラー: ‘ . $e->getMessage();
}
?>
<?php
$row = 1;
// ファイルが存在しているかチェックする
if (($handle = fopen(“csv-put2.csv”, “r”)) !== FALSE) {
// 1行ずつfgetcsv()関数を使って読み込む
while (($data = fgetcsv($handle))) {
$row++;

$sql =”INSERT INTO `yasuiyado` (`id`, `no`, `date`, `check`, `hotelNo`, `yadomei`, `ryoukin`) VALUES (‘$data[0]’, ‘$data[1]’, ‘$data[2]’, ‘$data[3]’, ‘$data[4]’, ‘$data[5]’, ‘$data[6]’)”;
$stmt = $db->prepare($sql);
$stmt->execute();
}
}fclose($handle);
?>

全部まとめて動作させたら、思った通りにいかなくて一瞬焦りましたが、PHPファイルをUnicode(UTF-8)で保存するのを忘れていました。思わぬところで落とし穴があるものです。
ファイルに日本語が入っていないと、エディターで読み込むときにシフトJISで読み込みます。その状態で編集して保存すると、シフトJISで保存されてエラーになってしまうのです。
どこかに日本語を入れておいてUnicode(UTF-8)で保存すれば次回からは自動でUnicode(UTF-8)になるので便利です。

そういう訳で無事、自動化が出来ました。
パソコンは、この処理専用のマシンにしたので、パソコンの電源を入れるだけで自動にデータベースのデータを更新できるようになりました。

2020年6月14日

更新が正常に行われていない事に気づきました。
やっぱり更新はINSERT INTOでは駄目なようです。最初からINSERT INTOで動作するのが不思議だったのです。
UPDATEが正しいのだと思います。3つだけ更新する場合のUPDATEのsqlは

UPDATE `yasuiyado` SET `hotelNo` = ‘1607242’, `yadomei` = ‘Blue Hour Kanazawa2’, `ryoukin` = ‘2400’ WHERE `yasuiyado`.`id` = 1

でした。ちなみにsqlの書式はサーバーによって違うようです。

$sql =”UPDATE `yasuiyado` SET `date` = ‘$data[2]’,`check` = ‘$data[3]’, `hotelNo` = ‘$data[4]’,`yadomei` = ‘$data[5]’, `ryoukin` = ‘$data[6]’ WHERE `yasuiyado`.`id` = $data[0]” ;

で正常に動作しました。

コメントを残す

メールアドレスが公開されることはありません。