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

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

新規登録して質問してみよう
ただいま回答率
85.49%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

MySQL

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

PHP

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

Q&A

0回答

666閲覧

HerokuからMySQLを呼び出そうとするとSyntax error or access violation: 1142エラーが返ってしまう

faki75

総合スコア0

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

MySQL

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

PHP

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

0グッド

0クリップ

投稿2022/03/12 17:53

編集2022/03/12 17:59

Heroku, MySQL8.0(clearDB)を使用しています。

以下のサイトを参考に、LINEのボット作成を行っております。
https://note.com/rik114/n/n35ce002d2c6e
手順通り、webhook.phpでHerokuからclearDBに接続してテーブルを取得し、変数resに取得内容を格納したあとLINE Messaging APIに返す操作を想定しております。
dbConnect関数でDBに接続するところまでは成功しましたが、以下の文を実行しようとするとエラーになります。
area_chibaというテーブルは作成済みです。

sql = $dbh->prepare("SELECT * FROM sakila.area_chiba"); $sql->execute();

エラー内容は以下の通りです。

PHP Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1142 SELECT command denied to user '<ユーザ名>'@'ip-<アドレス名>.ec2.internal' for table 'area_chiba' in E:\Downloads\folder\webhook.php:25 Stack trace: #0 E:\Downloads\folder\webhook.php(25): PDOStatement->execute() #1 {main} thrown in E:\Downloads\folder\webhook.php on line 25 Fatal error: Uncaught PDOEx1ception: SQLSTATE[42000]: Syntax error or access violation: 1142 SELECT command denied to user '<ユーザ名>'@'ip-<アドレス名>.ec2.internal' for table 'area_chiba' in E:\Downloads\folder\webhook.php:25 Stack trace: #0 E:\Downloads\folder\webhook.php(25): PDOStatement->execute() #1 {main} thrown in E:\Downloads\folder\webhook.php on line 25

webhook.phpをVSCodeのデバッグで実行した際の結果であるため、実際の環境でも同じことが起こっているかは分かりません。
(ただしHerokuにコミットした場合ボットは正常に動作せず、LINE上にてメッセージを送信しても何も返ってきません)
上記のSELECT文と全く同じ文でMySQL Workbenchやコマンドラインから実行した際は問題なく取得されるため、恐らくHerokuから呼び出す際に権限が無いのではないか?と考えましたが、権限の付与の仕方が分かりません。
正常に動作させ、DBから取得した内容をLINE Messaging APIに返すにはどうすべきかご教示いただきたいです。

ちなみに以下の文で権限付与を試みておりますが、エラーの解消には至りませんでした。

GRANT SELECT ON sakila.* to '<ユーザ名>'@'localhost';

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

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

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

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

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

hoshi-takanori

2022/03/12 22:27

sakila.area_chiba ってことは sakila がデータベース名で area_chiba がテーブル名だと思いますが、heroku ではデータベースは一つしか与えられないし、名前も heroku (というか ClearDB) が勝手に決めるので、テーブル名だけ指定すればいいはず。また、たぶん root 権限も与えられないので、権限付与も無理では…。
faki75

2022/03/13 18:05

ご回答ありがとうございます。 salilaを外してVSCode上でデバッグすると、以下のエラーとなります。 PHP Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table '<DB名>' doesn't exist in E:\Downloads\folder\webhook.php:25 またコミットして確かめた際も、メッセージは返信されませんでした。 権限付与以外で不備があるのでしょうか?
hoshi-takanori

2022/03/13 22:28

状況がよく分かりませんが、ローカル環境でもエラーになるってことは、接続の際にデータベース名を指定してないってことでしょうか?
faki75

2022/03/14 19:39

接続の際にはDB名としてheroku_96535d25b1f****(付与されたDB名)を指定しています。 dbConnect関数を呼び出すところではエラーになっていないため接続自体は問題なく、接続後にテーブルに対してSELECTを行った際に、表が参照できずエラーになっているという認識です。 すべてVSCodeでデバッグを行った結果出力されたエラーですが(ここの前提が間違っていたらご指摘ください)dbConnect()を行った後、 sql = $dbh->prepare("SELECT * FROM sakila.area_chiba");とした場合 →Syntax error or access violation: 1142 sql = $dbh->prepare("SELECT * FROM area_chiba");とした場合 →Base table or view not found: 1146 sql = $dbh->prepare("select user(), current_user();");とした場合 →エラーは出力されず、user名がLINEMessagingAPIに受け渡される(LINE上でもメッセージが返信される。正しい動作) 上記の通り、テーブルを参照しないSELECT文の場合はエラーが出ないので、恐らく参照時に何らかの原因で引っかかっていると考えていますが原因が特定できておりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問