前提・実現したいこと
ロリポップの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です。