忍者ブログ

おやっさんのWEBサイト制作への道

WEBサイト制作ど素人のおやっさんが、HTML、CSS、PHPなど学んでいく技術ブログです。

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

PHP017(会員制掲示板02 print_r(),$_SESSION = array(),setcookie(Cookie名,'',time()-3600,'/'),session_destroy(),preタグ)

↓次にlogout.phpを作ります。


<?php
// セッションの開始
session_start();

// セッション変数を初期化(カラの配列を代入)
$_SESSION = array();

// セッションIDを破棄
if(isset($_COOKIE[session_name()])){
setcookie(session_name(),'',time()-3600,'/');
}

// セッションを破棄
session_destroy();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="" type="text/css" />
<title>ログアウト</title>
</head>
<body>
<p>
■ログアウトしました。<br />
セッション情報($_SESSION):
</p>
<pre>
<?php
// $_SESSIONの中身をすべて表示
print_r($_SESSION);
?>
</pre>
</body>
</html>

print_r()

引数の値やデータ型の情報を出力します。※var_dump()のほうが詳細らしいです。


$_SESSION = array()

セッションの初期化です。空の配列を代入します。


setcookie(Cookie名,'',time()-3600,'/')

Cookieの破棄です。つまり、リンクIDの破棄です。
setcookie(Cookie名,'(※空にする)',time()-3600(←※現在時刻-3600秒前),'/(←※「/」はサイト全体の意味です。)')こんな感じです。


session_destroy()

セッションの破棄です。


preタグ

内容が<br />タグなしでも改行されます。

PR

PHP016(会員制掲示板01 パスワードボックス,seesion-start(),$_SESSION[セッション変数名]),mysql_num_rows(),header(’Location:URL/相対パス’)

今度は会員制掲示板を作ります。この教本つくって覚えるPHP入門はログインシステムがおかしいって言うかこんなめんどくさいログインの仕方しないだろうって感じですがとりあえずやります。

サイト構成図
とりあえずサイトマップを作ってみました。

↓login.htmlをchap5ディレクトリの中に作ってみましょう。


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="style.css" />
<title>2京ちゃんねる</title>
</head>
<body>
<h1>しょぼい掲示板【2京ちゃんねる】</h1>
<p>※一応会員制です。</p>
<hr />
<h2>■ユーザー名とパスワードを入力してください</h2>
<form action="check_login.php" method="POST">
<p>
ユーザ名:<br />
<input type="text" name="user" size="30" />
</p>
<p>
パスワード:<br />
<input type="password" name="pass" size="30" />
</p>
<div id="sendButton">
<input type="submit" value="ログイン">
</div>
</form>
<hr />
</body>
</html>

↓とりあずstyle.cssも作ってみました


body{
background-color: #efefef;

}

input{
width:200px;
}

#sendButton{
text-align: center;
}

#sendButton input{
width:150px;
}

パスワードボックス

inputタグのtype属性、passwordです。入力値は黒丸等の伏字で表示さます。暗号化はされないそうです。


↓こんな感じで画面ができます。(※画像はクリックで拡大できます。)

ログイン画面


↓check_login.phpを作ります。


<?php
// セッションの開始
session_start();

$user = $_POST['user'];
$pass = $_POST['pass'];

// MySQLへの接続
$conn = mysql_connect('localhost','sample_user','sample_pass');

if($conn){
// データベースの選択
mysql_select_db('sample_db',$conn);

// データベースへのお問い合わせSQL文
$sql = 'SELECT user_name FROM user_tb
WHERE login_name = "'.$user.'"
AND login_password = "'.$pass.'"';

// SQL文の実行
$query = mysql_query($sql, $conn);
}

// 認証
if(mysql_num_rows($query) == 1){
// ログイン成功
$login = 'OK';
// データの取り出し
$row = mysql_fetch_object($query);
// 表示用ユーザー名をセッション変数に保存
$_SESSION['name'] = $row->user_name;
}else{
// ログイン失敗
$login = 'Error';
}

// セッションを変数に記録
$_SESSION['login'] = $login;

// 移動
if($login == 'OK'){
// ログイン成功:ログイン画面へ
header('Location: menu_message.php');
}else{
// ログイン失敗:ログインフォーム画面へ
header('Location: login.html');
}
?>

seesion-start()

セッションを扱うときは必ず記述すします。書き込み/読み込みどちらも記述は一緒です。ファイルの最初に実行します。(HTMLタグを含む)

