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

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

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

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

2回答

1124閲覧

LAMP環境でのPDOの使い方。

Nanmotsu

総合スコア22

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

1クリップ

投稿2021/05/30 18:27

編集2021/06/01 00:45

参考リンク

上記を参考にして、さくらのVPSで借りたVPSにCentOS7を入れて、LAMP環境を構築しました。

yum install --enablerepo=remi,remi-php73

で php-pdo, php-mysqlndなどを入れ、

PHP

1 $dsn = "mysql:host=localhost; dbname=login_test; charset=utf8"; 2 $username = "※※※※※※※※"; //伏せております 3 $password = "※※※※※※※※"; //伏せております 4 try { 5 $dbh = new PDO($dsn, $username, $password, 6 [ 7 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 8 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 9 ]); 10 } catch (PDOException $e) { 11 12 exit($e->getMessage()); 13 }

で動かしましたが、どうやらDBの取得ができていないようです。
(exitにより空白のページが表示される)

php.iniなどのファイルをいじらないといけないのかもしれませんが、どの部分をいじればよいかわかりません。

つたない質問で申し訳ありませんが、ご教授いただけると助かります。

情報不足ですみません。

・phpと同じサーバなのか(コード内でlocalhostを指定しているので同じであると予想)
→VPSに登録して、CENTOS7、APACHE、MariaDB、phpを入れていますので、同じサーバ―だと思います。

・ソフトウェアは何か
→MariaDBです

・バージョン
「mysql --version」で以下が表示されました。
Ver 15.1 Distrib 5.5.68-MariaDB, for Linux (x86_64) using readline 5.1
です。

・DBは起動しているか
「systemctl status maridb」で
active(running)と表示されました。

・作成したデータベースは何か(コード内で指定しているlogin_testと予想)
はい。login_testです。

・ユーザは作成したのか。権限付与したのか
mariadbのほうでユーザーを作成して、login_testにのみ権限付与しました。

・phpではなく、データベースのコマンド操作で同じ結果を得られているのか
mariadb内でDB作成しましたので、そのあたりは大丈夫と思います。

また、

php

1} catch (PDOException $e) { 2echo "in catch clause<br>"; 3exit($e->getMessage()); 4} 5echo "exception not occurred<br>";

を入れると、exception not occurredが表示されます。

追記2

php

1 <?php 2 3 4 function h($str) 5 { 6 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 7 } 8 9 session_start(); 10 $name = $_POST['name']; 11 $dsn = "mysql:host=localhost; dbname=login_test; charset=utf8"; 12 $username = "※※※※※※"; 13 $password = "※※※※※※"; 14 try { 15 $dbh = new PDO($dsn, $username, $password, 16 [ 17 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 18 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 19 ]); 20 } 21 catch (PDOException $e) { 22 echo "in catch clause<br>"; 23 exit($e->getMessage()); 24 } 25 echo "exception not occurred<br>"; 26 var_dump($dbh); 27 var_dump($e); 28 29 30 $sql = "SELECT * FROM users WHERE name = :name"; 31 $stmt = $dbh->prepare($sql); 32 $stmt->bindValue(':name', $name); 33 $stmt->execute(); 34 $member = $stmt->fetch(); //配列で取得 35 36 if (password_verify($_POST['num'], $member['num'])) { 37 //DBのユーザー情報をセッションに保存 38 $_SESSION['name'] = $member['name']; 39 $_SESSION['num'] = $member['num']; 40 $msg = 'ログインしました。'; 41 $link = '<a href="index.php">ホーム</a>'; 42 } else { 43 $msg = '名前もしくはパスワードが間違っています。'; 44 $link = '<a href="index.php">戻る</a>'; 45 } 46 ?> 47 48 49<!DOCTYPE html> 50<html lang="ja"> 51 <head> 52 <meta charset="utf-8"> 53 <link rel="icon" href="favicon.ico"> 54 <link rel="stylesheet" href="css/practicestyle.css"> 55 <title>login</title> 56 </head> 57 58 <body> 59 60 61 <h1><?= h($msg); ?></h1> 62 <?php echo $link; ?> 63 64 </body> 65</html> 66

が全コードとなります。

