PHP & MySQL
  1. 準備するもの

  2. キーワード

  3. セッション管理のサンプル

  4. MySQLデータ表示のサンプル

  5. セッション変数をデータベースに保存する

  6. 郵便番号データをMySQLに取り込む

  7. XOOPS

  8. リンク




1.準備するもの

1. PHP
2. MySQL
3. Apache
4. テキストエディタ (行番号表示、EUC 形式で保存ができるもの)
5. 「ゼロから学ぶWebプログラミング」 日経ソフトウェア編 日経BP社
6. 「PHPポケットリファレンス」 大垣靖男著 技術評論社
7. 「SQLポケットリファレンス」 朝井淳著 技術評論社
8. 他、HTML、JavaScript関係の本


2.キーワード

  1. ≪インストール≫

    • XAMPPの場合
      XAMPPはApache,PHP,MySQL,FileZillaが一括インストールできるソフトウェアです。
      インストール後、[スタートメニュー] → [プログラム] → [Apache Friends] → [XAMPP] → [XAMPP Control Pannel]を実行して、FileZilla(FTPサーバー)の[管理ツール]で、
      1. [Page:]の[Shared Folders]を選択して[ADD]ボタンを押し、初期ディレクトリの設定を行う。
      2. [users]で[ADD]ボタンを押して、FTPクライアントのユーザー名を追加する。
      3. [OK]を押す。
    • 1つずつインストールする場合
      他サイトを参考にしてください。
      mbstring 関数(日本語の使用)を使うときは、mbstring モジュールを追加します。
       WindowsにPHPをインストールするときは、バイナリのZIPファイルのものにすると、モジュールの追加がphp.iniを修正するだけで済みます。
       MySQLとPHPの内部コードと表示コードに、SJIS、EUC-JP、UTF-8のいずれかを選びますが、全てSJIS(Shift-JIS)に設定しても動作します。
       但し、SJIS には、このコード特有の問題があるそうです。
       php.iniを修正したら、Apacheを再起動します。
       当サイトのサンプルは、FEDORA CORE 4 又は Windows2000Pro、apache_2.0.58-win32-x86-no_ssl.msi、php-5.1.4-Win32.zip の組み合わせで動作確認しています。
       MySQLとPHPの漢字コードは、両者が異なる場合、PHPの関数でコード変換すると文字化けすることがあったので、SJISまたはEUC-JPで統一しています。

      Windows2000Pro に XAMPP でインストールした場合は、以下の index.php などのサンプルファイルは、C:\Program Files\xampp\htdocs に保存する。
      動作確認は、ブラウザのアドレスに、http://localhost/index.php などと入力する。


  2. ≪セキュリティ≫

     Webアプリケーションは、クロスサイト・スクリプティングやソースの書き換えなどへの対策が必要です。
     文字列長や数値の取り得る範囲の検証も必要です。
     詳しくは、「ゼロから学ぶWebプログラミング」を参照。


  3. ≪セッション管理≫

     ページを閲覧中のユーザーごとのデータをサーバーに保存したいときに使います。
    例:会員制サイト
    ショッピングカート


  4. ≪テンプレート≫

     Smartyのテンプレートを使用すると、PHPのコードとHTMLのデザインを別々のページに出来ます。
     そのため、デザインの変更が容易になります。


  5. ≪トランザクション≫

     データベースで、AとBが同時に同一のデータを開き、Aが保存した後、Bが保存するとAの変更内容が上書き消去されます。
     この問題を回避するには、誰かが閲覧中は他の人はそのデータにアクセス出来ないようにする必要があります。
     SQLのトランザクション命令を使うとそれが可能です。
     他のサイトを参照してください。
     プログラムの組み方次第では、トランザクション命令は使わなくてもできるそうです。
     MySQL の場合は、初期設定で InnoDB に変更します。


  6. ≪PHPの学習≫

      PHPマニュアルを読んで、「ゼロから学ぶWebプログラミング」を読むと大体、分かります。
     HTMLやJavaScriptからデータをPHPに送るときは、$_POSTや$_GETを使います。
     mysql_query() で、MySQLのSQLステートメントをPHPで実行できます。
     サーバー設定によっては、新しく[CREATE DATABASE]で追加することはできない場合があります。




