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

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

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

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

Q&A

2回答

7000閲覧

PHPのFatal errorについて

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2017/02/20 11:36

気づけばプロ並みPHP
という書籍で勉強しているのですが
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [1045] Access denied for user ''@'localhost' (using password: YES)' in C:\xampp\htdocs\shop_lessons\staff_add_done.php:19 Stack trace: #0 C:\xampp\htdocs\shop_lessons\staff_add_done.php(19): PDO->__construct('mysql:dbname=sh...', '', 'marimo') #1 {main} thrown in C:\xampp\htdocs\shop_lessons\staff_add_done.php on line 19
のようなエラーが出ます

環境はAtomとXamppです
何回読み直しても書籍通りになっています

PHP

1<!DOCTYPE html> 2<html> 3 <head> 4 <meta charset="utf-8"> 5 <title>ろくまる農園</title> 6 </head> 7 <body> 8 <?php 9 // try{ 10 $staff_name = $_POST['name']; 11 $staff_pass = $_POST['pass']; 12 13 $staff_name = htmlspecialchars($staff_name); 14 $staff_pass = htmlspecialchars($staff_pass); 15 16 $dsn = 'mysql:dbname=shop;host=localhost'; 17 $user = ''; 18 $password = ''; 19 $dbh = new PDO($dsn, $user, $password); 20 $dbh->query('SET NAMES utf8'); 21 22 $sql = 'INSERT INTO mst_staff(name,password) VALUES (?,?)'; 23 $stmt = $dbh->prepare($sql); 24 $data[] = $staff_name; 25 $data[] = $staff_pass; 26 $stmt->execute($data); 27 28 $dbh = null; 29 30 echo "「{$staff_name}」さんを追加しました<br />"; 31 // } catch (Exception $e) { 32 // echo "エラー"; 33 // exit(); 34 // } 35 36 ?> 37 <a href="staff_list.php">戻る</a> 38 </body> 39</html> 40 41```どこが間違えていますか?

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/02/20 11:41

エラーメセージに書かれていることを読みましたか?また理解していますか?
退会済みユーザー

退会済みユーザー

2017/02/20 11:44

アクセスを拒否されたということですよね?19行目がおかしいといわれているのですがどこがおかしいのかわかりません
退会済みユーザー

退会済みユーザー

2017/02/20 11:46

mysqlの設定をちゃんと行っていまいものと思われます。ソースの問題以前に。
退会済みユーザー

退会済みユーザー

2017/09/24 01:58

書籍の通りなら「$user='root';」となってるはずですが
guest

回答2

0

エラーメッセージでアクセス権が無いと怒られてますにゃ。

ソースをみるとPDOコンストラクタに渡すユーザー名とパスワードのところが空になってます:

PHP

1$dsn = 'mysql:dbname=shop;host=localhost'; 2$user = ''; 3$password = ''; 4$dbh = new PDO($dsn, $user, $password);

データベース作ったときにユーザを設定しているなら
ここに入れてみてくださいにゃ。

公式のマニュアルの例:

PHP

1$dsn = 'mysql:dbname=testdb;host=127.0.0.1'; 2$user = 'dbuser'; 3$password = 'dbpass'; 4 5try { 6 $dbh = new PDO($dsn, $user, $password); 7} catch (PDOException $e) { 8 echo 'Connection failed: ' . $e->getMessage(); 9}

投稿2017/02/20 11:54

nyancat

総合スコア132

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

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

0

htmlspecialchars関数はHTMLに出力するための関数です。

入力されたデータに対してhtmlspecialchars関数を使ってSQL文に突っ込むことはSQLインジェクションの原因となります。

また、$_POST変数はフォームから入力された以外からではUndefined index というエラーが発生してしまいます。
正しくは$_SERVER['REQUEST_METHOD']でPOSTか、GETかを判断しないといけません。
従って、正しいプログラムは以下のようになります。

php

1<?php 2 3// 入力された方法がGETかPOSTかで判断 4if ($_SERVER['REQUEST_METHOD'] === 'POST') { 5 6 // 入力されたデータを filter_input関数を使って受け取る 7 $staff_name = (string)filter_input(INPUT_POST, 'name'); 8 $staff_pass = (string)filter_input(INPUT_POST,'pass'); 9 10 // MySQLへ接続、できなかった場合は終了 11 try { 12 $dbh = new PDO('mysql:host=localhost:dbname=shop;charset=utf8','root', '',[ 13 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 14 ]); 15 } catch(PDOException $e){ 16 // データベースに接続できなかったら終了 17 echo $e->getMessage(); 18 exit; 19 } 20 21 // MySQLにデータを挿入する 22 $sql = "INSERT into mst_staff (name, password) VALUES (:name, :password)"; 23 $stmt = $dbh->prepare($sql); 24 $params = array( 25 ':name' => $staff_name, 26 ':password' => password_hash($staff_pass, PASSWORD_DEFAULT) // パスワードはハッシュ化しておく 27 ); 28 $stmt->execute($params); 29} 30?>

投稿2017/09/30 04:06

naohiro19_

総合スコア178

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

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

退会済みユーザー

退会済みユーザー

2017/09/30 04:36

> 入力されたデータに対してhtmlspecialchars関数を使ってSQL文に突っ込むことはSQLインジェクションの原因となります。 これはどういう意味でしょうか? 私の感覚だと、今回のケースでは、prepare を使っているので関係ない気がします。 また、htmlspecialchars の使用箇所が適切でないのは確かですが、その理由は、「DB との値比較に使用される文字列が、htmlspecialchars で変化してしまう」ことであって、「SQLインジェクションの原因となる」からではないと思います。
退会済みユーザー

退会済みユーザー

2017/10/01 00:43

リンク先の該当箇所を確認しましたが、「SQLインジェクションの原因となる」といった記述は確認できません。もう少し具体的に記述のある箇所を教えていただけますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問