Connection failed: SQLSTATE[HY000] [1045]

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,155

yuus2733

score 109

Connection failed: SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password:

データベースへの接続自体ができていないようなので、
どうしたらいいのかがわかりません。
現在引っかかっているコードは下記のものです。
先ほど質問したコードでもデータベースのやり取りに問題があるようでしたので、こちらも含めて解決したいです、よろしくお願いします。

<?php
// error_reporting(E_ALL);
// ini_set('display_errors', 1);

require_once("function.php");
session_start();
header("Content-type: text/html; charset=utf-8");

$_SESSION["token"] = get_csrf_token();

$id = $_POST['id'];
$mail = $_POST["mail"];
$password = $_POST["password"];
$confirm_password = $_POST["confirm_password"];

if($password != $confirm_password){
     //pass不一致
     $_SESSION["error_status"] = 1;
     header("HTTP/1.1 301 Moved Permanently");
     header("Location: register.php");
     exit();
}
//IDcheck

//DB接続 ※
$dsn = 'mysql:host=localhost;dbname=portfolio;charset=utf8';
$user = 'root';
$password = '';
$dbh = new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

//プレースホルダでSQL作成 ※
$sql = "SELECT COUNT(*) AS CNT FROM USER WHERE ID = ?;";

//パラメータの型指定 ※
$stmt = $dbh->prepare($sql, array('text'));

//パラメータを渡してSQL実行
$rs = $stmt->execute(array($id));

// try{
//      $pdo = new PDO(
//        'mysql:host=localhost;dbname=portfolio;charset=utf8',
//        'root',
//        '';
//        [
//          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
//          PDO::ATTR_DEFAULT_FETCH_MODE => PDO:: FETCH_ASSOC,
//        ]
//      );
// }catch(PDOException $e){
//     header('Content-Type: text/plain; charset=UTF-8', true , 500);
//     exit($e->getMessage());
// }

try {
    $dbh = new PDO($dsn, $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

while ($row = $stmt->fetch()){
  $count = $row['CNT'];
}

$dbh = null;

//IDがすでに登録されていた場合

if($count != 0){
     $_SESSION['error_status'] = 2;
     header("HTTP/1.1 301 Moved Permanently");
     header("Location: register.php");
     exit();
}

//エラー情報リセット
$_SESSION['error_status'] = 0;

// print_r($_SESSION);
?>

<!DOCTYPE html>
<html lang="ja">
<head>
     <meta charset="UTF-8">
   </head>
   <form action="register_submit.php" method="post" >
     <table border="0">
   <tr>
   <td>ID</td>
   <td><?php echo htmlspecialchars($id , ENT_QUOTES , "UTF-8"); ?></td>

   <td>メールアドレス</td>
   <td><?php echo htmlspecialchars($mail , ENT_QUOTES , "UTF-8"); ?></td>
   </table>

   <input type="hidden" name="id" value="<?php echo htmlspecialchars($id , ENT_QUOTES , "UTF-8") ?>" >
   <input type="hidden" name="mail" value="<?php echo htmlspecialchars($mail , ENT_QUOTES , "UTF-8") ?>" >
   <input type="hidden" name="password" value="<?php echo htmlspecialchars($password , ENT_QUOTES , "UTF-8") ?>" >
   <input type="hidden" name="token" value="<?php echo htmlspecialchars($_SESSION['token'] , ENT_QUOTES , "UTF-8") ?>" >

   <input type="submit" value="登録">
   <input type="reset" value="リセット">
   <input type="button" value="戻る" onclick="history.back();">
   </form>
   </body>
   </html>
?>


function.php

<!DOCTYPE html>

<?php

define("DNS","mysql://user01:pass@localhost/posrtfolio?charset=utf8");
define("SERVER","192.168.11.11");
define("SENDER_EMAIL","root@localhost");
define("STRETCH_COUNT" , 1000);

/* CSRFトークン作成 */
function get_csrf_token(){
$TOKEN_LENGTH = 16;
$bytes = openssl_random_pseudo_bytes($TOKEN_LENGTH);
return bin2hex($bytes);
}

/* パスワードのソルト+ストレッチング */
function stretchedPassword($salt,$password){

$hash_pass="";

for($i = 0; $i<STRETCH_COUNT; $i++){
  $hash_pass = hash("sha256",($hash_pass . $salt . $password));
}
  return $hash_pass;
}

/* ソルト作成 */
function get_salt(){
  $TOKEN_LENGTH = 4;//4*2=8byte
  $bytes =  openssl_random_pseudo_bytes($TOKEN_LENGTH);
  return bin2hex($bytes);
}

/* URLの一時パスワード作成 */
function get_url_password(){
    $TOKEN_LENGTH = 16;//16*2=32byte
    $bytes = openssl_random_pseudo_bytes($TOKEN_LENGTH);
    return hash("sha256",$bytes);
}

?>


<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>

</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • s8_chu

    2017/08/12 15:38

    function.phpの内容を追記していただけませんか?

    キャンセル

  • yuus2733

    2017/08/12 15:58

    追記しました、遅くなり申し訳ございません。

    キャンセル

回答 1

checkベストアンサー

+1

とりあえず、下記のコードで検証してみましたが正常に接続出来ました。(dbname,user,pass全て'test'という名前の環境にしています。)

$dsn = 'mysql:host=localhost;dbname=test;charset=utf8';
$user = 'test';
$pass = 'test';
$dbh = new PDO($dsn,$user,$pass);

$userにrootが設定されていますが、パスワードも併せて設定されていませんか?
(提示されているエラーは、パスワードの誤りなどの接続情報の不具合によっても発生します。)

ご自身の環境を見直されてみては如何でしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/12 15:54

    本当に申し訳ないです・・・。今、念のため他のファイルも含めてコメントアウトじゃなくエラーレポートに関するコードを全部消したら、先ほどのような文が出なくなりました。。
    普通はコメントアウトしたらコードは一度利かなくなりますよね?
    エラーレポートだけ例外だったりするんでしょうか・・・。

    キャンセル

  • 2017/08/12 15:56

    多分ですが、「他のファイルも含めて」というところが肝だったのではないでしょうか?
    コメントアウトしたらコードは、もちろん動きません。エラーレポートも例外ではないはずです。

    キャンセル

  • 2017/08/12 16:02

    ちょっと不可解ですけど、とりあえず解決できてよかったです。
    本当に、ていねいにありがとうございました。
    他のファイルも含めて見直す重要性の認識を少しは深められたと思います。

    キャンセル

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

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る