3.セッション管理のサンプル

 以下は、サイトに複数の訪問者が来たときに、ユーザー名を表示するサンプルです。
 セッションID は、クライアントの C:\Documents and Settings\ユーザアカウント\Cookies にWindowsユーザー名@サーバー名.txtで、$_SESSION 変数は、サーバーの C:\Windows\Temp に、sess_セッションID というファイル名で保存されます。
 どちらも、テキストエディタで見ることができます。
 php.ini の session.cookie_lifetime を、0 に設定しているときは、クッキーはブラウザが再起動されるまで保存されます。
 session_cache_limiter() と session_cache_expire() は、ブラウザがオフライン状態でも[戻る]ボタンで戻れる関数です。「ページの有効期限切れ」という表示が出ることもあります。
 サーバーによっては、以下のスクリプト内の Shift_JIS を EUC-JP に変更して、EUC 形式で保存する必要があります。

index.php
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=Shift_JIS">
<title>訪問者の表示</title>
</head>
<body>
    <div align="center"
        <p align="center">ユーザー名を入力してください</p>
        <form method="POST" name="form" action="index.php" enctype="multipart/form-data">
            ユーザー名:<input type="text" name="id">
            <input type="submit" value="OK">
        </form>
    </div>
</body>
</html>
<?php
    if(!$_POST['id']){
        exit;
    }
    session_name('VISITOR');
    session_cache_limiter('nocache');
    session_start();
    $_SESSION['id'] = addslashes($_POST['id']);
    
    header('Location: page1.php');
?>
		

page1.php
<?php
    session_name('VISITOR');
    session_cache_limiter('nocache');
    //セッション開始
    session_start();
    if(!$_SESSION['id']){
        session_destroy();
        setcookie('VISITOR','');
        header('Location: index.php');
        exit;
    }
    //訪問者の表示
    $_SESSION['url'] = $_SERVER['PHP_SELF'];
    print('<h2 style="color:blue">ページ1</h2><br>');
    print('このページの訪問者<br><br>');
    $dir = dir(session_save_path());
    while(($ent = $dir->read()) !== false){
        if(!ereg('\.',$ent)){
            $sess_file = session_save_path()."/".$ent;
            if($fp = fopen($sess_file, "r")) {
                $sess_data = fread($fp, filesize($sess_file));
                $s = explode('"',$sess_data);
                if($s[3] == $_SERVER['PHP_SELF']){
                    print($s[1]." さん<br>");
                }
                fclose($fp);
            }
        }
    }
    print($_SESSION['id']." さん<br>");
?>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=Shift_JIS">
<title>訪問者の表示</title>
</head>
<body>
    <br>
    <a href="page1.php">ページ1</a> <a href="logout.php">ログアウト</a>
</body>
</html>
		

logout.php
<?php
    session_name('VISITOR');
    session_cache_limiter('nocache');
    session_start();
    session_destroy();
    setcookie('VISITOR','');
?>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=Shift_JIS">
<title>訪問者の表示</title>
</head>
<body>
    <div align="center" style="margin-top:50px">ログアウトしました<br><br>
        <b><span style="color:blue">
        <u onClick="window.history.back()"
        onMouseover="this.style.cursor='hand'">戻る</u>
        <u onClick="window.close()" 
        onMouseover="this.style.cursor='hand'">閉じる</u>
        </span></b>
    </div>
</body>
</html>
		


4.MySQLデータ表示のサンプル

 以下は、MySQL のデータを表示するサンプルです。
 JavaScript を使っています。
 サーバーによっては、3 行目の Shift_JIS を EUC-JP に変更して、EUC 形式で保存する必要があります。

show_mysql.php
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=Shift_JIS">
<title>MYSQLのデータ表示</title>
<style type="text/css"><!--
body    {font-family:'MS ゴシック'}
--></style>
<script language="JavaScript"><!--
    db = new Array();
    tbl = new Array();
    for(i=0;i<100;i++){
        tbl[i] = new Array();
    }
<?php
//*******************************************************************************
    $server = 'localhost';
    $user = 'root';// MySQLのユーザー名を入れます
    $pass = '';    // MySQLのパスワードを入れます
//*******************************************************************************
    
    $con = mysql_connect($server, $user, $pass);
    if(!$con){
        exit("$serverに接続できません。<br>");
    }
    $dbs = mysql_List_dbs($con);
    $i = 0;
    while($row = mysql_fetch_row($dbs)){
        print'db['.$i.'] = "'.$row[0].'";';
        mysql_select_db($row[0],$con);
        $tbl = mysql_List_tables($row[0],$con);
        $j = 0;
        while($row = mysql_fetch_row($tbl)){
            print'tbl['.$i.']['.$j.'] = "'.$row[0].'";';
            $j++;
        }
        $i++;
    }
    mysql_free_result($dbs);
    mysql_free_result($tbl);
    mysql_close($con);
