質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Sequel Pro

Sequel Proは、Mac OS X向けMySQLフロントエンドです。GUIからのMySQLの操作・管理が可能になります。強力なクエリ編集、多彩なエンコーディングオプションのサポートなど多くの機能を備えています。

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

958閲覧

cityテーブルのカラムへインサートができない

Wingmacbook

総合スコア17

Sequel Pro

Sequel Proは、Mac OS X向けMySQLフロントエンドです。GUIからのMySQLの操作・管理が可能になります。強力なクエリ編集、多彩なエンコーディングオプションのサポートなど多くの機能を備えています。

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2022/01/20 14:36

編集2022/02/11 07:47

前提・実現したいこと

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カラムが入らずで止まっています。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AbeTakashi

2022/01/20 16:25

「インサートができない」ということですが、具体的にどういうエラーメッセージもしくはエラーログがでているのでしょうか? もしくはエラーすらでてないという状況でしょうか? あと、ソースコードについては画像を貼り付けるのではなく、コードを表示する機能がありますのでこちらを利用する方がいいです。この画像ではちっちゃくて文字が見えません。 参考) https://teratail.com/help/question-tips 「ソースコードを書きましょう」の部分を読んで対応してみてください。
AbeTakashi

2022/01/29 06:44

前も書きましたが、インサートができないという状況は第三者には分かりにくいです。たとえばSQLの構文が間違っている場合などは、それを実行すると必ずエラーメッセージやエラーログなどが出力されます。そこに原因が書いてある場合がほとんどで、これを見て修正することが一番の近道です(ここで聞くより断然早い)。これらが表示されない、もしくは出力されないなら、まずはそこを対応した方がいいです。その対応方法は開発環境によりけりですので、ご自分の環境に合わせて調べてみてください。そのエラーメッセージやエラーログの内容が質問文にあれば、回答者もより具体的なアドバイスができます。
Wingmacbook

2022/01/30 07:09

ご指摘ありがとうございます。 SQL構文をDBのクエリで試し、追記の説明に加えてみました。 まだ不勉強なところがあるため、 他に検証が必要と考えられることがありましたらお教えいただきたいです。
AbeTakashi

2022/01/30 11:06

追記見ましたが、Sequel Proのクエリ上ででPHPコードを実行していますか? ここで実行できるのは純粋なSQL文だけです。PHPの命令は解釈できませんので、そのエラーメッセージは意味がないです。 エラーメッセージやエラーログはPHPが実行されている環境上で出てるはずです。ApacheでPHPを動かしているなら、Apacheのエラーログを見てください。Apacheのエラーログの場所はApacheの設定ファイルに書かれています(PHPが動いている環境が質問文内にありませんので、具体的なアドバイスができません)。
guest

回答2

0

MySQLですよね?とりあえずカラム名やテーブル名はバッククォートで囲む

SQL

1INSERT INTO city('name', 'citycode') 2↓↓↓ 3INSERT INTO city(`name`,`citycode`)

投稿2022/01/21 00:56

yambejp

総合スコア117674

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

解決しました!

$sql = "INSERT INTO city(name,citycode) VALUES ('$name','$citycode')";

上のように、カラム名の「name」「citycode」に''(シングルクウォート)をつけずに処理を行うとDBにうまくインサートされました。
追記でsequel proのクエリでSQL文が正しくないとあったので、おそらくINSERT文「name」がカラムと認識されていなかった?のではないかと思います。

助言や回答くださった方、ありがとうございました!

投稿2022/02/24 14:18

Wingmacbook

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問