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

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

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

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

2回答

2671閲覧

ロリポップサーバーでのMySQL接続エラー

THerb05

総合スコア1

MySQL

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

0クリップ

投稿2021/07/07 02:02

編集2021/07/07 02:45

前提・実現したいこと

ロリポップのMySQLでPOSTされたデータを保存したいです。
現在、PHPでお問合せフォームを作っています。MANPを使ってローカルサーバーで行った際はMySQL接続はできました。

しかし、ロリポップサーバーのMySQLに接続する際に、接続できませんでした。以下にコードを記載致しました。その下にコード全体を記載しました。

try{ $contact = $_POST['お問い合わせ内容']; $name = $_POST['氏名']; $email = $_POST['メールアドレス']; $tel = $_POST['電話番号']; $message = $_POST['メッセージ']; $contact = h($_POST['お問い合わせ内容']); $name = h($_POST['氏名']); $email = h($_POST['メールアドレス']); $tel = h($_POST['電話番号']); $message = h($_POST['メッセージ']); $dsn = 'mysql:dbname=LA******;host=mysql***************;charset=utf8'; $user = 'LA******'; $password = '***************'; print('done'); $dbh = new PDO($dsn,$user,$password); print('done'); //ここまでは処理が行われていました。 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = 'INSERT INTO `LA**********`.`*********`(`id`, `お問い合わせ内容`, `氏名`, `メールアドレス`, `電話番号`, `メッセージ`, `created_at`)VALUES(NULL,?,?,?,?,?,NULL)'; $stmt = $dbh->prepare($sql); $data[] = $contact; $data[] = $name; $data[] = $email; $data[] = $tel; $data[] = $message; $stmt->execute($data); $dbh = null; echo 'データを追加しました'; } catch (Exception $e) { echo 'ただいま障害により大変ご迷惑をおかけしております。'; exit(); }

エラーメッセージ

object(PDOException)#3 (8) { ["message":protected]=> string(113) "SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known" ["string":"Exception":private]=> string(0) "" ["code":protected]=> int(2002) ["file":protected]=> string(64) "/Applications/MAMP/htdocs/********/public/confirm.php" ["line":protected]=> int(44) ["trace":"Exception":private]=> array(1) { [0]=> array(6) { ["file"]=> string(64) "/Applications/MAMP/htdocs/**********/public/confirm.php" ["line"]=> int(44) ["function"]=> string(11) "__construct" ["class"]=> string(3) "PDO" ["type"]=> string(2) "->" ["args"]=> array(3) { [0]=> string(61) "mysql:host=mysql*****************;dbname=LA************" [1]=> string(24) "LA**********" [2]=> string(12) "************" } } } ["previous":"Exception":private]=> object(PDOException)#2 (9) { ["message":protected]=> string(110) "PDO::__construct(): php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known" ["string":"Exception":private]=> string(0) "" ["code":protected]=> int(0) ["file":protected]=> string(64) "/Applications/MAMP/htdocs/********/public/confirm.php" ["line":protected]=> int(44) ["trace":"Exception":private]=> array(1) { [0]=> array(6) { ["file"]=> string(64) "/Applications/MAMP/htdocs/**********/public/confirm.php" ["line"]=> int(44) ["function"]=> string(11) "__construct" ["class"]=> string(3) "PDO" ["type"]=> string(2) "->" ["args"]=> array(3) { [0]=> string(61) "mysql:host=mysql***************;dbname=LA*************" [1]=> string(24) "LA*************" [2]=> string(12) "***************" } } } ["previous":"Exception":private]=> NULL ["errorInfo"]=> NULL ["severity"]=> int(2) } ["errorInfo"]=> array(3) { [0]=> string(5) "HY000" [1]=> int(2002) [2]=> string(90) "php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known" } }
donedoneただいま障害により大変ご迷惑をおかけしております。 object(PDOException)#3 (8) { ["message":protected]=> string(81) "SQLSTATE[42S22]: Column not found: 1054 Unknown column '$contact' in 'field list'" ["string":"Exception":private]=> string(0) "" ["code":protected]=> string(5) "42S22" ["file":protected]=> string(53) "*******************************" ["line":protected]=> int(49) ["trace":"Exception":private]=> array(1) { [0]=> array(6) { ["file"]=> string(53) "**************************" ["line"]=> int(49) ["function"]=> string(5) "query" ["class"]=> string(3) "PDO" ["type"]=> string(2) "->" ["args"]=> array(1) { [0]=> string(220) "INSERT INTO `LA****************`.`***************`(`id`, `お問い合わせ内容`, `氏名`, `メールアドレス`, `電話番号`, `メッセージ`, `created_at`)VALUES(NULL,$contact,$name,$email,$tel,$message,NULL)" } } } ["previous":"Exception":private]=> NULL ["errorInfo"]=> array(3) { [0]=> string(5) "42S22" [1]=> int(1054) [2]=> string(41) "Unknown column '$contact' in 'field list'" } }

index.phpのフォームからaction="POST", method="confirm.phpで上記のコードファイルに移り、MySQLにデータが保存されるようにしたいのですが、catchの処理が行われてしまいます。

AbeTakashiさんにご指摘いただいたように、var_dump($e);にてエラーメッセージを表示させることができました。
AbeTakashiさんにご指摘いただいたように、ローカルサーバーでの実行ではなくロリポップサーバーで実行したところ、?,?,?,?,?,NULL)の部分に文法ミスがあるとエラーメッセージが出たため、?の部分を$contactなどで代用しました。その結果、上記のエラーメッセージになりました。

ソースコード全体

