前提・実現したいこと
PHPコードを用いて、sample. jsonにあるcitycode,city(下画像赤枠)をcityテーブルのカラムcitycode,cityへそれぞれインサートで入れたい。しかし、必要コードを書いたのちDB側cityテーブルで「データベースを再読み込み」を実行してもカラムに何も表示されない。
下は、矢印部分がcityレコードへのインサートが関わるコード
// JSONを持ってくる $filename = "sample.json"; $file = file_get_contents($filename); $prevention = mb_convert_encoding($file, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN'); $json = json_decode($prevention, true); //PHPからMySQLへ接続 //DB接続 $user = 'user'; $pass = 'pass'; $db = 'mzn'; $host = 'mzn_db'; try { // MySQLへの接続 $dbh = new PDO(sprintf('mysql:dbname=%s;host=%s;charset=utf8', $db, $host), $user, $pass); // 3. 地方ごとの県を表示 foreach($json as $key => $val){ //sample.jsonで"01"へ foreach($json[0] as $val => $value){ //sample.jsonで"01"の下へ // ↓cityテーブルへのINSERTが関わるコード↓ foreach($value as $city["city"] => $cities){ //sample.jsonで"01"へ $name = $cities["city"];//"01~" の"city"以下"name": "city"を代入 $citycode = $cities["citycode"];//"01" "city"以下: "citycode"を代入 $sql = "INSERT INTO city(`name`,`citycode`) VALUES ('$name', '$citycode')"; //$name $citycodeをDBのcityテーブル内のカラムname, citycodeへインサート $stmt = $dbh->prepare($sql); $stmt->execute(); // ↑cityテーブルへのINSERTが関わるコード ↑ }; }; }; } catch (PDOException $e) { print "エラー:" . $e->getMessage() . "<br/gt;"; $dbh = null; };
試したこと
周りに聞いたところ、構文ミスが原因という指摘を受け、
$sql = "INSERT INTO city('name', 'citycode') VALUES ('$name', '$citycode')";
の箇所のミスかと思い、バッククォートの有無や閉じタグミスを疑った。
そのほかに、過去のインサートに関する質問を投げた際にいただいた情報で
$sql = "INSERT INTO city('name', 'citycode') VALUES (?,?)"; //$name $citycodeをDBのcityテーブル内のカラムname, citycodeへインサート $stmt = $dbh->prepare($sql);//$sqlをprepareへ渡し $stmt->execute([$name, $citycode]);//executeへ渡し、$stmtを保存
というように$name, $citycodeをexecuteへ渡すことも試した。
どなたかご教授、よろしくお願いいたします。
追記
1,
foreach($value as $city["city"] => $cities){ //sample.jsonで"01"へ $name = $cities["city"];//"01~" の"city"以下"name": "city"を代入 $citycode = $cities["citycode"];//"01" "city"以下: "citycode"を代入 $sql = "INSERT INTO city(`name`,`citycode`) VALUES ('$name', '$citycode')"; //$name $citycodeをDBのcityテーブル内のカラムname, citycodeへインサート };
のforeachのkeyとなる$city["city"]と$nameに入れた$cities["city"]が判別しづらいことが原因と思い、
foreach($value["city"] as $value2 => $city_info){ //sample.jsonで"01"へ $name = $city_info["city"]; $citycode = $city_info["citycode"]; $sql = "INSERT INTO city(`name`,`citycode`) VALUES (`$name`, `$citycode`)"; //$name $citycodeをDBのcityテーブル内のカラムname, citycodeへインサート
$value2 と$city_info["city"]に書き換えました。
2,
1,を行いvar_dumpを行ったところ、$stmt->execute()まで処理がブラウザに出たので、途中にあるINSERT INTO city~ の部分も間違いなく動いている。となると、
$sql = "INSERT INTO city(`name`,`citycode`) VALUES (`$name`, `$citycode`)";
の書き方が何かおかしい、またはsequel pro(DB)のテーブル構造の設定がおかしい?(しかし、テーブルを作成してから特に変更はしていない)まで推察できた。
3,
Sequel pro 内のクエリでforeach以下を実行してみました。
すると、各行ごとに以下のエラーが返ってきました。
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ・・・
調べてみるとSQLの文法に誤りがあるということでした。
ここでSQL文を使う箇所は
$sql = "INSERT INTO city(`name`,`citycode`) VALUES (`$name`, `$citycode`)";
やはり追記2,と同じここなのかと行き着くのですが、「INSERT INTO」のスペルや文字の大小、スペースも同じ、()内も「(name
,citycode
)」「 ($name
, $citycode
)」とバッククォートで囲うなど、他に考えられることが見つかりませんでした。
4,
返信でApacheのエラーログを見るようにとご指摘いただき、
apatcheの階層でMySQLに入りINSERTコマンドを実行しました。
特にエラーが返ってくることはなく実行できたのですが、テーブルに何も入りません。
ただ、ターミナルコマンドであれば動くのでDB側に要因はないということまでわかりました。
5,
4,の追記の結果からINSERT文の階層を怪しんだため、
$sql = "INSERT INTO city(`name`) VALUES ($name)"; $sql = "INSERT INTO city(`citycode`) VALUES ($citycode)";
というように$nameと$citycodeで分けて実行してみたところ、citycodeのみ実行できました。
しかし、nameカラムが入らずで止まっています。

回答2件
あなたの回答
tips
プレビュー