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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

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

PHP

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

Q&A

解決済

1回答

635閲覧

MySQLでインサートができません。SQLSTATE[42S02]

tetejiro

総合スコア15

MySQL

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

PHP

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

0グッド

0クリップ

投稿2023/02/14 16:28

編集2023/02/15 10:58

実現したいこと

MySQLで、questionテーブルへレコードをインサートしたいです。

前提

MySQL

1CREATE TABLE IF NOT EXISTS `question` ( 2 `code` int(11) NOT NULL AUTO_INCREMENT, 3 `nitizi` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 4 `whose` int(4) NOT NULL COMMENT 'memberテーブルのcodeカラム', 5 `whom` int(4) NOT NULL COMMENT '誰への質問か', 6 `situation` varchar(500) NOT NULL, 7 `goal` varchar(500) DEFAULT NULL, 8 `what` varchar(500) DEFAULT NULL, 9 `why` varchar(500) DEFAULT NULL, 10 `try0` varchar(500) DEFAULT NULL, 11 `return1` varchar(2) DEFAULT NULL, 12 PRIMARY KEY (`code`) 13) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=109 ;

発生している問題・エラーメッセージ

エラーメッセージ SQLSTATE[42S02]: Base table or view not found: 1146 Table 'portfolio.latest' doesn't exist" ["string":"Exception":private]=> string(0) "" ["code":protected]=> string(5) "42S02" ["file":protected]=> string(57) "C:\xampp\htdocs\portfolio_作業用\new-db\new-select.php" ["line":protected]=> int(20) ["trace":"Exception":private]=> array(2) { [0]=> array(6) { ["file"]=> string(57) "C:\xampp\htdocs\portfolio_作業用\new-db\new-select.php" ["line"]=> int(20) ["function"]=> string(7) "execute" ["class"]=> string(12) "PDOStatement" ["type"]=> string(2) "->" ["args"]=> array(0) { } } [1]=> array(6) { ["file"]=> string(54) "C:\xampp\htdocs\portfolio_作業用\shitumon\hozon.php" ["line"]=> int(76) ["function"]=> string(7) "dbQuery" ["class"]=> string(7) "DbQuery" ["type"]=> string(2) "->" ["args"]=> array(1) { [0]=> string(230) " INSERT INTO question (whose, whom, situation, goal, what, why, try0, return1) VALUES (112,110,'件名','','詳細','','その他','必要') " } } } ["previous":"Exception":private]=> NULL ["errorInfo"]=> array(3) { [0]=> string(5) "42S02" [1]=> int(1146) [2]=> string(38) "Table 'portfolio.latest' doesn't exist" } }

'portfolio.latest' doesn't exist" に関して latest を指定していないのに、インサートするテーブルに指定されていることになっているようです。理由が分かりません。

該当のソースコード

