コンテンツへスキップ

管理画面にlist.phpてのが作ってある

これでフォームを作成して・・・

<h3>リストに追加する</h3>

<form action="input_list.php" method="post">
    <select name="a_z" size="5">
        <option value="">イニシャルを選んでね</option>
        <option value="a">a</option>
        <option value="b">b</option>
        <option value="c">c</option>
        <option value="d">d</option>
        <option value="e">e</option>
        <option value="f">f</option>
        <option value="g">g</option>
        <option value="h">h</option>
        <option value="i">i</option>
        <option value="j">j</option>
        <option value="k">k</option>
        <option value="l">l</option>
        <option value="m">m</option>
        <option value="n">n</option>
        <option value="o">o</option>
        <option value="p">p</option>
        <option value="q">q</option>
        <option value="r">r</option>
        <option value="s">s</option>
        <option value="t">t</option>
        <option value="u">u</option>
        <option value="v">v</option>
        <option value="w">w</option>
        <option value="x">x</option>
        <option value="y">y</option>
        <option value="z">z</option>
        <option value="others">others</option>
    </select>
    <br />
    band / artist
    <br />
    <input type="text" name="artist" size="20" maxlength="200" value="" /><br />
    <button type="submit">追 加</button>
</form>

フォームの飛び先のinput_list.phpは
以下のような簡単なプログラムw

<?php
require('dbconnect.php');

$alphabet = $pdo->prepare('INSERT INTO bgm_list SET a_z=?,artist=?');
$alphabet -> execute(array($_POST['a_z'],$_POST['artist']));

header('Location: list.php');
?>

続けて追加できるように
終わったら元のページに戻る仕様

ページの最初には
セッションの仕組みがあって
ログイン状態でなければ
このページ自体が表示不可能で
ログインページに飛ばされるるる~

これで追加できるようになった^^

例えば
以下のような
音源(バンド/アーティスト)のリスト

【A】
ABBA
AC/DC
AEROSMITH
ALICE COOPER
ASIA

【B】
BANGLES
BAY CITY ROLLERS
BILLY IDOL
BLONDIE
BON JOVI
BOSTON

【C】
C.C.R
CACTUS
CHEAP TRICK
CHICAGO
CREAM
CULTURE CLUB
CYNDI LAUPER

【D】
DANGER DANGER
DURAN DURAN
(以下略)

順不同にデータベースに登録しておいて
表示する時はアルファベット順に
自動で並べ替えてくれたら
便利かと^^

まずはMySQLにテーブル(bgm_list)を作成

適宜、データを挿入

次はこれをアルファベット順に
表示するページ(list.html)を作成

データベース接続のための共通プログラム
dbconnect.phpを再利用(共用)

リスト表示はイニシャル毎に
下記のようなプログラムにしてみたら・・・

<h4>A</h4>

<?php

require('dbconnect.php');

$alphabet = $pdo->prepare("SELECT * FROM bgm_list WHERE a_z='a'");
$alphabet -> execute();
while ($row = $alphabet->fetch()) {
        echo $row['artist'] . "<br>";
    }

?>

思惑通りに表示された^^


ログインして会員専用ページを開く

てのが前回の記事

換言すれば
ログインしてない状態では
会員専用ページが見れないようになってて
その仕組みにもセッションが使われてるのだ

というコトは
会員専用ページを増やす時には
同じようにその仕組みを組み込む必要がある

でもこれって実は
管理者がログインした場合に
管理者専用のページを開くために作ってるので・・・

PHPしっかり入門教室

上記の書籍に従ってmember.phpとしたのを
まずはmenu.phpとファイル名を変更して
インクルードするファイルも
合わせてmenu_view.phpにするので
ファイルを開いて以下を変更

// include_once('member_view.php');
include_once('menu_view.php');

そしてmember_view.phpをコピペして
menu_view.phpのファイルを作成したら
各編集画面へのリンクを作成

<!--
<ul>
    <?php foreach($members as $member): ?>
    <li><?php echo html_escape($member['name']); ?></li>
    <?php endforeach; ?>
