🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

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

phpMyAdmin

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Q&A

解決済

2回答

958閲覧

phpログイン機能ページでログインすると拒否される。

chazukeo

総合スコア15

MySQL

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

phpMyAdmin

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

0グッド

0クリップ

投稿2019/11/21 10:28

以前、こちらを参考にPHPのログインページを作り、活用していたのですが、レンタルサーバーを変えてログインしてみたところ、ログインできず、SQLSTATE[HY000] [1045] Access denied for user '〇〇'@'localhost' (using password: YES)が出てしまうようになってしまいました。サーバーはWebArena SuiteXです。以前のサーバーではこのコードで問題なく動作していたのですが、このサーバーでは拒否されてしまいます。ユーザー名やパスワードも新しいサーバーに合わせて何度も見直しましたがやはりできませんでした。
しかし、ログインせずにmysqlのデータを表示することはできています。サーバー付属のphpmyadminを使っていますが以前のサーバーより制限があるためどこを弄れば良いのかわかりません。何が原因でしょうか?

php

1<?php 2require 'password.php'; // password_verfy()はphp 5.5.0以降の関数のため、バージョンが古くて使えない場合に使用 3// セッション開始 4session_start(); 5 6$db['host'] = "***"; // DBサーバのURL 7$db['user'] = "***"; // ユーザー名 8$db['pass'] = "******"; // ユーザー名のパスワード 9$db['dbname'] = "testdb"; // データベース名 10 11// エラーメッセージの初期化 12$errorMessage = ""; 13 14// ログインボタンが押された場合 15if (isset($_POST["login"])) { 16 // 1. ユーザIDの入力チェック 17 if (empty($_POST["userid"])) { // emptyは値が空のとき 18 $errorMessage = 'IDが入力されていません。'; 19 } else if (empty($_POST["password"])) { 20 $errorMessage = 'パスワードが入力されていません。'; 21 } 22 23 if (!empty($_POST["userid"]) && !empty($_POST["password"])) { 24 // 入力したユーザIDを格納 25 $userid = $_POST["userid"]; 26 27 // 2. ユーザIDとパスワードが入力されていたら認証する 28 $dsn = sprintf('mysql: host=%s; dbname=%s; charset=utf8', $db['host'], $db['dbname']); 29 30 // 3. エラー処理 31 try { 32 $pdo = new PDO($dsn, $db['user'], $db['pass'], array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION)); 33 34 $stmt = $pdo->prepare('SELECT * FROM abcd WHERE id = ?'); 35 36 $stmt->execute(array($userid)); 37 38 $password = $_POST["password"]; 39 40 if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 41 if (password_verify($password, $row['password'])) { 42 session_regenerate_id(true); 43 44 // セッション関連 45 46 47 $_SESSION["NAME"] = $row['name']; 48 $_SESSION["ID"] = $row['id']; 49 50 51 //セッション追加 52 53 54 55 header("Location: test.php"); // メイン画面へ遷移 56 exit(); // 処理終了 57 } else { 58 // 認証失敗 59 $errorMessage = 'IDまたはパスワードに間違いがあります。'; 60 } 61 } else { 62 // 4. 認証成功なら、セッションIDを新規に発行する 63 // 該当データなし 64 $errorMessage = 'IDまたはパスワードに間違いがあります。'; 65 } 66 } catch (PDOException $e) { 67 $errorMessage = 'データベースエラー'; 68 //$errorMessage = $sql; 69 // $e->getMessage() でエラー内容を参照可能(デバック時のみ表示) 70 echo $e->getMessage(); 71 } 72 } 73} 74?>

↓こちらのコードで接続し、SELECTするとデータは表示されます。上記のログイン時と同じホスト名データベース名ユーザ名パスワードを使用しています。

php

1<?php 2$dsn = 'mysql:****;dbname=testdb;charset=utf8'; 3$user = '****'; 4$password = '********'; 5try { 6 $dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 7 8} catch (PDOException $e) { 9 10 echo 'データベースにアクセスできません!' . $e->getMessage(); 11 12 exit; 13 14} 15?>

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

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

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

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

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

guest

回答2

0

ベストアンサー

$dsn = sprintf('mysql: host=%s; dbname=%s; charset=utf8', $db['host'], $db['dbname']);
上記を下記に変えたらどうでしょうか。空白を削ってください。
$dsn = sprintf('mysql:host=%s;dbname=%s;charset=utf8', $db['host'], $db['dbname']);

PHPが悪いのか、MySQLが悪いのかよくわからないのですが、
バージョンか環境の違いなどで、空白があると接続できない場合があるようです。

私が確認したところ、Win10環境では空白があっても問題ありませんでしたが、
Linux環境では空白があったらエラーになりました。これも、Win10とLinuxの違いなのかどうかは判りません。

  • 空白があったらどんな環境でも動かない
  • 空白があってもどんな環境でも動く

のどちらかだったらいいのですが、動くときと動かない時があるというのは厄介ですね…。

サンプルを公開した人も自分の環境では動いたのでしょうから、その人が悪いわけではないのですが、動くときと動かない時があるコードがサンプルとして公開されているのは少し問題ですね。これは気付けなくても仕方がないと思います。

投稿2019/11/23 20:15

編集2019/11/24 08:10
miu_ras

総合スコア902

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

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

chazukeo

2019/11/25 08:23

回答ありがとうございます。 空白を削りましたところログインできました。 前のサーバーでは空白アリでも動くサーバーだったということなのですね。 本当にありがとうございました。非常に助かりました。
guest

0

DBサーバーの接続先が違うんじゃないでしょうか?
レンタルサーバーでlocalhostにDBを用意している事は通常無い事だと思いますが

投稿2019/11/21 10:33

hentaiman

総合スコア6426

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

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

chazukeo

2019/11/22 07:22

回答ありがとうございます。 自分もそう思っているのですが、ログインせずにデータを表示するだけならできるので合っている? それともログインページのコードに問題があるのでしょうか?それだとなぜ以前のサーバーでは問題なく動作していたのか謎です。
hentaiman

2019/11/22 08:53

そう思うならきっとこうだろうという予測で判断するのではなく怪しいカ所を修正してみましょう 謎については知りませんが、エラーメッセージを読めていないようなので質問内容と併せて予想できる回答をしているだけです まずは指摘箇所を確認修正してエラーを確認し直した上で分からない所があったら追加で質問文に書き加えてみてください
hentaiman

2019/11/22 08:59

それか進展したら新しく質問立てたら良いと思います
退会済みユーザー

退会済みユーザー

2019/11/23 23:43

@hentaimanさん VALUE SERVERはps -ef | grep mysqldで何か出てきちゃいますが…
hentaiman

2019/11/24 02:31

本当ですかwオールインワンのレンタルサーバーなんてあるんですねw そうなると尚更レンタルサーバーのDB接続情報をよく確認するしか方法無いですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問