<?php ini_set( 'display_errors', 1 ); ini_set('error_reporting', E_ALL); session_start(); header('X-FRAME-OPTIONS: SAMEORIGIN'); function h($str) { return htmlspecialchars($str, ENT_QUOTES, "UTF-8"); } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" /> <title></title> </head> <body> <?php try{ $contact = $_POST['お問い合わせ内容']; $name = $_POST['氏名']; $email = $_POST['メールアドレス']; $tel = $_POST['電話番号']; $message = $_POST['メッセージ']; $contact = h($_POST['お問い合わせ内容']); $name = h($_POST['氏名']); $email = h($_POST['メールアドレス']); $tel = h($_POST['電話番号']); $message = h($_POST['メッセージ']); $dsn = 'mysql:dbname=LA******;host=mysql153.phy.lolipop.lan'; $user = 'LA******'; $password = '***************'; print('done'); $dbh = new PDO($dsn,$user,$password); print('done'); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = 'INSERT INTO `LA**********`.`*********`(`id`, `お問い合わせ内容`, `氏名`, `メールアドレス`, `電話番号`, `メッセージ`, `created_at`)VALUES(NULL,?,?,?,?,?,NULL)'; $stmt = $dbh->prepare($sql); $data[] = $contact; $data[] = $name; $data[] = $email; $data[] = $tel; $data[] = $message; $stmt->execute($data); $dbh = null; echo 'データを追加しました'; } catch (Exception $e) { echo 'ただいま障害により大変ご迷惑をおかけしております。'; exit(); } ?> </body>

試したこと

途中にpriint('done');を設置し、$dbh = new PDO($dsn,$user,$password);までは処理が実行されていることを確認しました。
charset=utf8と付け足したりなくしたりしましたが変化なし
パスワード等の記入違いがない確認を何度もしましたが変化なし
ユーザー名の後ろにあった@*..**.***という数字も含めたりしましたが変化なし

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

ロリポップのMySQLサーバーは5.6.23-log - MySQL Community

Webサーバーは
-Apache
-データベースクライアントのバージョン: libmysql - 5.1.73
-PHP 拡張: mysqli

phpMyAdminのバージョンは4.0.10.18です。

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

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

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

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

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

AbeTakashi

2021/07/07 02:15

エラーメッセージが出て来ず、とありますが、$eの中にエラーメッセージがあるはずなので、 echo 'ただいま障害により大変ご迷惑をおかけしております。'; の手前で$eをvar_dumpとかで表示させてみてはどうでしょう。この手の不具合はエラーメッセージをみないと誰にも分かりません。
THerb05

2021/07/07 02:24

教えていただきありがとうございます。var_dumpによりエラーメッセージ追加・修正完了しました!
guest

回答2

0

例外の中で見るべきメッセージは
string(90) "php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known"
です。

PHP

1$dsn = 'mysql:dbname=LA******;host=mysql***************;charset=utf8';

で指定しているhost=mysql***************;の指定が誤っているのだと思われます。
ホスト名はロリポップの管理画面で確認出来るはずです。
https://webkaru.net/rental-server/lolipop-add-mysql-db/(公式のヘルプでは無いので最新では無い可能性もありますが)で言うところの、「データベースホスト」に表示されている内容をmysql***************にそのままコピーしてみて下さい。

投稿2021/07/07 02:42

tanat

総合スコア18713

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

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

THerb05

2021/07/07 02:49

教えていただきありがとうございます! そうですよね。。Abe様にもご指摘いただき、MANPではなくロリポップサーバーで実行したところ接続はできました!エラーメッセージ追記したのでもしよければまた教えていただけると幸いです。。
tanat

2021/07/07 04:59

接続エラーは解消しているので、この質問は解決にして別の質問を立てた方が回答が得られるかと思いますよ。 発生したエラーを全部同じ質問で解決するのは無理がありますし、修正後のソースが示されていないので回答者は想像するしか無くなります。 そのため、この質問でのコメントは最後にしようと思いますが、 現在発生しているエラーは > `SQL文の,?,?,?,?,?,NULL)の部分がsyntaxエラーとのことで?部分を$contact等で代用しましたところ` でよくわからないままソースを書き換えた部分が原因なので 1. 一度固定値で正しいSQLを作成してテストする(phpMyAdminやMySQLクライアントからでも良いですし、pdo->query()で実行しても良いです) 2. 正しいSQLである事を確認出来たら変数部分を?か:パラメータ名に置き換える 3. https://www.php.net/manual/ja/pdostatement.execute.php を参考にして固定値で引数を与えて実行してみる 4. 3が成功したら引数を変数に変更してみる という流れで、1ステップずつ進めてみて下さい。
guest

0

"SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known"

ですから、ホストの設定や名前解決でエラーが発生しているということだとおもいます。$dsnが正しくない可能性がかなり高いです。ロリポップのサイトに記載されている設定方法や契約内容を再度確認されるといいと思います。

あと、ロリポップのデータベースは接続するサーバが限定されているはずです。もし、それ以外のサーバから接続しようとしているのであればこのエラーが出ている可能性はあります。契約が別のサーバからの接続は無理ですし、当然ですが、ローカルからも普通には接続できません。

参考)
https://blog.katty.in/9897

投稿2021/07/07 02:40

AbeTakashi

総合スコア4537

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

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

THerb05

2021/07/07 02:48

先ほどはありがとうございました。ロリポップサーバーで実行したところ接続はうまくいきました。 ロリポップサーバーで実行したところ、SQL文の,?,?,?,?,?,NULL)の部分がsyntaxエラーとのことで?部分を$contact等で代用しましたところ、追記部分のエラーメッセージが出ました。何度も何度も申し訳ございません。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問