</ul>
-->
<p><a href="news.php">お知らせ</a></p>
<p><a href="toppage.php">トップページ</a></p>
<p><a href="list.php">リスト</a></p>
<p><a href="food.php">フード</a></p>
<p><a href="drink.php">ドリンク</a></p>

そして各編集画面のページを
構成するPHPファイルを
同じ手順で作成

「PHPしっかり入門教室」に従って
ログイン認証を作成してきて
やっとログインができたぽい
ので
ログインした後に表示するページと
ログアウトのページを作成

PHPしっかり入門教室

新たに作るファイルは
コントローラのmember.php(p239~)
表示画面のmember_view.php(p240~)
ログアウトページのlogout.php(p241)

ログインしてみると・・・

一覧は取得できてるけど
どうもログインしたユーザが
判別されてないぽい?

いや、コードに間違いを発見した^^;
(!の要らんemptyに付けてしまってて
もれなくログイン可能になってた~)

でも直すと今度はエラーになってログインできず><

「パスワードとメールアドレスが正しくありません」

登録し直してもこれではねられるるる~?!

サンプルデータをダウンロードして
どこが間違いなのか
比較してみるコトにした

signup.phpで
$passwordが$passwoadって
致命的なスペルミスしてるのが発覚w

むしろこんなんでよく登録できてたなwww

あ~やっとちゃんとできた^^

目下、ログイン認証を作成中で
一連の動作を一通り辿るのに
実際のファイルのコードは
「PHPしっかり入門教室」に
ほぼ忠実だ

PHPしっかり入門教室

しかし細かい部分で
凄く参考になってるのは
「PHP7+MariaDB/MySQL マスターブック」

PHP7+MariaDB/MySQL マスターブック

6冊の中で最も懇切丁寧で
ちょっと回りくどいくらいの解説でも
理路整然と展開するので
どうしてそうなるのかって部分を
なるほど~と理解し易い!

また実際にレンタルサーバで
WEBサイトを作成する際に必要な
例えば.htaccessの記述の仕方とか
端折らずに詳述されてて
初心者に限らず、中級・上級者でも
どれか1冊を選ぶならこれ!!

でも「PHPしっかり入門教室」の方が
「~マスターブック」よりも実践向きかな?

初心者を対象としてるくらいだからか
コードが小出しに出てきて
親切な解説があるので
一連の動作に必要なファイル群を
途中でうんざりせずに作成できるるる~

そんなワケで
これからログイン認証をするために
新たに作るファイルは
コントローラのlogin.php(p233~)と
表示画面のlogin_view.php(p234~)の
たった2つだ

でも初心者が一気に作成するには
かなり長々とコードを書かねばならず
根気が試される場面だろうが
小出しに書き足してくような流れなので
ちゃんと1つ1つのコードを
理解しながら書き進むコトができて
飽きずにファイルを作成できると思われ

login.phpのログイン機能の装備の解説は
自分には苦手なセッションについて
とてもわかり易く書かれてたし
最後に完成したコードを
全体を通して詳説されてるのが
とてもよかった^^

後はこれでめでたくログインできればOK

しかしログインするドコロか
login.phpを表示しただけでエラーw

htmlEscape なんて関数は無いってwww

そうだよね、自分も書きながら
あれ?そんなのだったっけ???って
頭から?マークが放出したもんね
html_escape だったよね~

書き直したら
ログインページがちゃんと表示されて
ログインできたぽい・・・

ぽいけど
飛び先のページ(member.php)が
まだ無かったから
今度はWordPressからエラー^^;

ページが無いって><

まあでもできた^^

ログイン認証を実装するために
まずは以下の書籍に従って
MySQLにテーブルを作成して
設定ファイルや関数ファイルを用意

PHPしっかり入門教室

お次は登録画面

コントローラのsignup.php(p226)
表示画面のsignup_view.php(p227)

ここまでやればブラウザに
signup.phpが表示できそうだ

