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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

3回答

1292閲覧

PHPをGoogle Chromeで繋げられない(ドットインストールより)

Beronika

総合スコア18

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2019/04/22 04:28

ドットインストールの「PHPでTodo管理アプリを作ろう」という講座についての質問です

現在、この講座の12回まで終了したのですが、その講座中のプログラミングを全て打ち込み、仮装サーバーを使って読み込んでみると

「SQLSTATE[HY000] [1045] Access denied for user 'dbuser'@'localhost' (using password: YES)」

このようなエラーが出てしまいました。

自分で色々と調べたり考えたりしてみて以下の考察まではできました。
・どうやらユーザーネームに問題がありそうだ
・おそらくAJAXを導入する際に問題が生じた(導入前は問題なかった)
・プログラムについては特に問題がない

この考察が本当にあっているのかはわからないですが、これらを踏まえてもまだよくわかりません。
初心者なので、勘違いしている部分もあるかもしれないです。どうしてこのような問題が出てくるのか、そしてどのように解決すればいいのかを教えてください。

PHP

1//_ajax.php おそらくajaxを読み込むファイルかと 2<?php 3//全体的に見るとajaxを設定するための命令 4require_once(__DIR__ . '/config.php'); 5require_once(__DIR__ . '/function.php'); 6require_once(__DIR__ . '/Todo.php'); 7 8//get Todos 9$todoApp = new \MyApp\Todo(); 10 11if($_SERVER['REQUEST_METHOD'] === 'POST'){ 12 try{ 13 $res = $todoApp->post(); 14 header('Content-Type:application/json'); 15 echo json_encode($res); 16 exit; 17 }catch (Exception $e) { 18 header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500); 19 echo $e->getMessage(); 20 exit; 21 } 22} 23

PHP

1 2//todo.php 3様々な処理をするための命令? 4<?php 5 6namespace MyApp; 7 8class Todo{ 9 private $_db; 10 11 public function __construct(){ 12 //MySQLとPHPをつなげる魔法の言葉! 13 try{ 14 $this->_db = new \PDO(DSN, DB_USERNAME, DB_PASSWORD); 15 $this->_db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); 16 } catch (\PDOException $e) { 17 echo $e->getMessage(); 18 exit; 19 } 20 } 21 //魔法の言葉はここまで 22 23 //全てのデータを配列として並び替える命令 24 public function getAll(){ 25 $stmt = $this->_db->query("select * from todos order by id desc"); 26 return $stmt->fetchAll(\PDO::FETCH_OBJ); 27 } 28 29 //これははTodoの記入等のデータベースを処理するメゾット 30 public function post(){ 31 //modeが渡って来なかったら例外を返す処理 32 if(!isset($_post['mode'])){ 33 throw new \Exception('mode not set!'); 34 } 35 36 switch ($_POST['mode']){ 37 case 'update'; 38 return $this->_update(); 39 case 'create'; 40 return $this->_create(); 41 case 'delete'; 42 return $this->_delete(); 43 } 44 } 45 46 private function _update(){ 47 //idが渡って来なかったら例外を返す処理 48 if(!isset($_post['id'])){ 49 throw new \Exception('[update] id not set!'); 50 } 51 52 $this -> _db -> beginTransaction(); 53 54 $sql = sprintf('update todos set state = (state+1) % 2 where id = %d', 55 $_POST['id']); 56 $stmt = $this->$_db->prepare($sql); 57 $stmt->excute(); 58 59 //stateを再び返す 60 $sql = sprintf('select state from todos where id = %d', 61 $_POST['id']); 62 $stmt = $this->$_db->query($sql); 63 $state = $stmt->fetchColumn(); 64 65 $this -> _db -> commit(); 66 67 //配列で返してあげる 68 return[ 69 'state' => $state 70 ]; 71 } 72 73 private function _create(){ 74 75 } 76 77 private function _delete(){ 78 79 } 80} 81 82 ?> 83

js

