2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

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                 ← ②
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>&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で表組みを行っているだけですので簡単でしょ。
以上で、終わりです。自分なりのデータベースを使ったオリジナルリンク集をお作りください。

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

以上

コメント