var_dump($dbh);で「object(PDO)#1 (0) { }」と表示されます。

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

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

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

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

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

yukky1201

2021/05/31 04:21

php関連のことしか記載されておらず、DB関連の構築方法が記載されていません。現状どちらに問題があるか切り分けできません。 DBについて少なくとも下記は明記するようにしましょう ・phpと同じサーバなのか(コード内でlocalhostを指定しているので同じであると予想) ・ソフトウェアは何か ・バージョン ・DBは起動しているか ・作成したデータベースは何か(コード内で指定しているlogin_testと予想) ・ユーザは作成したのか。権限付与したのか ・phpではなく、データベースのコマンド操作で同じ結果を得られているのか
退会済みユーザー

退会済みユーザー

2021/05/31 04:30

exit()で例外のメッセージを表示しているのであれば、「空白のページが表示される」のは矛盾しています。 提示されている部分以外のコードが分からないのですが、例えば } catch (PDOException $e) { echo "in catch clause<br>"; exit($e->getMessage()); } echo "exception not occurred<br>"; のようにechoを入れたりしたらどうなりますか?
退会済みユーザー

退会済みユーザー

2021/05/31 23:34

質問に追記ありがとうございます。 コンストラクタ部分で例外は起きていないようですね。 意図しない動作は記載のない部分で起きているということなので、そちらをお調べください。
退会済みユーザー

退会済みユーザー

2021/05/31 23:51

このコードだと、接続だけして終了するので、正常な動作の結果として「何も表示がない」状態になると思います。
Nanmotsu

2021/06/01 00:47

demonさん わかりました。そのほかの部分で調べてみます。 te2jiさん 下のhtmlも追記いたしました。
Nanmotsu

2021/06/01 16:46

様々なご指摘ありがとうございました。
guest

回答2

0

ベストアンサー

まずはphpinfo()で該当のPDOを認識しているか確認するところからはじめてください。

バージョンはともかく、認識したら下記のようなモジュールが出るはずです。

イメージ説明

※PDOでページ内検索してください

出てなければphp.iniに記載がないか無効になっている(コメントアウトされている)ということ。

投稿2021/05/30 18:41

m.ts10806

総合スコア80875

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

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

Nanmotsu

2021/05/31 02:28

ありがとうございます。 PDO support enabled PDO drivers mysql, sqlite PDO Driver for MySQL enabled Client API version mysqlnd 5.0.12-dev - 20150407 - $Id: 7cc7cc96e675f6d72e5cf0f267f48e167c2abb23 $ と表示されましたが、バージョンが古すぎますかね?
m.ts10806

2021/05/31 02:39

バージョン指定でインストールされたんですか? エラーログも見られたほうが良いですし、本当に画面に何も出ませんでしたか?そこかしこにecho仕込むとか、exitせずにe自体をvar_dumpするとか、起きてる現象を確実に把握する必要があります。
Nanmotsu

2021/05/31 23:36 編集

Remi Repositoryを用いて(remi73)インストールしたのですが、バージョン指定したのかは、わかりません。 またvar_dump($e)でnullが表示されたので、おそらくDBがキャッチできていないように思います。 ほかにチェックするよう箇所はありますか? 教えていただけると幸いです。
m.ts10806

2021/06/01 00:17

Exceptionに入ってきてnullが出るという状況はありえません。 意図的にsetMessageしてたとしてもオブジェクトがnullにはなりません。 どこにどう書いたのでしょうか
Nanmotsu

2021/06/01 00:47

例外の外で、var_dump($e)したのでNULLは当たり前ですね。 全コード追記いたしました。
m.ts10806

2021/06/01 00:57

では、例外の中、exitの前で
m.ts10806

2021/06/01 00:59

これで本当に何も出ないのかというのはありますが、PHPのエラー表示はonにされたほうが良いです。
Nanmotsu

2021/06/01 16:43

様々な観点からのご指摘ありがとうございました。 勉強になりました。
guest

0

var_dumpしまくったところ、データベースの情報は取得されていて、

password_verifyはハッシュ可したものと比べるということが原因でした。
データベースのパスワードをハッシュ可して解決です

投稿2021/06/01 16:46

Nanmotsu

総合スコア22

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問