1$(function(){ 2 'use strict'; 3 4 $('#todos').on('click','.update_todo',function(){ 5 //idを取得 6 var id = $('this').parents('li').data('id'); 7 8 //ajax処理 9 $.post('_ajax.php',{ 10 id:id, 11 mode:"update" 12 },function(res){ 13 if(res.state === '1'){ 14 $('#todo_' + id).find('.todo_title').addClass('done') 15 }else{ 16 $('#todo_' + id).find('.todo_title').removeClass('done') 17 } 18 }) 19 }); 20 21}); 22

php

1//メインファイル 2<?php 3 4require_once(__DIR__ . '/config.php'); 5require_once(__DIR__ . '/function.php'); 6require_once(__DIR__ . '/Todo.php'); 7 8//get Todos 9$todoApp = new \MyApp\Todo(); 10$todos = $todoApp->getAll(); 11 12 ?> 13 14 <!DOCTYPE html> 15 <html lang="ja"> 16 <head> 17 <meta charset="utf-8"> 18 <title>My Todos</title> 19 <link rel = "stylesheet" href = "styles.css"> 20 </head> 21 <body> 22 <div id = "container"> 23 <h1>Todos</h1> 24 <form action=""> 25 <input id = "new_todo" type = "text" placeholder = "what needs to be done?"> 26 </form> 27 <ul id = "todos"> 28 <?php foreach ($todos as $todo) : ?> 29 <li id = "todo_<?= h($todo->id); ?>" data-id="<?= h($todo->id); ?>"> 30 <input type = "checkbox" class = "update_todo" <?php if($todo->state === '1') { echo 'checked'; } ?>> 31 <span class = "todo_title <?php if($todo->state === '1'){ echo 'done'; } ?>"> 32 <?= h($todo->title); ?></span> 33 <div class = "delete_todo">x</div> 34 </li> 35 <?php endforeach; ?> 36 </ul> 37 </div> 38 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> 39 <script src = "todo.js"></script> 40 </body> 41 </html> 42### ヘディングのテキスト

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

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

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

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

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

guest

回答3

0

当該のDBに 'dbuser'@'localhost' からのアクセス権が正しく設定されていません
rootでアクセスして設定を更新してください

投稿2019/04/22 04:31

yambejp

総合スコア114572

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

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

0

ベストアンサー

SQLSTATE[HY000] [1045] Access denied for user 'dbuser'@'localhost' (using password: YES)

出ているエラーはPHPというよりMySQLから返されているエラーです。
dbuserというユーザーロールがMySQLに存在するのか、接続先はlocalhostで良いのか、権限は適切に与えられているか
このあたりから確認してみてください。

投稿2019/04/22 04:34

m.ts10806

総合スコア80765

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

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

Beronika

2019/04/22 04:54

MySQLから返されているエラーだったんですね。 実際にdbuserというユーザーもありましたが、myapp_userというユーザーも存在し、そっちではないかと思いはじめました。 しかし、どこで変更するのか、本当にそれであっているのか等の情報はわからなかったです。そこらへんも教えてくれるとありがたいです。
m.ts10806

2019/04/22 04:58

回答の最後にリンクつけてますがそれでは不足ですか?
Beronika

2019/04/22 09:07

申し訳ないです。これではわからなかったです。 もう少し勉強してからの方がいいのでしょうか?
m.ts10806

2019/04/22 09:09

確かに簡単ではないとは思うのですが、実際にdbuserというユーザーもありましたが、 "myapp_userというユーザーも存在し、そっちではないかと思いはじめました。" と仰っていますから、「DB権限ユーザーの確認方法」をご存じということではないですか?
Beronika

2019/04/22 13:42

ユーザーの確認方法はわかっていないですね。 それは権限を表示するコードを打ち込めばいいのでしょうか?
m.ts10806

2019/04/22 20:48

なるほど。ではどうやって「dbuser」「myapp_user」というユーザーの存在を認識されたのでしょうか?
Beronika

2019/04/23 00:13

登録されているユーザーの検索方法は理解していました。 日本語がよくありませんでした。すいません。 自分が理解していないのは現在使っているDBのユーザーがdbuserなのかを判断する方法、そして、dbuserで勘違いしていたなら、どこでdbuserからmyapp_userに変えるのかです。 お時間を頂いてしまい申し訳ないです。 そもそも勘違いしているのかもしれないですが、回答お願いいたします。
m.ts10806

2019/04/23 00:18

了解です。 ちなみに、php、MySQLがインストールされているのはWindowsですか?Linux系OSですか?
Beronika

2019/04/23 00:25

ドットインストールを見ながら学習したので、よくわからないですが、Macを使っています。 Linux系OSはネットで軽く学習したら、ダウンロードをしなければいけないらしいのでおそらくないのではないかと思います。
m.ts10806

2019/04/23 00:27 編集

では「MAMP」もしくは「XAMPP」で導入しましたか? それともVirtualBox、Vagrant、CentOS、Cloud9などの導入、構築が発生しましたか?
Beronika

2019/04/23 00:44

やっと理解しました。vagrantとCentOSで仮想サーバーを毎回起動しています。 ターミナルを使って毎回仮想サーバーを立ち上げ、vagrantを使ってPHPとMySQLを利用しています。
m.ts10806

2019/04/23 00:51

CentOSということはLinux系ですね。 MySQLの起動についてもそちらで対応されていると(つまりコマンドでログインは試みたことがあると) まず、下記2件をMySQLにコマンドからログイン後、実行してみてください。※回答に提示した記事にあるものですが「MySQLにログインしてSQLを実行する」ものです ユーザー一覧とHOST紐づけの確認: select Host, User from mysql.user; ユーザー権限の確認: SHOW GRANTS for '調べたいユーザー名'@'%'; ※できればユーザーはrootのほうが後から操作しやすいです
Beronika

2019/04/23 00:59

1、ユーザー一覧とHOST紐付けの確認の結果 Host | User | +-----------------------+------------+ | 127.0.0.1 | root | | ::1 | root | | localhost | | | localhost | dbuser | | localhost | myapp_user | | localhost | root | | localhost.localdomain | | | localhost.localdomain | root | | lovalhost | dbuser | +-----------------------+------------+ と出ました。 ②ユーザの権限を確認するとエラーしか出ません。 ユーザめいの’’を外したら「'>」としか出てこなくなってしまいました。
Beronika

2019/04/23 01:03

「'>」は無事解決できました。しかし、調べたいユーザー名を打っても相変わらずエラーが出てしまいます。 ERROR 1141 (42000): There is no such grant defined for user 'dbuser' on host '%'
m.ts10806

2019/04/23 07:15

返信遅れました。 >ユーザめいの’’を外したら「'>」としか出てこなくなってしまいました。 構文エラーですね。おそらく解決できたので大丈夫と思いますが・・・。 >調べたいユーザー名を打っても どのように打ちましたか?というか、SHOW GRANTS 自体は確かROOT権限がないと実行できなかったと思います。
guest

0

mts10806さんとのやりとりで、もしかしたらユーザー権限がされていないのではと思い始めて、
「gtant all on 「DB名」. * to dbuser@localhost identified by '「パスワード」'」
を入れたら無事表示されました!

かなり迷惑をおかけしてしまいましたがやりとりがなければ解決しなかったと思います。ありがとうございました!

投稿2019/04/23 07:16

Beronika

総合スコア18

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

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

m.ts10806

2019/04/23 07:17

解決されたようで何よりです。 私の回答だと「権限は適切に与えられているか」の部分ですね。 ※ちょっと諸事情で返信遅れましたことこの場を借りてお詫び申し上げます
Beronika

2019/04/23 07:22

こちらに失礼いたします。 本当にありがとうございました。確か打ち込んだと思っていたので、そこから違うのかがわからなかったです。 エラーはおそらく権限が与えられていないので出てきたものではないかと思うのですが違うんですかね?とにかく解決できて本当によかったです。 ※毎回自分の方が返信が遅かったので、問題ありません。本当にありがとうございました!
m.ts10806

2019/04/23 07:24

> エラーはおそらく権限が与えられていないので出てきたものではないか はい。その通りです。「遣おうとしているユーザーがきちんと対象のホストとDBを取り扱う権限があるか」というのは大事です。 学習時期はなんでもrootで良いとは思いますが、実業務ではプロジェクトや環境によって権限をわけるので、今のうちに「適切に権限を割り振る」ことを覚えておくのは非常に良いことだと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問