ソースコード①:クエリ部分(new-select.php)
function dbQuery($query) { $ConstDb = new ConstDb(); $dsn = ConstDb::dsn; $user = ConstDb::user; $password = ConstDb::password; try { $dbh = $ConstDb->ConnectDb($dsn, $user, $password); $stmt = $dbh->prepare($query); $stmt->execute(); $rec = $stmt->fetchAll(PDO::FETCH_ASSOC); $dbh = null; ⇒$recをreturn

上記の $query を出力した結果は、例えば以下のようになります。
INSERT INTO question (whose, whom, situation, goal, what, why, try0, return1) VALUES (112,110,'件名','','詳細','','その他','必要')

ソースコード②:クエリ文字列を①に渡す部分
require_once '../new-db/new-select.php'; $DBQuery = new DBQuery(); $DBQuery->dbQuery(' INSERT INTO question (whose, whom, situation, goal, what, why, try0, return1) VALUES ('.$honnin.','.$code.',\''.$situation.'\',\''.$goal.'\',\''.$what.'\',\''.$why.'\',\''.$try.'\',\''.$return1.'\') ');

試したこと

  • select 文を代わりに実行して出力してみました。その際は想定動作(すべてのレコードが問題なく出力された)となりました。
  • XAMPP自体の再インストールを実施しました。エラー内容に変化はありませんでした。
  • 入れようとしている変数の値をベタ打ち(固定値)でインサートを行ってみましたが、エラー内容に変化はありませんでした。
  • phpMyAdmin上で、実行しても同じエラーが出ます。(#1146 - 表 'portfolio.latest' は存在しません。)
  • latest での検索結果(対象:作業フォルダ丸ごと)は該当なしでした。

補足情報(FW/ツールのバージョンなど)

XAMPPは最新バージョンを使用しています。
※8.0.3

テーブル名が不適切なものがありますが、
このエラーを直してから修正したいと思っていますのでご容赦ください。

new-select.php全文

php

1<?php 2require_once 'new-const.php'; 3 4class DbQuery { 5 6 // FETCH_ASSOC 7 function dbQuery($query) { 8 $ConstDb = new ConstDb(); 9 $dsn = ConstDb::dsn; 10 $user = ConstDb::user; 11 $password = ConstDb::password; 12 13 try { 14 $dbh = $ConstDb->ConnectDb($dsn, $user, $password); 15 $stmt = $dbh->prepare($query); 16 $stmt->execute(); 17 $rec = $stmt->fetchAll(PDO::FETCH_ASSOC); 18 $dbh = null; 19 } catch (Exception $e) { 20 var_dump($e); 21 exit($query); 22 } 23 return $rec; 24 } 25 26 // fetch_group 27 function selectFetchAll($query) { 28 $ConstDb = new ConstDb(); 29 $dsn = ConstDb::dsn; 30 $user = ConstDb::user; 31 $password = ConstDb::password; 32 try { 33 $dbh = $ConstDb->ConnectDb($dsn, $user, $password); 34 $stmt = $dbh->prepare($query); 35 $stmt->execute(); 36 $rec = $stmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP); 37 $dbh = null; 38 } catch (Exception $e) { 39 var_dump($e); 40 exit($query); 41 } 42 return $rec; 43 } 44}
new-const.php

(DBの接続方法などは適切でないと思ったので、別ブランチにて修正してあります。)

php

1<?php 2//データベースの定数の定義 3class ConstDb 4{ 5 public const dsn = '----割愛'; 6 public const user = '----割愛'; 7 public const password = '----割愛'; 8 9 const task = 'task'; 10 const bytime1 = 'bytime1'; 11 const bytime2 = 'bytime2'; 12 const emotion = 'emotion'; 13 const time1 = 'time1'; 14 const time2 = 'time2'; 15 const attention = 'attention'; 16 const strong1 = 'strong1'; 17 const strong2 = 'strong2'; 18 const strong3 = 'strong3'; 19 20 function ConnectDb($dsn, $user, $password) 21 { 22 $dsn = self::dsn; 23 $user = self::user; 24 $password = self::password; 25 try { 26 $dbh = new PDO($dsn, $user, $password, [ 27 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 28 PDO::ATTR_EMULATE_PREPARES, false 29 ]); 30 } catch (Exception $e) { 31 var_dump($e); 32 exit('接続エラーです。<a href="../registration/index.php">もどる</a>'); 33 } 34 return $dbh; 35 } 36}

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

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

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

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

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

tanat

2023/02/15 05:57

new-select.php の全コードと、参照している教材があるのであればその出典を質問文に記載してください。
tetejiro

2023/02/15 07:27

お付き合いいただきありがとうございます。 >new-select.phpの全コード new-select.phpの全コードを追記いたしました。 >参照している教材があるのであれば 自分で作っているものでして、教材は使用していません。
tanat

2023/02/15 08:18

追記ありがとうございます。 new-const.php についても追記をお願いします。(new-const.phpの中でrequireしているファイルがあるのであればそれも) あとは、ファイル全体からlatestで検索してみて、引っかかったらそれを変更してみてエラーが変わるかを試してみて、結果の追記をお願いします。
tetejiro

2023/02/15 11:28 編集

> new-const.phpについても追記を こちら完了いたしました。 >ファイル全体からlatestで検索 「やってみたこと」にも記載しましたが、こちら該当箇所がありませんでした。 phpMyAdmin上でinsert 文を書いても同じエラーが出ているので、 何かより根底の部分で間違えているのでしょうか。 (DBの命令文は全て共通してここを使いますが、この箇所以外は想定通り動作しています。) ご助力いただいてありがとうございます。 よろしくお願いします。
tanat

2023/02/15 11:36

追記ありがとうございます。 > phpMyAdmin上でinsert 文を書いても同じエラーが出ているので、 > 何かより根底の部分で間違えているのでしょうか。 うーん、phpMyAdminでもだめというのは不思議というか、ソースコードは関係なさそうですね。 MySQLもXAMPP内のローカル環境であれば、dsnについては割愛せずに記載していただけると何かわかることが増えるかもしれません。 *もし、接続先のMySQLがレンタルサーバやSaaS等の自分が構築していないものであるのであれば、管理者にDB接続上の制限などを確認してみてください。 また、以下の結果についても追記いただけると何かわかるかもしれません。 1. phpMyAdminでINESRT文を書くのではなく、 phpMyAdminのGUIからデータを挿入して、その時に表示される実行したSQLがどんなものになるか確認して追記してみていただけますか? 参考 https://www.javadrive.jp/phpmyadmin/data/index5.html#:~:text=%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%80%81%E5%AF%BE%E8%B1%A1%E3%81%AE,%E3%82%92%E5%85%A5%E5%8A%9B%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82 2. コマンドプロンプトからMySQLにログインして、use データベース名; と INSERTの実行した場合の結果 参考 https://www.javadrive.jp/phpmyadmin/data/index5.html#:~:text=%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%80%81%E5%AF%BE%E8%B1%A1%E3%81%AE,%E3%82%92%E5%85%A5%E5%8A%9B%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82 https://qiita.com/Marny/items/eea9667066dbbaa900aa
tetejiro

2023/02/15 13:17 編集

select 文などは実施できているので、私も接続時点では問題がないのかなと思いました。 ①同じエラーとなりました。 #1146 - 表 'portfolio.latest' は存在しません。 (MyAdminの権限関係も再度見てみて、一度全ての権限を全ユーザに対して付与してみましたが、 エラー内容は変化ありませんでした。) ②すみませんが、MySQLをコマンドプロンプトで実行したことがないので 少し手間取っており、まだ時間がかかってしまいます。 終了次第結果を追記させてください。 MyAdminに関して、何か設定もれなどがあるのでしょうか、、 XAMPPをインストールしなおした際の手順は、以下です。 1.レンタルサーバに同じデータベースをあげていたので、そこからエクスポートしました。 2.エクスポートしたしたファイルをローカルのMyAdminへインポートしました。 3.コード上でDBに接続するためのユーザを作成しました。 (4.再実施の際に、全てのユーザに対してすべての権限を付与しました。)
tanat

2023/02/15 13:16

なるほど、もともとレンタルサーバのDBをエクスポートしているのですね。 (この欄は見ない人も多いので、そのあたりの情報も質問に追記されると回答が得られる可能性が高まります) であれば、レンタルサーバ特有のデータベース構造を一緒にエクスポートしてしまっている可能性があるのかなと思います。 切り分けとして、以下の最小限の構成を試してみてください。 1. XAMPPに新たなデータベースを手動で作る(phpMyAdminで作成) 2. 作ったデータベースで今回使用するテーブルのCREATE TABLE文のみを実行 3. phpMyAdminでデータを挿入してみる 4. 3が動くならPHPからデータ挿入をしてみる これで動作するようであれば、レンタルサーバーからエクスポートしたデータベース構造の問題と特定できるので、 データベースを丸ごとインポートするのではなく、 テーブル単位でインポートするか、新たに手動でテーブルを作成するのがいいと思います。 また、エクスポートしたSQLからlatestで検索してみて一致するところがあれば、そのあたりに原因があると思われますので、質問に追記をされるといいかと思います。
tetejiro

2023/02/15 15:52

ご指摘の通りでした。私一人では解決できませんでした。 本当にありがとうございます。 ご丁寧に回答いただけたので、大変心強かったです。 DBを作成しなおしたところ、無事インサートができました。
guest

回答1

0

ベストアンサー

dbQueryがPDOベースで処理しているなら、prepareで対応する内容です。
あとSQL文を全角のスペースでインデントしているようなのでやめてください

投稿2023/02/15 00:46

yambejp

総合スコア114779

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

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

tetejiro

2023/02/15 05:23

回答いただきありがとうございます。 >dbQueryがPDOベースで処理しているなら、prepareで対応する内容です。 こちらが指摘内容の意図が分かっておりません。 申し訳ありませんが、どういう意図かもう少し教えていただけませんでしょうか? >SQL文を全角のスペースでインデントしているようなのでやめてください すみません。コード上では半角スペースにしていたのですが、見た目が見づらいと思い 全角にしてしまっておりました。 不適切でしたので、半角に戻しました。 ご指摘ありがとうございました。
tetejiro

2023/02/15 15:56

コメントの方でのご指摘にてこちらの問題は解決させることができました。 サーバに上げているDBをエクスポートしたファイルを ローカルのMyAdminにインポートしていたことで 余計な情報がインポートされてしまったことで起きているエラーでした。 解決させるまでお付き合いしてくださり、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問