Kozupon.com    
 
 PHP3+PostgreSQLでWebDBしよう!


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                 ← A
Is user "hoge" allowed to add users? (y/n) n                  ← B
createuser: hoge was successfully added

@では、postgresユーザーID番号を設定します。自動NoなのでRETURNでもかまいませんが、番号を入力してもかまいません。
Aでは、このユーザーに新しいデータベースを作成する権限を与えるかどうかを設定します。この場合、"y"を入力します。
Bでは、このユーザーに新しいユーザーを追加する権限を与えるかどうかを設定します。この場合、"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 (              ←A
Tday        date         default current_date not null,         ←B
    Url         text         not null,                       ←C
    Coment      text         not null,                    ←D
    Kanri       text                           ←E
);

@では、すでにTourokuTbと言うテーブルが存在していたら、消します。
Aでは、改めてTourokuTbと言うテーブルを作成します。
Bでは、Tdayというフィールド名で今日の日付を自動入力しています。テーブル型は、日付型です。書き込みが行われると自動的に今日の日付が入力されます。空白は禁止です。
Cでは、Urlというフィールド名でリンク用URLが保存されます。テーブル型はテキスト型です。空白は禁止です。
Dでは、Comentというフィールド名でリンク先の説明文が保存されます。テーブル型はテキスト型です。空白は、禁止です。
Eでは、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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<input TYPE="SUBMIT" VALUE=" 登録 ">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;
<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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<input TYPE="SUBMIT" VALUE=" 変更 ">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;
<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で表組みを行っているだけですので簡単でしょ。
以上で、終わりです。自分なりのデータベースを使ったオリジナルリンク集をお作りください。

最後に、実行結果は実際に動かして自分で確認してください。これまでの、スクリプトは小生が簡単に作った物なので、転載は自由ですし、かまわず使ってください。それでは。

以上


 
 
 



Copyright 2005 Kozupon.com.