PHP3+PostgresqlでのWebDBを例を交えて体験してみる。超初心者向けネタだぜ。
1. PHP3とPostgreSQLの準備は?いったい何を作るの?
1) インストールは・・・。
PHP3とPostgreSQLのインストールは別コーナーとして、説明してあるのでここでは、PHP3のプログラミングとPostgreSQLのDB構築について話を進めます。
2) 簡単なWeb DB作ろう!
ここでは、小生のHPのおすすめリンク集で作ったPHP3スクリプト+PostreSQL DBのコーディングとデータベース構築の方法を紹介します。みなさんの参考になれば幸いと存じます。
2. さて始めよう!
1) DBユーザー登録
PostgreSQLの最高権限は”postgres”と言うユーザーが持っています。したがって、DB関係の操作は全てpostgresユーザーでログインして行います。DBの起動、ユーザー登録等の処理ももちろんpostgresユーザー権限で行いますので、良く覚えておいてください。
まず、DBはすでに起動してある物として話を進めます。データベースを作成するには、まずDBを作成できるユーザーを登録しなければなりません。やってみましょう!
# su – postgres ← rootからpostgresユーザーにログイン
$ createuser hoge ← hogeと言うDB作成権限を持ったユーザーを作成する
Enter user’s postgres ID or RETURN to use unix user ID: 500 → 500 ← ①
Is user “hoge” allowed to create databases (y/n) y ← ②
Is user “hoge” allowed to add users? (y/n) n ← ③
createuser: hoge was successfully added
①では、postgresユーザーID番号を設定します。自動NoなのでRETURNでもかまいませんが、番号を入力してもかまいません。
②では、このユーザーに新しいデータベースを作成する権限を与えるかどうかを設定します。この場合、”y”を入力します。
③では、このユーザーに新しいユーザーを追加する権限を与えるかどうかを設定します。この場合、”n”を入力します。
コラム:
ちなみに、登録したユーザーを削除したい場合は、
$ destroyuser hoge
又は
$ dropuser hoge
これで削除できます。参考までに・・・。
2) データベースの作成
次に、実際にデータベースを作成してみます。
# su – hoge ← 先ほど、ユーザー登録したhogeでログインします
$ createdb ulink ← ulinkと言う名前のデータベースを作成します
コラム:
ちなみに、登録したデータベースを削除したい場合は、
$ destroydb hoge
又は
$ dropdb hoge
これで削除できます。参考までに・・・。
但し、間違って消さないでくださいね。
3) psqlを使う!
PostgreSQLには、データベースにアクセスして、テーブルの作成、SQLコマンドの発行などが直接出来るコンソールアプリケーションが付属しています。Oracleを経験した人は、ご存じだと思いますがOracleでは、PLSQLという名前の同じアプリケーションが付属しています。
それでは、起動してみましょう。
$ psql -n ulink ← hogeユーザのままで実行してください
ここで、-nはGNUのreadlineライブラリの無効化を行うスイッチです。このライブラリは日本語を通さないため、無効化しておきます。
psqlのコンソールモードになったはずです。このままでは、まだテーブルを作成していないのでとりあえず、終了します。
=> \q
これで終了します。さらに、\コマンドのヘルプは”\?”で一覧表が表示されます。
4) テーブルを作成する
データベースを作成したら、当然テーブルを作成しなければなりません。psqlのコンソール画面でテーブルを作成することは可能ですが、テーブル項目をいちいち入力しているのは手間がかかりますし、間違ったとき、面倒なので”Touroku.sql”と言うテキストファイルに項目と定義型を宣言して一挙にテーブルを作成してしまいます。この、Touroku.sqlファイルの中身は以下です。
drop table TourokuTb; ←①
CREATE TABLE TourokuTb ( ←②
Tday date default current_date not null, ←③
Url text not null, ←④
Coment text not null, ←⑤
Kanri text ←⑥
);
①では、すでにTourokuTbと言うテーブルが存在していたら、消します。
②では、改めてTourokuTbと言うテーブルを作成します。
③では、Tdayというフィールド名で今日の日付を自動入力しています。テーブル型は、日付型です。書き込みが行われると自動的に今日の日付が入力されます。空白は禁止です。
④では、Urlというフィールド名でリンク用URLが保存されます。テーブル型はテキスト型です。空白は禁止です。
⑤では、Comentというフィールド名でリンク先の説明文が保存されます。テーブル型はテキスト型です。空白は、禁止です。
⑥では、Kanriというフィールド名でリンク先の管理者名が保存されます。テーブル型はテキスト型です。
さて、実際にテーブルを作成しましょう!
$ psql -f Touroku.sql ulink
これで、エラーが出なかったら、成功です。
確認してみましょう。
$ psql -n ulink
=> \d TourokuTb
フィールド名とテーブル型が表示されたらOKです。
5) Web上からデータベースにアクセスできるようにする
データベースの準備は出来ましたが、この状態ではまだWebからデータベースにアクセスできません。したがって、以降の処理を行います。
Web上からアクセスするためには、”nobody”と言うDBユーザを作成する必要があります。なぜなら、Web上からのアクセスは、誰でもがDBにアクセスできなければなりません。そのための、ユーザー権限がApacheの場合、nobodyなのです。それでは、ユーザー作成しましょう。
# su – postgres ← rootからpostgresユーザーにログイン$ createuser nobody ← nobodyと言うDB作成権限を持ったユーザーを作成する
Enter user’s postgres ID or RETURN to use unix user ID: 499 → 499
Is user “nobody” allowed to create databases (y/n) n
Is user “nobody” allowed to add users? (y/n) n
createuser: hoge was successfully added
”nobody”ユーザーは、DB作成権限もないユーザーとします。psqlでTourokuTbのアクセス権をnobodyユーザーに移行します。
# su – hoge ← hogeでログインします$ psql -n ulink
=> grant all on TourokuTb to nobody;
これで、アクセス権が移行しました。データベースの準備はこれで終わりです。
6) PHP3スクリプトを作成する(実際のソース作成)
■ URL登録用HTML入力画面の作成
touroku.htmlのソース
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=euc_jp”>
<meta http-equiv=”Content-Language” content=”ja”>
<title>リンク用URL登録フォーム</title>
</head>
<body>
<h2 align=”left”>リンク用URL登録 for Web</h2>
<h3 align=”left”>****** URL登録フォーム ******</h3>
<p align=”center”><br>
</p>
<form ACTION=”touroku.php3″ METHOD=”POST”>
<h3>リンク先のURL : <input TYPE=”TEXT” NAME=”URL” size=”20″><br>
</h3>
<p>コメント : <textarea NAME=”COMENT” ROWS=”10″ COLS=”30″></textarea><br>
</p>
<p>URLの管理者 : <input TYPE=”TEXT” NAME=”KANRI” size=”20″> <br>
</p>
<p>
<input TYPE=”SUBMIT” VALUE=” 登録 “>
<input TYPE=”RESET” VALUE=” 取り消し “> </p>
</form>
<blockquote>
<blockquote>
<blockquote>
<h3><u><a href=”index.php3″>戻る</a></u></h3>
</blockquote>
</blockquote>
</blockquote>
</body>
</html>
まあ、これは単純なHTMLなので、コメントも入れていません。テキスト入力のフォームです。
■ URL登録制御用PHPスクリプト
touroku.php3のソース
<HTML>
<HEAD>
<meta http-equiv=”Content-Type” content=”text/html; charset=euc_jp”>
<meta http-equiv=”Content-Language” content=”ja”>
<TITLE>リンク用URL登録スクリプト</TITLE>
</HEAD>
<BODY><CENTER>
<P><FONT size=”+2″>リンク用URL登録 for Web</FONT><BR>
<P>
<P>
<H3>****** リンク用URL登録完了 ******</B></H3><BR>
<P>
<P>
<?php
//データベースオープン
if ( @pg_connect ( “”,””,”ulink”) == false )
{ // データベース接続
print ( “データベース接続に失敗しました。” );
exit;
}
//入力データチェック
if ( $URL == “” ) //空白は許しません!!
{ // 入力エラー
echo(“URLが記入されていません!!\n</CENTER></BODY></HTML>”);
pg_freeresult( $ret );
pg_close();
exit;
}
if ( $COMENT == “” ) //空白は許しません!!
{// 入力エラー
echo(“コメントが入力されていません!!\n</CENTER></BODY></HTML>”);
pg_freeresult( $ret );
pg_close();
exit;
}
//データを登録する
$qstr = “insert into TourokuTb ( Url, Coment, Kanri ) values (‘<a href=” . $URL . “>”
. $URL . “</a>’, ‘” . $COMENT .”‘, ‘” . $KANRI . “‘)”;
//実際にインサートコマンドを実行する
$ret = pg_exec( $qstr );
if ( $ret == false )
{ // インサートエラー
print ( “テーブル書き込みに失敗しました。” );
pg_freeresult( $ret );
pg_close();
exit;
}
//Commit(データを書き込む)
$qstr = “commit”;
$ret = pg_exec( $qstr );
//登録完了表示
echo “<P>”;
echo “<H3>無事登録完了!入力ご苦労様でした。</H3><BR>\n”;
echo “<P>”;
//DB Close
pg_freeresult( $ret );
pg_close();
exit;
?>
</CENTER></BODY>
</HTML>
このソースは、“//”以降のコメントを参照してください。何をしているかは解ると思います。
特に、エラー処理は各自カスタマイズしてください。あと、PostgreSQLの場合は書き込みは自動的に行いますが、データベースプログラミングの時のくせとして”commit”をかませた方がいいでしょう。
■ URL変更用HTML入力画面の作成
henkou.htmlのソース
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=euc_jp”>
<meta http-equiv=”Content-Language” content=”ja”>
<title>リンク用URL変更フォーム</title>
</head>
<body>
<h2>リンク用URL変更 for Web</h2>
<h3>****** URL変更フォーム ******</h3>
<p align=”center”><br>
</p>
<form ACTION=”henkou.php3″ METHOD=”POST”>
<h3>変更するURL : <input TYPE=”TEXT” NAME=”URL” size=”20″><br>
</h3>
<p>変更するコメント : <textarea NAME=”COMENT” ROWS=”10″ COLS=”30″></textarea><br>
</p>
<p>URLの管理者(必須入力) : <input TYPE=”TEXT” NAME=”KANRI” size=”20″> <br>
</p>
<p>  
;
<input TYPE=”SUBMIT” VALUE=” 変更 “>
<input TYPE=”RESET” VALUE=” 取り消し “> </p>
</form>
<blockquote>
<blockquote>
<blockquote>
<blockquote>
<h3><u><a href=”index.php3″>戻る</a></u></h3>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
これは、URL変更用のHTML入力フォームです。これも、単純なHTMLです。
■ URL変更制御用PHPスクリプト
henkou.php3のソース
<HTML>
<HEAD>
<meta http-equiv=”Content-Type” content=”text/html; charset=euc_jp”>
<meta http-equiv=”Content-Language” content=”ja”>
<TITLE>リンク用URLアップデートスクリプト</TITLE>
</HEAD>
<BODY><CENTER>
<P><FONT size=”+2″>リンク用URL変更 for Web</FONT><BR>
<P>
<P>
<H3>****** リンク用URL変更完了 ******</B></H3><BR>
<P>
<P>
<?php
//データベースオープン
if ( @pg_connect ( “”,””,”ulink”) == false )
{ // データベース接続
print ( “データベース接続に失敗しました。” );
exit;
}
//入力データチェック
if ( $KANRI == “” ) //空白じゃだめよ!!
{ // 入力エラー
echo(“管理者が記入されていません!!必須項目です。\n</CENTER></BODY></HTML>”);
pg_freeresult( $ret );
pg_close();
exit;
}
//Select Command 発行
$qstr = “select Tday from TourokuTb where Kanri='” . $KANRI . “‘”;
$ret = pg_Exec ( $qstr );
if ( $ret == false )
{ // セレクトエラー
print ( “テーブルの抽出に失敗しました。” );
pg_freeresult( $ret );
pg_close();
exit;
}
if ( pg_NumRows( $ret ) )
{
$arr = pg_fetch_array ( $ret, $row );
$Tday = $arr[“tday”];
}
else
{
echo(“管理者名が違います。もう一度!!\n</CENTER></BODY></HTML>”);
pg_freeresult( $ret );
pg_close();
exit;
}
//アップデート処理
if ( $URL != “” ) //URLアップデート!!
{ // URLアップデート
$qstr = “update TourokuTb set Url = ‘<a href=” . $URL . “>” . $URL . “</a>’ where Kanri = ‘” . $KANRI . “‘”;
}
if ( $COMENT != “” ) //コメントアップデート!!
{// COMMENTアップデート
$qstr = “update TourokuTb set Coment = ‘” . $COMENT . “‘ where Kanri = ‘” . $KANRI . “‘”;
}
//実際にアップデートコマンドを実行
$ret = pg_exec( $qstr );
if ( $ret == false )
{ // アップデートエラー
print ( “アップデートに失敗しました。” );
pg_freeresult( $ret );
pg_close();
exit;
}
//データ書き込み
$qstr = “commit”;
$ret = pg_exec( $qstr );
//登録完了表示
echo “<P>”;
echo “<H3>無事アップデート完了! ご苦労様でした。</H3><BR>\n”;
echo “<P>”;
//DB Close
pg_freeresult( $ret );
pg_close();
exit;
?>
</CENTER></BODY>
</HTML>
ここでは、キーをURL管理者にしています。したがって、管理者は必須入力です。アップデート項目はURLもしくは、コメントです。オリジナルで作ったので、これも適当にカスタマイズしてください。
■ URL一覧表示用PHPスクリプト
url.php3のソース
<HTML>
<meta http-equiv=”Content-Type” content=”text/html; charset=euc_jp”>
<meta http-equiv=”Content-Language” content=”ja”>
<HEAD><TITLE>リンク用URL表示フォーム</TITLE></HEAD>
<BODY><CENTER>
<P><FONT size=”+2″>おすすめサイト for Web</FONT><BR>
<P>
<P>
<?php
//データベースオープン
if ( @pg_connect ( “”,””,”ulink”) == false )
{ // データベース接続
print ( “データベース接続に失敗しました。” );
exit;
}
//URLリスト一覧セレクト
$qstr = “select Tday as 登録日付, Url as URL, Coment as コメント, Kanri as サイト管理者名 from TourokuTb”;
//実際にセレクトコマンド実行
$ret = pg_Exec ( $qstr );
if ( $ret == false )
{ // セレクトエラー
print ( “テーブルの抽出に失敗しました。” );
pg_freeresult( $ret );
pg_close();
exit;
}
//URL一覧表示
$rows = pg_numrows ( $ret );
$columns = pg_numfields( $ret );
print(“<table border>\n”);
for ($j = 0;$j < $rows;$j++) {
if ($j == 0) {
print(“<tr>”);
for ($i = 0;$i < $columns;$i++) {
$str = pg_fieldname($ret,$i); // 列名の取り出し
print(“<th>$str</th>”);
}
print(“</tr>\n”);
}
print(“<tr>”);
for ($i = 0;$i < $columns;$i++) {
$str = pg_result($ret,$j,$i); // データの取り出し
print(“<td>$str</td>”);
}
print(“</tr>\n”);
}
print(“</table>\n”);
echo “<P>”;
echo “<BR>現在のPostgreSQL DB URL登録件数です。</BR>\n”;
echo “<P>”;
print(“<H3><U><a href=index.php3>戻る</a></U></H3>\n”);
pg_freeresult( $ret );
pg_close();
exit;
?>
</CENTER></BODY>
</HTML>
このスクリプトで、実際の現在データベースに登録済みの一覧をセレクトして表示します。
特に、selectコマンドを発行して、HTMLで表組みを行っているだけですので簡単でしょ。
以上で、終わりです。自分なりのデータベースを使ったオリジナルリンク集をお作りください。
最後に、実行結果は実際に動かして自分で確認してください。これまでの、スクリプトは小生が簡単に作った物なので、転載は自由ですし、かまわず使ってください。それでは。
以上
コメント