$_SESSION[セッション変数名(※任意です。)]

ログインフォームからユーザ認証プログラムへ「ユーザー名」「パスワード」を送信し、ログインに成功すればセッションを生成しログインに成功すればセッションを生成し、ブラウザのCookieにセッションIDを書き込みます。セッション変数をセッションIDをリンクさせてサーバー上に保存します。ページ移動時はブラウザーのCookieからセッションIDを取り出し、セッションを生成した
ブラウザーかどうかを判断します。セッションを生成したブラウザ(同じセッションIDを持つブラウザー)であれば、サーバーに保存されているセッション変数へのアクセスが可能です。こんな感じでログインが維持されています。これはそのセッション変数です。


mysql_num_rows()

引数のデータ件数を取得です。
よくわかりませんがmysql_query()の戻り値、ここでは「1」の時trueです。その他はたぶんfalseを返します。


header(’Location:URL/相対パス’)

httpヘッダを送信する。ほかのページに飛ばすってことです。リダイレクトってやつです。コンテンツタイプ指定、文字コード指定。って、メモってあるんですけど何のことかわかりません。

PHP015(アンケートフォーム07 date(日時の取得,タイムスタンプ),strotime(),ユーザー定義関数,SELECT文,ORDER BY,mysql_fetch_object())

アンケート結果
1.検索結果(query_question.php)

2.結果画面(show_question_db.php)

↑こんな感じで作っていきます。

ではquery_question.phpを作ってみましょう↓


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="style.css" type="text/css" />
<style>
</style>
<title>アンケート検索</title>
</head>
<body>
<p>■検索条件を入力してください。</p>
<form action="show_question_db.php" method="POST">
<p>購入日:<br />
<label>①<input type="text" name="sdate" value="<?php echo date('Y/m/d',strtotime('-1 month'));?>" /></label>
~<label>②<input type="text" name="edate" value="<?php echo date('Y/m/d');?>" /></label>
</p>
<p>
<label><input type="radio" name="sort" value="date" checked="checked" />購入日でソートする</label>
<label><input type="radio" name="sort" value="pprice" />平均購入額でソートする</label>
<label><input type="radio" name="sort" value="star" />評価でソートする<label><br />
<label><input type="radio" name="sort" value="job" />職業でソートする</label>
<label><input type="radio" name="sort" value="entry_date" />アンケートの登録日でソートする</label>
</p>
<p>
<input type="submit" value="アンケートを表示する" />
</p>
</form>
</body>
</html>

date(日時の取得,タイムスタンプ)

