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

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

ただいまの
回答率

87.61%

PHPでsqlに接続できません。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 246

score 1

前提・実現したいこと。

始めて質問させていただきます
読みにくいと思いますが、お許しください
phpの勉強を始めて参考書の通りに入力しましたが、sqlに接続できないのかエラー文しか出てきません、どう直したら良いでしょうか?

発生している問題・エラーメッセージ

```
エラーメッセージ
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>add_done</title>
</head>
<body>
ただいま障害により大変ご迷惑をおかけしております。

該当のソースコード

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>add_done</title>
</head>
<body>
<?php
try{
$staff_name=$POST['name'];
$staff_pass=$POST['pass'];

$staff_name=htmlspecialchars($staff_name);
$staff_pass=htmlspecialchars($staff_pass);

$dsn='mysql:dbname=shop;host=localhost';
$user='root';
$password='';
$dbh=new PDO($dsn,$user,$password);
$dbh->query('SET NAMES utf8');

$sql='INSERT INTO mst_staff(name,password)VALUES(?,?)';
$stmt=$dbh->prepare($sql);
$data[]=$staff_name;
$data[]=$staff_pass;
$stmt->execute($data);

$dbh=null;

print $staff_name;
print "さんを追加しました。<br/>";
}
catch(Exception $e){
print'ただいま障害により大変ご迷惑をおかけしております。';
exit();
}

?>
<a href="staff_list.php">戻る</a>
</body>
</html>
PHPです。

試したこと

port=8889;host=127.0.0.1
上記のようなことは試しましたが上手くいきませんでした。
SQLでは事前にshopの情報は登録しております。

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

本の出版が2013年なのですが関係ありますか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m.ts10806

    2021/06/14 21:02

    コードやエラーはマークダウンのcode機能を利用してご提示ください。
    https://teratail.com/questions/238564

    キャンセル

  • m.ts10806

    2021/06/15 04:59


    コードのマークダウン対応お願いします。

    キャンセル

回答 3

checkベストアンサー

+2

さすがに2013年の教材は古すぎる&技術的に明らかに誤っている部分が見受けられるので教材を変更されることを強くお勧めします。

エラー内容としては

string(85) "SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO)"

に出ている通り、MySQLへの接続に失敗しています。
理由としては、

  • 教材と開発環境構築方法が違う
  • そもそもMySQLのバージョンが違う

等の理由で教材が書かれた当初はデフォルトであったrootでのパスワード無しでの接続が出来ない状態になっていることです。

mamp root パスワードで検索してみると、デフォルトのrootのパスワードはrootらしいので、

$dsn='mysql:dbname=shop;host=localhost';
$user='root';
$password='';
$dbh=new PDO($dsn,$user,$password);

$dsn='mysql:dbname=shop;host=localhost';
$user='root';
$password='root';
$dbh=new PDO($dsn,$user,$password);

とすれば接続できそうな気がします。
が、仮にこれで接続できたとしても、他でも同じような問題が出ると予想される(&プログラムの質が低い)ので、ご自身の環境に合っている&新しい教材に変更されることをお勧めします。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2021/06/19 15:41

    回答ありがとうございます。
    passwordをrootにしたらいけました!
    ありがとうございます。
    教材は新しいのを使おうと思います、ご助言ありがとうございます。

    キャンセル

+1

例外を握りつぶされているのでシステム的に何が起きたのかわかるようになっていません。

とりあえずcatchのほうで下記のようにして中身確認してください。

catch(Exception $e){
print'ただいま障害により大変ご迷惑をおかけしております。';
var_dump($e);
exit();
} 

本の出版が2013年なのですが関係ありますか?

ゼロとは言えませんが、その書籍が何なのか分からないと評価しようがない部分はあります。

画面表示関係ない部分でhtmlspecialchars()を利用しているなどよろしくない実装はあるものの、そこでは本件とは無関係です。

PDO接続時のオプション設定も気にしたほうが良いと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2021/06/14 21:15

    回答ありがとうございます!

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>add_done</title>
    </head>
    <body>
    ただいま障害により大変ご迷惑をおかけしております。object(PDOException)#2 (8) {
    ["message":protected]=>
    string(85) "SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO)"
    ["string":"Exception":private]=>
    string(0) ""
    ["code":protected]=>
    int(1045)
    ["file":protected]=>
    string(50) "/Applications/MAMP/htdocs/staff/staff_add_done.php"
    ["line":protected]=>
    int(21)
    ["trace":"Exception":private]=>
    array(1) {
    [0]=>
    array(6) {
    ["file"]=>
    string(50) "/Applications/MAMP/htdocs/staff/staff_add_done.php"
    ["line"]=>
    int(21)
    ["function"]=>
    string(11) "__construct"
    ["class"]=>
    string(3) "PDO"
    ["type"]=>
    string(2) "->"
    ["args"]=>
    array(3) {
    [0]=>
    string(42) "mysql:dbname=shop;port=8889;host=127.0.0.1"
    [1]=>
    string(4) "root"
    [2]=>
    string(0) ""
    }
    }
    }
    ["previous":"Exception":private]=>
    NULL
    ["errorInfo"]=>
    array(3) {
    [0]=>
    string(5) "HY000"
    [1]=>
    int(1045)
    [2]=>
    string(62) "Access denied for user 'root'@'localhost' (using password: NO)"
    }
    }


    var_dumpの結果です。
    すみませんが、自分にはわかりませんでした。
    何か教えていただけましたら助かります!

    キャンセル

  • 2021/06/15 04:58

    何がわからなかったのか分かりませんが、
    Access denied for user
    using password: NO
    よく見かけるエラーなので調べてください。
    https://qiita.com/cannorin/items/eb062aae88bfe2ad6fe5

    キャンセル

+1

$staff_name=filter_input(INPUT_POST,'name');
$staff_pass=filter_input(INPUT_POST,'pass');

if(!is_null($staff_name)){
  try{
    $dsn='mysql:dbname=shop;host=localhost';
    $user = 'root';
    $password = '';
    $pdo = new PDO($dsn, $user,$password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $sql='INSERT INTO mst_staff(name,password) VALUES(?,?)';
    $stmt=$pdo->prepare($sql);
    $data=[$staff_name,$staff_pass];
    $stmt->execute($data);
    print htmlspecialchars($staff_name)."さんを追加しました。<br/>";
  }catch(PDOException $e){
    die($e->getMessage());
  }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2021/06/19 15:39

    回答ありがとうございます!無事解決できました。

    キャンセル

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

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

関連した質問

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