?>
    function db_show()
    {
        var html = '<select name="n_db" onChange="tbl_show(this.selectedIndex)">';
        for(i=0;i<db.length;i++){
            html += '<option value='+db[i]+'>'+db[i];
        }
        html += '</select>';
        document.getElementById('t_db').innerHTML = html;
    }
    
    function tbl_show(n)
    {
        var html = '<select id="n_tbl" name="n_tbl">';
        for(i=0;i<tbl[n].length;i++){
            html += '<option value='+tbl[n][i]+'>'+tbl[n][i];
        }
        html += '</select>';
        document.getElementById('t_tbl').innerHTML = html;
    }
--></script>
</head>
<body onLoad="db_show();tbl_show(0);">
    <div align="center">
    <form action="show_mysql.php" method="POST" enctype="multipart/form-data">
        <table border="0">
            <tr>
                <td align="right">データベース名:</td>
                <td><div id="t_db"></div></td>
            </tr>
            <tr>
                <td align="right">テーブル名:</td>
                <td><div id="t_tbl"></div></td>
            </tr>
            <tr>
                <td align="right"><input type="submit" value="データ表示"></td>
                <td></td>
            </tr>
        </table>
    </form>
    </div>
</body>
</html>
<?php
    // データの表示
    if(!$_POST['n_db'] || !$_POST['n_tbl']){
        exit;
    }
    $_POST['n_db'] = mysql_escape_string($_POST['n_db']);
    $_POST['n_tbl'] = mysql_escape_string($_POST['n_tbl']);
    $db = $_POST['n_db'];
    $tbl = $_POST['n_tbl'];
    print"データベース名:";
    print_r($_POST['n_db']);
    print"<br>テーブル名:";
    print_r($_POST['n_tbl']);
    print"<br><br>";
    $con = mysql_connect($server, $user, $pass);
    if(!$con){
        exit("$serverに接続できません。<br>\n");
    }
    mysql_select_db($db,$con);
    $sql = "select * from ".$tbl;
    $res = mysql_query($sql);
    if(!$res){
        exit("データを取り出せません。<br>\n");
    }
    while($row = mysql_fetch_assoc($res)){
        print_r($row);
        print"<br><br>";
    }
    mysql_free_result($res);
    mysql_close($con);
?>
		


5.セッション変数をデータベースに保存する

 $_SESSION 変数は、デフォルトでは、C:/Windows/Temp に保存されるようになっていますが、これをオーバーライドす(自作関数で置き換え)ることができます。

 データベースなどへの読み込みや保存の関数を作成し、session_set_save_handler 関数にそれらを登録することで実現します。
 各関数を、いつ使うかは、PHP が勝手に判断します。
 関数名は、自由に決められますが、登録する順番は決まっています。
 オープン、クローズ、読み込み、書き込み、削除、ガーベジコレクションの順です。
 各関数の引数も、予め、決まっています。
 セッション開始前に、session_module_name('user'); が必要らしいです。

 PostgreSQL への保存のサンプルは、「PHPポケットリファレンス」p.590 にあります。
 MySQLバージョンはこちら



7.郵便番号データをMySQLに取り込む

 最新の郵便番号をダウンロードしてMySQLに読み込んでみましょう。

 ファイルサイズが大きいため、サーバーがLinux の場合、php.iniファイルの
    max_execution_time
    max_input_time
    memory_limit
 の各値をデフォルトよりも大きく設定しなおす必要があります。
 EUC形式で保存します。
 KEN_ALL.CSV も予め、テキストエディタでEUC形式に保存しなおします。

 サーバーに複数のユーザアカウントが登録されている場合は、ファイルやフォルダを作成したユーザがそれらの所有者になってしまい、他のユーザが、それらのファイルやフォルダを編集したり移動したりできなくなりますので、注意が必要です。
 所有者または管理者権限のユーザであれば、それらを右クリックして[アクセス許可]または[アクセス権]などのタブをクリックすると、所有者やアクセス権を変更することができます。
 また、WindowsXp の場合は上書き保存すると、そのユーザが新しい所有者となります。