日時を取得します。
date('Y/m/d H:i:s)で年/月/日 時:分:秒になります。/や:の文字列は自色々な文字列を使えます。タイムスタンプを省略すると現在の日付になります


strotime()

文字列からタイムスタンプ(※1970年1月1日 00:00:00からの秒数です。)を取得します。
strotime('now')で今です。
strotime('+1 month')で1ヶ月後です。色々記述の仕方があるらしいので、使うときにググるのがいいかと思います。


↓こんな感じの画面です(※画像はクリックで拡大できます。)


データ検索画面


↓次にshow_question_db.phpを作ります。


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="style.css" type="text/css" />
<style>
</style>
<title>アンケート結果</title>
</head>
<body>
<?php
// 日付のチェック関数の作成
function get_checked_date($date){

// 全角から半角へ変換
$checked_date = mb_convert_kana($date,'as','UTF-8');

// 「/」で分割
if (empty($checked_date)) {
echo '年月日を入力してください。<br />';
} elseif (preg_match("/([0-9]{4})[-\/]+([0-9]{1,2})[-\/]+([0-9]{1,2})/", $checked_date)) {
list($year,$month,$day) = explode('/',$checked_date);
} else {
echo htmlspecialchars($checked_date, ENT_QUOTES) . '(年月日を「/」で区切って下さい。)<br />';
}

// 日付チェック
if (!checkdate($month,$day,$year)) {
// 現在の日付
$checked_date = date('Y/m/d');
}
return $checked_date;
}

$sdate = get_checked_date($_POST['sdate']);
$edate = get_checked_date($_POST['edate']);
$sort = $_POST['sort'];
?>
<p<■アンケート結果</p>
<table border="1">
<tr>
<tr bgcolor="#cccccc">
<td>ID</td>
<td>購入日</td>
<td>平均購入額</td>
<td>評価</td>
<td>PHP</td>
<td>Perl</td>
<td>Java</td>
<td>C#</td>
<td>C++</td>
<td>Basic</td>
<td>職業</td>
<td>登録日</td>
</tr>

<?php
// MySQLへの接続
$conn = mysql_connect('localhost','sample_user','sample_pass');

if($conn) {
//データベースの選択
mysql_select_db('sample_db',$conn);
//データベースへのお問い合わせSQL文
$sql = 'SELECT question_id,purchase_date,purchase_price,star,lang_php,lang_perl,
lang_java,lang_cs,lang_cpp,lang_basic,job,entry_date FROM question_td WHERE purchase_date>="'.$sdate.'"AND purchase_date<="'.$edate.'"';
// ソート
if($sort == 'date'){
$sql = $sql.'ORDER BY purchase_date';
}elseif($sort == 'pprice'){
$sql = $sql.'ORDER BY purchase_price';
}elseif($sort == 'star'){
$sql = $sql.'ORDER BY star';
}elseif($sort == 'job'){
$sql = $sql.'ORDER BY job';
}elseif($sort == 'entry_date'){
$sql = $sql.'ORDER BY entry_date';
}
// SQL文の送信
$query = mysql_query($sql, $conn);

// データの取り出し
while($row=mysql_fetch_object($query)){
echo '<tr>';
echo '<td>'.$row-<question_id.'</td>';
echo '<td>'.$row-<purchase_date.'</td>';
echo '<td>'.$row-<purchase_price.'</td>';
echo '<td>'.$row-<star.'</td>';
echo '<td>'.$row-<lang_php.'</td>';
echo '<td>'.$row-<lang_perl.'</td>';
echo '<td>'.$row-<lang_java.'</td>';
echo '<td>.$row-<lang_cs.'</td>';
echo '<td>'.$row-<lang_cpp.'</td>';
echo '<td>'.$row-<lang_basic.'</td>';
echo '<td>'.$row-<job.'</td>';
echo '<td>.$row-<entry_date.'</td>';
echo '</tr>';
}
//データベースへの評価の平均点を取り出すSQL文
$sql_avg = 'SELECT ROUND(AVG(star),1) AS star_average, ROUND(AVG(purchase_price),1) AS price_average FROM question_td';
// 評価の平均点の表示
$query_avg = mysql_query($sql_avg,$conn);
$row_avg=mysql_fetch_object($query_avg);
echo '<tr><td bgcolor="#cccccc" colspan="6">購入額の平均額</td><td colspan="6">'.$row_avg-<price_average.'</td></tr>';
echo '<tr><td bgcolor="#cccccc" colspan="6">評価の平均点</td><td colspan="6">'.$row_avg-<star_average.'</td></tr>';
}
?>
</table>
</body>
</html>

ユーザー定義関数

functionで自分で関数が作れます。
①引数1つ、戻り値あり
function tax($num){$num*=1.05;
return $num}
$price = tax(10000);
これでtax()と言う名前の関数ができました。消費税の計算をできますね。戻り値とは関数に引数を入れて出た値の事です。たぶんです。②戻り値なし
function h($str){
$str = htmlspecialchars($str, ENT_QUOTES);
echo $srt;}
h(POST_[''messagr]);でサニタイズできます。なんで戻り値なしなんだろう?なんか難しいです。
③引数を2つ(省略不可)
functio taxIn($price,$tax){
return $price*$tax;
}
$price = taxIn(10000,1.05);で掛け算ですね。また消費税の掛け算です。引数を2つを省略して使えないって意味です。
④引数2つ(第2引数省略可)
function taxIn($price,$tax = 1.05){
return $price*$tax;
}
$price = taxIn(10000); →「10500」
$price = taxIn(10000,1.07); →「10700」
です。この場合第2引数に初期値(1.05)を入れているのいるので第2引数を省略することも可能です。このまま第3引数もある場合、第2引数省略時、第3引数は渡せないそうです。難しいけど、よく考えると理屈はわかります。後、初期値のない引数は省略できないので第1引数にするそうです。この辺は実際、使うようにならないとわからなのかもしれません。要は慣れなんでしょうね。


SELECT文

SQL文です。
lang_java,lang_cs,lang_cpp,lang_basic,job,entry_date FROM(←※question_tdから テーブル名です。) question_td WHERE(※条件①→) purchase_date>="'.$sdate.'"AND(※条件②→) purchase_date<="'.$edate.'"';>
みたいな感じです。

ORDER BY

ソート(※データの集合を一定の規則に従って並べること。らしいです)の場合に使います。
ORDER BY フィールド名; 又はORDER BY フィールド名 ASC;で昇順
ORDER BY フィールド名 DESC;で降順です。頭が限界です。


mysql_fetch_object()

データを1行分オブジェクト型で受け取るらしいです。ここでは
while($row(←※オブジェクト)=(←※代入)mysql_fetch_object($query)){
echo '<tr>';
echo '<td>'.$row(←※オブジェクト)-<(←※-<は決まっている)question_id(←※プロパティ ここはフィールド名、クォーテーション不要です。).'</td>';
echo '<td>'.$row-<purchase_date.'</td>';



echo '</tr>';
}みたいな感じです。なんか配列と同じような感がします。ムズイです。

↓アンケートの結果はこんな画面で表示されます。やってる本人も完全には理解できません。


アンケートの検索結果

PHP014(アンケートフォーム06 mysql_connect('データベースサーバー','ユーザー名','パスワード'),mysql_select_db('データベース名',リンクID),SQL文,mysql_query(SQL文,リンクID))

write_question_db.phpを作ります。
エラーが出ることもありそうですがとりあえずスルーします。すいません。


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>アンケート</title>
</head>
<body>
<?php
// 購入日
$pdate = $_POST['pdate'];
// 平均購入額
$pprice = $_POST['pprice'];
// 評価
$star = $_POST['star'];
// 興味のある言語
for ($i =0; $i < 6; $i++) {
if (isset($_POST['lang'][$i])) {
$lang[$i] = $_POST['lang'][$i];
} else {
$lang[$i] = '';
}

// 1、0に変換
if ($lang[$i] == '') {
$lang[$i] = 0;
} else {
$lang[$i] = 1;
}
}
// 職業
$job = $_POST['job'];

// 日付チェック
// 全角から半角へ変換
$pdate = mb_convert_kana($pdate,'as','UTF-8');

// 「/」で分割
if (empty($pdate)) {
echo htmlspecialchars($pdate, ENT_QUOTES) . '(年月日を入力してください。)<br />';
} elseif (preg_match("/([0-9]{4})[-\/]+([0-9]{1,2})[-\/]+([0-9]{1,2})/", $pdate)) {
list($year,$month,$day) = explode('/',$pdate);
} else {
echo htmlspecialchars($pdate, ENT_QUOTES) . '(年月日を「/」で区切って下さい。)<br />';
}
// 日付チェック
if (isset($year,$month,$day)) {
checkdate($month,$day,$year);
}
// 数値チェック
// 全角から半角変換
$pprice = mb_convert_kana($pprice,'as','UTF-8');
// 数値チェック
if (!is_numeric($pprice)) $pprice = '';

// MySQLへの接続
$conn = mysql_connect('localhost','sample_user','sample_pass');

if($conn) {
//データベースの選択
mysql_select_db('sample_db',$conn);
//データベースへの書き込みSQL文
$sql = 'INSERT INTO question_tb(purchase_date,purchase_price,star,lang_php,
lang_perl,lang_java,lang_cs,lang_cpp,lang_basic,job)
VALUES("'.$pdate.'",'.$pprice.','.$star.','.$lang[0].','.$lang[1].','.$lang[2].','.
$lang[3].','.$lang[4].','.$lang[5].',"'.$job.'")';

// SQL文の送信
//$query = mysql_query($sql, $conn);
if(mysql_query($sql, $conn)){
echo '<p>■アンケートを登録しました。</p>';
}else{
echo '<p>■アンケートを登録できませんでした。</p>>';
}
}else{
echo '<p>■MySQLに接続失敗しました。</p>';
}
?>
</body>
</html>

mysql_connect('データベースサーバー','ユーザー名','パスワード')

MySQLへの接続をする。関数です。MySQLとはデータベースサーバーのOS的なものだと思います。たぶん。ここでは
$conn = mysql_connect('localhost','sample_user','sample_pass');
と$connに代入します。これがリンクIDになります。
接続に失敗したらfalseを返します。


mysql_select_db('データベース名',リンクID)

データベースを選択します。


SQL文

データベースサーバーに命令をする文ですかね。たぶん、そんな感じです。言葉が足りずすいません。
INSERT文・・・データベースのテーブルへの書き込みです。
UPDATE文文・・・データベースのテーブルへの上書き(書き換え)ですかね?
DELETE文・・・データーベースのテーブル中のデータ削除です。たぶんです。
ここではINSERT文を使います。
$sql = 'INSERT(←※書き込みます。) INTO (←※question_tbの中に)question_tb(←※テーブル名)(purchase_date,purchase_price,star,lang_php,
lang_perl,lang_java,lang_cs,lang_cpp,lang_basic,job(←※カッコの中は全部フィールド名です))
VALUES(値)("'.$pdate.'",'.$pprice.','.$star.','.$lang[0].','.$lang[1].','.$lang[2].','.
$lang[3].','.$lang[4].','.$lang[5].',"'.$job.'"(←カッコの中は全部、値です。))';
$langシリーズは「0」か「1」が値になります。真偽値booleanのデータ型なので。
$pdateは「/」が入っているので文字列になります。データ型はvarcharです。なので「"」で囲みます。
他は整数です。データ型はintです。
フィールド名と値の順番は同じにしないと、だめです。値は
データベースに設定したデータ型のもの渡さないとだめです。
とりあえず、ここで$sql
にSQL文を代入しときます。


mysql_query(SQL文,リンクID)

MySQLクエリを送信する。この時、SQL文はデータベースサーバーで実行されます。クエリとは命令するとかそんな意味らしいです。


check_question.phpのformタグのaction属性をwrite_question_db.phpに書き変えます。

question.htmlからアンケートを送信しまくってください。↓(※画像はクリックで拡大できます。)

アンケートの登録画面

コマンドプロントでデータベースに接続してテーブルデータが書き込まれたか確認してみましょう。↓


cd c:\xampp\mysql\bin(※ここはXAMPPをデフォルトのままインストールしたならこのままのパスでOKです。)

mysql -u sample_user -p

sample_pass

use sample_db;

select * from question_tb;

↓データが書き込まれたのををこんな感じで確認できます。(※画像はクリックで確認できます。)

データベースの書き込みを確認画面

PHP013(アンケートフォーム05 データベースの設計)

データベースにデータを保存するためにデータベースの設定をします。

①データベース作成

②データベースを操作するためのデータベースユーザの作成

③データベース上にアンケート入れる為の表(テーブル)を作成します。
①②は前にやったので③のテーブルの作成から始めます。

XAMPPのApacheとMySQLを起動して、コマンドプロントを開きます。


cd c:\xampp\mysql\bin(※ここのパスはXAMPPをインストールしたときデフォルトのままならこのパスです。)

mysql -u sample_user -p

sample_pass

use sample_db;

create table question_tb

(question_id int(4) primary key auto_increment,
purchase_date varchar(10),
purchase_price int(8),
star int(1),
lang_php boolean,
lang_perl boolean,
lang_java boolean,
lang_cs boolean,
lang_cpp boolean,
lang_basic boolean,
job varchar(30),
entry_date timestamp);
↑コマンドプロントに入力していきます。
create table でテーブルの作成。question_tbはデータベース名なので自分で決めます。
question_idはフィールド名なので自分で決めます。
int(4)はデータ型(バイト数)
primary key(テーブル内で重複しないフィールドに設定する。※これはよくわかりせん。データを除去したときまたここにデータが入らないようにする?ですかね?)
auto_increment(自動的に連番を振ってくれる。)
purchase_dateはフィールド名なので自分で決めます。たぶん。
varchar(10)はデータ型(バイト数です)。
lang_何たらはフィールド名なので自分で決めます。
booleanは真偽値です。
jobもフィールド名なので自分で決めます。
entry_dataもフィールド名なので自分で決めます。
timestmpはデータ保存時の日時が自動的に保存されます。

まとめてみました↓
SQLのデータ型
こんな感じでなってます。真偽値のところが2つあるのですがtinyintはググると難しそうなので、ここでは先に進めます。


describe question_tb;
↑コマンドプロントに入力していきます。
↓describe テーブル名で、作ったテーブルを確認できます。(※画像はクリックで拡大できます。)

作成したテーブルの確認

カレンダー

04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

フリーエリア

にほんブログ村 IT技術ブログ HTML/CSSへ にほんブログ村 IT技術ブログ PHPへ

最新コメント

[11/23 テスト]

プロフィール

HN:
おやっさん
性別:
非公開

バーコード

ブログ内検索

P R

忍者ツールズプロフィール

忍者ツールズプロフィールは終了しました

カウンター