できた^^

この後、更に既存ファイルの
db_helper.phpに以下を追記

・メールアドレスの重複を調べる関数(p227)
・入力データを挿入する関数(p228)

signup.phpにも以下を追記

・バリデーション機能(p228)
・データの挿入コード(p229)

ここまでの登録画面ができたら
ユーザをテスト登録してみて
データベースに反映されてるか確認

登録はできた^^

しかし同じメールアドレスでも登録できた><

メールアドレスの重複を調べる関数の部分に
スペルミスがあった^^;

修正してから
再度、同じアドレスで登録しようとしたら
ちゃんと「このメールアドレスは既に登録されてます」と
エラーが返ってきて登録できなかった

次はやっとlogin.phpだ!

ここまでの課題をこなすのに・・・

1、PHPの本6冊のその課題の部分だけ
次々と読んでは
気付いたりしたコトをメモ(紙)

2、最も課題に適してるプログラムを選んで
実際にテスト

3、上手くいったら
その経過、コード、表示画面を
ブログにアップ

と、そんな手順で進めてたが
クッキーとセッションについては
最も初心者用と思われる
「誰もがあきらめずにすむPHP超入門」と

誰もがあきらめずにすむPHP超入門

自分から見ると最も難易度が高く感じる
「はじめてのPHPプロフェッショナル開発」には

はじめてのPHPプロフェッショナル開発 PHP7対応

なんと該当ページが無かった!!

でもセッションはログイン認証には必須なので
ログイン認証の項目を探すと
「~超入門」では最後に
「なんちゃってSNS」を作成する項目があるも
確かにログイン認証をしてはおらず
SNSってか、要はBBSだったw

そして「~プロフェッショナル開発」の方は
CakePHPのAuthコンポーネントを使って
ログイン画面の実装をしてた!

個人的にCakePHPはもう古いと思ってたので
最新の(2019年3月に出てる)
最も難易度高い(と感じる)教則本に載ってるってのは
度肝を抜かれた^^;

CakePHPやLaravelなんかを使った方が
セキュリティ的にも良さそうだけど
それやっちゃうとPEARに頼ってた時と同じで
PHP自体がおざなりになる気がするので
フレームワークやライブラリ使わず
実装していこうかと・・・

クッキーとセッションについては
たまたま続けて以下の書籍のコードを
使用ってか、参考にしたので
ログイン認証もこの本の通りにやってみよう^^

PHPしっかり入門教室

p221にある通りに
MySQLにmembersテーブルを作成

この後、今までの自分流のやり方だと
データベースにテストアカウントを直に登録して
いきなりlogin.phpを作成して
一先ず、ログインできるか確かめてたのだが
今回はその前に設定ファイルや関数ファイルを用意

設定ファイルconfig.php(p223)

define('定数', '設定した値');ってのは
XOOPSで表示名を変更するのに弄ったわ、なるほどね

そして関数ファイルときたら
function.phpだと決めつけて
そう名前をつけた空ファイルを用意して
次のページ(p224)へ進んだら
なんと2つのファイルに分けて使うってコトで
db_helper.phpとextra_helper.phpだった・・・バタリ ゙〓■●゙

で、次こそlogin.phpかと思いきや
signup.php・・・ヾ(・_・;)ぉぃぉぃ

長くなり過ぎるから続きは次回だ

前回のクッキーに引き続き
今回はセッション

以下の書籍のP202~
「セッションの仕組みを理解する」を参考に

PHPしっかり入門教室

ユーザ名(user_name)が モモイロ
種(spicies)が オオカミ の場合
session_set.php

$_SESSION['profile'] = array('user_name' => 'モモイロ', 'spicies' => 'オオカミ');

リンク先のセッション確認ページ
session_check.php

この モモイロ や オオカミ を
session_check.phpを書き直して
HTMLで表示させてみる

と、ここまでは簡単だ

このセッションを使って
一般会員はログインした状態で
フォーム画面にMySQLのデータを反映させて
上書きできるようにして
管理者はCSVでデータを一括ダウンロードしたい