index.php
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=EUC-JP">
<title>郵便番号</title>
</head>
<body>
<?php
    $server = 'localhost';  // サーバー名
    $user = 'root';         // ユーザー名
    $pass = '';             // パスワード
    $db = 'zipcode';        // データベース名
    $tn = 'tbl_1';          // テーブル名
    
    $con = mysql_connect($server, $user, $pass);
    if(!$con){
      exit("".$server." に接続できません。<br>\n");
    }
    $r = mysql_query("CREATE DATABASE ".$db);
    mysql_select_db($db);
    $r = mysql_query("CREATE TABLE ".$tn." (
        xzip varchar(255) not null,
        xaddr1 varchar(255) not null
    )");
    
    function addCsv($fn,$tn){
        $fp = fopen($fn,'r');
        if(!$fp){
            mysql_close($db);
            exit("ファイルの読込失敗 !<br>\n");
        }
        while($res = fgetcsv($fp,1024)){
            for($i=2;$i<9;$i++){
                $res[$i] = mysql_escape_string($res[$i]);
            }
            $s1 = '"'.$res[2].'","'.$res[6].$res[7].$res[8].'"';
            
            $r = mysql_query("INSERT INTO ".$tn." VALUES (".$s1.")");
            if($r){
                print(strval($res[2]).'<br>');
            }
        }
    }
    mysql_query("TRUNCATE TABLE ".$tn);
    addCsv('C:\\KEN_ALL.CSV',$tn);  // データファイルは、サーバのCドライブに置きます。
    mysql_close($con);
?>
</body>
</html>
		


8.XOOPS

 XOOPS は、オープンソースのポータルサイト、コミュニティサイト構築ツールです。
 会員制サイトや検索サイトなどを作れます。
 HTML, CSS, PHP(Smarty), MySQL を使って、XOOPS の外観やモジュールをカスタマイズしたり、作成したりできます。

 ≪インストール≫
 XOOPS Cube 公式サイトで、XOOPSをダウンロードします。
 ./docs/INSTALL.ja.htmlがインストールマニュアルです。
 パーミッションは、ffftp で WEBサーバにXOOPS のフォルダ類をアップロード後、右ウィンドウの該当フォルダ、ファイルを右クリックして、属性変更を選択し、[現在の属性]欄の644などの数字を各々変更します。
 XOOPSのインストール方法
 
 ≪使い方≫
     
  1. XOOPS に管理者でログイン。
     
  2. [ユーザメニュー] → [管理者メニュー] → [SYSTEM ADMIN] → [モジュール管理]で使いたいモジュールをインストール。
     
  3. [SYSTEM ADMIN] → [グループ管理] → [ユーザグループの編集] でグループのモジュールに対するアクセス権を設定。
    ゲストは、ログインしていないユーザのアクセス権です。
     
  4. [SYSTEM ADMIN] → [ブロック管理]で、モジュールの表示位置を設定。  
  5. [SYSTEM ADMIN] → [一般設定] → [一般設定]で、デバッグモードを[PHPデバッグ]に設定。(運営時は[オフ]に)  
  6. [SYSTEM ADMIN] → [一般設定] → [ユーザ情報設定]で、[新規登録ユーザアカウントの有効化の方法]を[自動的にアカウントを有効にする]に設定。(運営時は[ユーザ自身の確認が必要(推奨)]に)
 
 ≪モジュールのリンク集≫
 XOOPSモジュール案内所
 
 ≪テーマ、テンプレートのカスタマイズ方法≫
 wervival.net
 [コンテンツ] → [XOOPS] → [XOOPSをリデザインする]

 テーマは、モジュールを含めたXOOPS全体のデザインです。
 テンプレートは、モジュールの各ページのデザインです。
 
 ≪モジュールの作成方法≫
 web-learner.com
 右上の[JAPANESE] をクリック → [XOOPS資料] → [XOOPS開発]

 XOOPS はモジュールにバグ等があると、警告やエラー表示がページの一番下に出ます。(デバッグモードのとき)
 
 ≪Xoops Cube API≫
 XoopsCubeTOKAI
 
 ≪SSL証明書≫
 SSLは、公開鍵暗号方式を採用しているので、運用にはCA の証明書が必要です。
 個人、社内使用限定の場合は、CA の代わりに自分で証明書を発行することもできます。
 
 ≪Google MAPS API≫
 geekなぺーじ
 JavaScript であなたのホームページに Google Map を表示できます。

 ジオコーディング
 テキストボックスに住所を入力すると、位置を表示します。
 


9.リンク