ざっくりとこんなイメージ

まずはログイン認証だ!

例えば・・・

MySQLのデータを
編集するフォームがあるとしよう

自分だけが使うのなら
サーバに常駐させとかなくて
使う時だけアップすりゃいんだけど
他人に使わせる場合には
ログイン認証させて
自身のデータだけ編集できるように
制限しなければならず

しかも単にログイン認証するだけでなく
ログインデータを引き継がなくてはならぬ!

クッキーだの?

choco_chip_cookie

セッションだの?

session

それらを使って
ログイン認証して
ユーザデータを表示するまでを
忠実に学んで行こうかと!!

まずはクッキーから・・・

以下の書籍のP202~
「クッキーの仕組みを理解する」を参考に

PHPしっかり入門教室

ユーザ名(user_name)が momoiro の場合
cookie_set.phpを作成

え?
phpは一行だけ???

time() + (60 * 60 * 24 * 30) の部分は
現在のタイムスタンプを取得して
そこから1ヵ月って意味

リンク先のクッキー確認ページ
cookie_check.phpを作成

こっちもphpは一行w

cookie_set.phpをOPEN

リンクからcookie_check.phpをOPEN

なんかぐちゃぐちゃ出て来てエラーぽいけど
これでダイジョブなのかね^^;

デベロッパーツールから見てみたら
確かにクッキーがあった!

そして調べてみたら
__utma __utmb __utmz なんてのは
Googleアナリティクスのクッキー情報らすぃ

とりあえずcookieは
デベロッパーツールから削除

なので
クッキーを削除するcookie_delete.phpは
作らなかった~

今回、PHPを学び直したいと思った
1番の理由を突き詰めると
実はPHP5とPHP7の違いってより
これまではPEARライブラリを活用してたのが
これから使ってく自信を失ったせいだ

今年になっていきなり
GIGAZINEの記事で良からぬニュースを読んで・・・

PHPライブラリサービスの「PEAR」でセキュリティ侵害が見つかる

その後どうなったのかと気になってたら
下記の記事が決定打となって・・・

PHP7.4ではPEARがインストールされなくなる

PEARとの決別を決心!

そもそもサーバのPHPを5→7にしたら
それまで表示されてたモノが
空白になってしまったのが発端で
それと言うのもどうやら
MySQLからデータを拾ってこれなくなったようで
その時点でPEARを使い続けるかどうか
既に答えは限りなくNOに近かったのだがね

そういうワケで
MySQLからデータを拾ってくるのに
PEARを使わずにやるってのが
1つ目の課題

WordPressからアップした以下の投稿の本文を・・・

人間は考える葦である

別サイトの次の該当ページに表示したいのだ

筑摩世界文学大系【13/19】デカルト パスカル

以下の書籍のP212~を参考に・・・

よくわかるPHPの教科書 PHP7対応版

まずはデータベース接続のための共通プログラム
dbconnect.phpを作成

<?php
try {
    $db = new PDO('mysql:dbname=データベース;host=接続先ホスト;charset=utf8', 'ユーザ名', 'パスワード');
} catch (PDOException $e) {
    echo 'DB接続エラー:'. $e->getMessage();
}
?>

WordPressの記事の
タイトル(post_title)と本文(post_content)は
同じ wp_post テーブルにあるので
そのテーブルの該当記事のIDを指定して
1行分のデータを取得して
表示するためにHTMLから呼び出す

<div class="wp">
<?php
    require('dbconnect.php');

    $contents = $db->query('SELECT * FROM wp_posts WHERE ID=1'); // ID指定
    $contents->execute();
    while ($row = $contents->fetch()) { // 1行分のデータ取得
?>

<h4><?=$row['post_title']?></h4>
<div class="wp_post"><?=$row['post_content']?></div>

<?php
    }
?>
</div>

WordPressの記事がHTML内に表示された♪

こんな簡単でいんだ?!

なんだ、PEARなんか全然必要なくね?