システム屋日誌

情報システム構築、開発手法を中心に気が付いたことを書き留めます。ちいさなことから、おおきなことまで。もちろん、どうでもいいことも。。。
<< August 2017 | 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 >>
 
RECENT COMMENT
RECENT TRACKBACK
れいねっとHP
http://www.rey-net.com
MOBILE
qrcode
PROFILE
無料ブログ作成サービス JUGEM
 
PHP+SQLite で郵便番号から住所を自動入力する
PHP+SQLite で郵便番号から住所を自動入力するパーツを開発中です。入力フォームに、いちいち住所を入力しなくても、郵便番号をいれれば、都道府県、市区町村まで自動的に入力できるようにするための、バックエンドの仕組みです。

まずは、設計です。
データを管理する方法を考えました。
(1)CSV (テキスト)
(2)MySQL
(3)SQLite

今回、1つだけ、データを取り出せればOK。
CSV だと、ランダムアクセスが不可なので、先頭から順番にシーケンシャル処理して、見つかったら終了するというアルゴリズムになるので、非効率的です。
MySQL を郵便番号だけのために構築するのは、おっくう。
そこで、(2)案に決定。

SQLite は、簡易 RDB です。
MySQL との大きな違いは、データベースの管理が不要なこと。
本格的な RDB を使う場合、プログラムとは別にデータベース定義をする必要がありますが、SQLite はその必要がありません。
SQLite のエンジン部分が、内部的にサーバ上にバイナリファイルを作り、ブラックボックスで管理してくれます。

しかし、MySQL と比べると、速度の面で劣る、ドキュメントが少ないという欠点もあります。

特に INSERT は遅い。localhost でテストしたら、約8000件で数分かかっても終らない。SQLite の公式サイトみると、どうやらトランザクション処理にヒントがあるらしい。
http://www.sqlite.org/lang_transaction.html
速度面は、トランザクションを使えば、劇的に速くなりました。
XAMPPとPEARエラー
XAMPP というインストーラを使って、WindowsXP-pro にApache + PHP + MySQL を一括インストールし、MySQL と phpMyAdmin を手動でアップデートしたら。それが原因かどうか分からないけど、MySQL にアクセスする PHP でエラーが出ました。

データベースをアクセスするとき、PEAR は使っていないのですが。
不思議です。

Fatal error: Cannot redeclare class config in C:¥Program Files¥xampp¥php¥pear¥Config.php on line 43

対策:
C:¥Program Files¥xampp¥php¥pear¥ の下のConfig.phpをリネームしました。
Config.php → Config.php.old

これで、ナントカ動くように・・・でも、PEAR 使ったらどうなるかは動作確認していません。


参考URL:
http://pear.php.net/bugs/bug.php?id=7354
MySQL データの引越しメモ
本日は、テスト環境を構築するため、
MySQLデータを丸ごと自社のローカルサーバへ引越し。
ホスティングサービスを使っているので、phpMyAdmin を利用して引越ししました。



続きを読む >>
MySQLバージョンアップで文字化け解消
XAMPP というインストーラを使って、WindowsXP-pro にApache + PHP + MySQL を一括インストールしています。
「WindowsXP に Apache+PHP+MySQL を一括インストールする方法」
→ http://technology.rey-net.com/?day=20060623

そこそこ動いていたので、古い環境のまま使っていました。しかし・・・ついに手詰り。PHPで作成したフォームの日本語の文字化けが、直らないのです。。。データベース、テーブル、PHP の文字コードの組み合わせを色々変えて見たけれど、だめ。でも、外部ホスティングサービスで試すと、ちゃんと文字が表示されます。

□ 外部ホスティングサービス = ちゃんと文字が表示される
□ 自分のPC上の localhost = 文字化けする

環境の違いを調査したら、MySQL のバージョンが違うことを発見。自サーバ(localhost)は、4.n、サーバは5.0。

そこでMySQLとphpMyAdmin をアップグレードすることに。XAMPP で以前にインストールした環境はそのまま残して、環境切替で使えるようにしました。

【MySQL】
(1)公式サイトから5.0.37-community-ntのインストーラをダウンロード。
  http://dev.mysql.com/downloads/mysql/5.0.html#win32
  Windows 無償版インストーラ (Windows Essentials (x86))   
  ファイル名 mysql-essential-5.0.37-win32.msi
(2)MySQL サービスを停止
(3)wクリックでインストーラを起動。
   カスタムインストールで、フルオプション選択。変更点は以下のみ。
  インストール先 C:¥Program Files¥xampp¥mysql5
  ※XAMPP でインストールした MySQL4.n は、
   C:¥Program Files¥xampp¥mysqlにあります。
(4)コントロールパネル-管理ツール-サービスで、MySQL5 のサービスを起動(動作確認)

【phpMyadmin】
(1)公式サイトからファイルをダウンロードし、解凍。   
   http://www.phpmyadmin.net/home_page/downloads.php
   all-languages を選択
   本日は、phpMyAdmin 2.10.0.2 のall-languages.zipをダウンロード
(2)解凍したファイルを動作環境へ移動
   C:¥Program Files¥xampp¥phpmyadmin2
   ※旧phpmyadminは、C:¥Program Files¥xampp¥phpmyadminにあります。
(3)Apache のエイリアスを設定
Alias /phpmyadmin2 "C:/Program Files/xampp/phpMyAdmin2/"

Order allow,deny
Allow from all

(4)動作確認
   http://localhost/phpmyadmin2/ を開く
   phpmyadmin ツールが起動すれば、OK

これで、文字化け解消!
phpmyadmin で INNNO型テーブル も生成できるようになりました。
前の版では、INNNO型が選択できませんでした。

↓文字化けあり


文字化けあり

↓文字化けなし


文字化けなし


続きを読む >>
Ajaxでサーバと同期通信する
Ajax のエンジンはいくつかありますが、私は prototype.js を愛用しています。その理由は、私が利用する機能の必要最低限は満たしているし、使い方がシンプルでエンジン部分が安定しているから。もし、システム要件に足りない機能があれば、自作すれば事足りてしまいます。元々Ajax はJavascript などの従来技術の組み合わせなので。

prototype で最も良く使うのが、HTML ファイル内でのサーバとの通信。ユーザの獲得したポイント数など、ちょっとだけデータベースの内容をチェックするときに便利です。Ajax を使わないと、少量のデータを取り出すたび、フォームを再描画するので・・・面倒です。

↓prototype の公式マニュアル(関数リファレンス、英語)
http://www.prototypejs.org/api/

■非同期通信
prototype のサーバ通信は、基本的に非同期で行います。
HTML から Javascript(Ajax)を呼び出し、Webサイトの制御権をサーバ側に移します。その間、HTML(クライアント側)は、ハンドラ関数を仕掛けて待ちます。


クライアント(HTML)     サーバ(PHP、Perlなど)
(1)Ajax Request −−→ (2)サーバ側スクリプト実行
                   ↓
 (この間、クライアントはハンドラ関数でサーバの応答待ち)
                   ↓
(4)ハンドラ関数実行←−− (3)サーバ側のスクリプト完了


つまり、(1)〜(4)までの間に、クライアントとサーバで処理が切りはなれるわけです。サーバがダウンしたら、応答は返らなくなります。その時、困らないように、クライアント側では、サーバが応答を返さない場合、ある一定時間で処理を中止します(調べていませんが、Ajaxエンジン内でタイムアウト処理していると思います)。

■同期通信   
prototype では、(1)〜(4)まで、クライアントが動きを止めて、サーバの応答を待って処理する方法(同期)も提供しています。ただし、推奨されていません。その理由は、サーバがレスポンスを返さない場合、クライアント側がフリーズしてしまうからです。
以下、非同期処理と同期処理のクライアント側サンプルです。
続きを読む >>
セッションとセキュリティ 
インターネット上でPC(クライアント)とWebサーバがデータをやり取りする方法の一つに「セッション」があります。セッションは、クライアント側のクッキーやサーバ側に書き込むセッションを使って、Web上で交換されるデータを識別します。セッションを使った場合、システムに脆弱性(ぜいじゃくせい)が生じることがあります。セッション脆弱性を防ぐ方法をメモにまとめました。

セッションは、WebサーバとHTTP のやり取りを行っているブラウザの1つ1つに用意されます。ショッピングカートを利用しているとき、別の商品ページに移動してもカートの中身が維持されているのは、セッションを使ってブラウザのデータを記録しているからです。

セッション管理は、サーバ側で管理するやり方と、クライアントPC側のクッキーで管理する2種類の方法があります。

サーバ側で管理する場合、クライアント側のクッキーを使いません。携帯電話などは、クッキーが使えないので、サーバ側でセッションを管理します。しかし、セッションをサーバ側に残しておくことで、セキュリティ上の問題が発生します。

それは、セッションを作成したクライアント(ブラウザ)が特定できないため、作成した本人以外でも、セッションに書き込まれた情報をみることができてしまいます。クライアント側のクッキーを有効にすれば、どのPCのどのブラウザか特定できます。万が一、セッションを作成したブラウザ以外がショッピングカートの途中に入り込もうとしても、セッションが無いので、エラーにすることができます。

クライアント側のクッキーを有効にするための対策は以下のような方法が考えられます。ひとつは、ユーザにクッキーの利用を促す措置。もうひとつは、クライアント側でのみ、セッションを管理するように、プログラム上で設定を変更します。

1、クライアントがクッキーを使っていない場合、警告を出す。
 クッキーを利用していないユーザに対して、ショッピングカートなど、
 セッションを利用した機能が使えない内容のメッセージを出します。
 具体的には、HTML ファイルが読み込まれたとき、やフォーム送信時
 などに Javascript で警告を出します。
 function check_cookie()
 {
 if (!navigator.cookieEnabled) {
 alert("クッキーへの書き込みができません");
 return;
 }
 }
ちなみに、デバッグ時など、現在クッキーに何が書き込まれているか確認するには、以下のコードを使ってみてください。
 alert(document.cookie);

セッションID がクッキーに書き込まれている場合、PHPSESSID=セッションIDと表示されます。

 例)PHPSESSID=28e3d6d6b5c22792068c258520a01014

2、サーバ側でセッション処理を開始する前に、PHP設定を変更する。
 <?PHP
ini_set('session.use_only_cookies', 1); // 常にユーザのクッキーを有効にする

session_start(); // セッション開始
:
?>

session_start()のみを実行すると、セッションを作成したクライアント以外でも、セッションを保存した情報を見ることができます。セッションにひも付く値にするためには、クライアント側のクッキーを有効にして、クライアント側にセッションID(SID)を保存する必要があります。ini_set()は、PHPの環境変数をモジュールが有効な間、動的に変更することができます。

クッキーが使えない携帯電話の場合はどうなるか。。
調査してしてみます。

参考URL:http://jp.php.net/manual/ja/ref.session.php
参考文献:
PHPサイバーテロの技法―攻撃と防御の実際
MySQLのテーブル型
私はLAMP(Linux+Apache+MySQL+PHP)でWebサーバを構築することが最も多いです。そこで、他の開発者と話をしていてもっとも説明が難しいのがデータベース。自分の知識の整理もかねて、データベースに関するメモ書きをしていこうかと思いました。

今回は、テーブル型について。
MySQLでは、複数のテーブル型(BDB、HEAP、InnoDB、MyISAM)が使えます。MySQL が標準で使う型は、MyISAM型です。例えば、phpMyAdmin でテーブルを生成すると、自動的にこの型になっています。

各テーブル型は、それぞれ特徴があり、用途をます。

トランザクション処理 InnoDB型・BDB型
一時テーブル  HEAP型
外部キー    InnoDB型
BLOB/TEXTデータ型  MyISAM型

トランザクション処理とは、データベース上で複数の処理を一括で行うことです。処理結果は、失敗か成功かの2つに1つの結果が返されます。データベースのACID特性のA、原始性(Atomicity)を保つために必要な機能です。
ACIDのその他の特性も、MySQLのトランザクション処理によって実現できます。

【一貫性(Consistency)】
 開始時と終了時にデータベースが整合性を保つ
  →MVCC(多版型同時実行制御)
【隔離性または独立性(Isolation)】
 当該処理が、他の処理から完全に隔離される
  →細かい粒度のロック
【耐久性または永続性(Durability)】
 成功した処理はいつまでも残り、取り消されない
  →トランザクションログの取得(ログ法)とクラッシュリカバリ

外部キーは、複数のテーブル間で親子関係を作るときに便利です。親テーブルのレコードを処理すると、親テーブルにリンクした子テーブルの関連レコードも自動的に処理することができます。例えば、親テーブルのレコードを削除したとき、子テーブルの値も削除することができます。InnoDB型以外を使った場合、Web アプリケーションで親子間で関連するレコードを削除するロジックを考える必要があります。

BLOBは、大量のバイナリデータを格納することができるデータ型です。

参考文献:
MySQL全機能リファレンス
MySQLの環境設定に挑戦
Winodws環境に ApacheベースのWebサーバを構築するとき、xampp というインストーラを使っています。xampp は、Webサーバに必要な環境が一気にインストールできてしまうので大変ありがたいです。ところが、phpMyAdmin(MySQL を管理するための GUI ツール)や winmysqladmin(MySQLの環境を管理するための GUI ツール)が一部動作しません。これを解決しないと、先に進めない問題がでてきました。現在、試行錯誤しながら両ツールの完動を目指しています。

問題というのは、MySQL のテーブル型と基本の文字コードが指定できないということ。今回のWebアプリケーションでは、以下の環境を使いたいのです。

1、文字セットと照会順序 ujis_japanese_ci
2、MySQL テーブル型 InnoDB

しかし、1は phpMyAdmin の画面表示や SQL の SHOW VARIABLES で見る限り「UTF-8」なのです。
テーブルを生成しても、InnoDB型は選べません。
phpMyAdmin

MySQL の公式マニュアルでは、以下のような説明が書いてあります。

-------------------------------------
Windows では、MySQL はデフォルトオプションを以下のファイルから読み取ります。

ファイル名 用途
windows-directory¥my.ini グローバルオプション
C:¥my.cnf グローバルオプション

windows-directory は Windows ディレクトリの保存場所です。
-------------------------------------
詳しくは:http://dev.mysql.com/doc/refman/4.1/ja/option-files.html

windows-directory(C:¥Windows)の下を見たら、my.ini がありました。
確かに、winmysqladmin で設定を保存すると、 C:¥Windows¥my.ini に書き込まれます。
でも、winmysqladmin のその他の画面は内容が全く表示されません。

そこで、以下の設定を変更しました。

1.システム変数のパスを通す
 Windows 環境変数の PATH に MySql をインストールしたフォルダを追加
 手順は以下の通り。
 ・「マイ コンピュータ」-「プロパティ」-「詳細設定」タブを開く
 ・「環境変数」ボタンをクリック
 ・システム環境変数の最後に、MySql をインストールしたフォルダを追加
  変数の間は半角セミコロン「;」で区切ります
  私の場合は、「C:¥Program Files¥xampp¥mysql」です。
  ..%SystemRoot%¥system32;%SystemRoot%...;C:¥Program Files¥xampp¥mysql¥

2.winmysqladmin 再起動
 MySQL のアカウント・パスワードを聞かれます。
 私は、root でログインしました。それ以外は試していません。

結果:
 先ほどは、内容が表示されなかった画面に、ちゃんと内容が出ています。
 環境設定の内容は、相変わらず C:¥Windows¥my.ini に書き込まれますが。
GUIに環境変数が表示される

上記の問題を解決できるのは、まだ先になりそうですが。
ちょっとずつ進むぞ。。

データベースの既存データをチェックしてから追加する方法
Webアプリケーションからデータベースに新しくデータを追加するとき、
次のような手順をプログラミングします。

1、新しいデータがすでに登録されている(重複あり)かどうかチェック
2、既存データが無ければ、INSERT
3、既存データが在れば、UPDATE
4、INSERT / UPDATE が正常に完了したかどうかチェックする

このロジックは、ものすごーくよく使います。

私は、PHP + MySQL でWebシステムを構築することが多いのですが、
PHP の MySQL 関数は、上記のピッタリの機能がありません。
これは、自分でクラスを使うべきなのか、PEAR 等のライブラリを利用するか。検討してみました。

安定したアリモノを使うのが一番と考え、
既存のDBライブラリやクラスを探してみました。
PHP標準ライブラリ(拡張)と、PHP のライブラリを集約した Pearのデータベース関連。

PHP標準ライブラリ
dbx 関数-->ない
http://au3.php.net/manual/ja/ref.dbx.php

PearのDBクラス-->ない
http://pear.php.net/manual/ja/package.database.db.php

PEAR::DB_DataObject-->ない
http://pear.php.net/manual/ja/package.database.db-dataobject.php


上記1〜4を一発で実行してくれる機能は無いですね。
汎用的に使えないからライブラリ化していないのね・・・
やはり、自分でクラスまたは関数化するのがよさそう。

突然、話が変わりますが。

Pear は以前良く使っていました。
Pear は、他のDBに乗り換えるとき、アプリケーションを書き換えないで移行できるので便利なのですが。
最近は MySQL が多いので、使わなくなってしましました。
dbx 関数も、Pear のようにDBを意識しないでアプリケーションを開発するためのライブラリです。
ただし、PHP 標準とはいえ拡張モジュールなので、インストールが必要です。

phpMyAdminを使ってデータベースをコピーする(2)
前回に引き続き、phpMyAdminを使ってデータベースをコピーする方法の紹介です。前回は、同じサーバ内でデータベースをコピーする方法、今回は違うサーバへコピーする方法です。

2.phpMyAdminを使って、異なるサーバにデータベースをコピーする方法

(1)CREATETABLE用 SQL 生成
 1.上部のメニューで「サーバー:」を選択
 2.MySQLメニューの「エクスポート」のリンクを選択
 3.「エクスポート」リストから、バックアップするサーバを選択
 4.以下のオプションで「実行」ボタンをクリック
  
  エクスポート
  ●SQL
  
  SQL オプション
  ■構造:
   ■「DROP TABLE」を追加する
   ■「IF NOT EXISTS」を追加する
   ■「AUTO_INCREMENT」値を追加する
   SQL エクスポート互換: NONE
  ■データ:
   ■完全な INSERT 文を作成する
   ■バイナリフィールドは 16 進数を使用する
   エクスポート形式: INSERT
  □ファイルで保存する
  ■圧縮
   ●無し
  エンコーディングへ変換する
   ●non
  
 5.画面に表示された SQL 文をテキストエディタにコピー&ペースト
 6.上部にある、CREATE DATABASE 文を削除する。
   #これがあると、後で生成する新データベースにテーブルが
    生成できません。
 7.ファイル保存(念のため)

(2)DB生成
 1.上部のメニューでサーバー: を選択
 2.「新しい DB を作成します。 」で、以下の内容を入れて
データベース名
照会順序 (コピー元のDBと一致する文字コード選択 例: ujis_japanese_ci)

(3)テーブル・データ生成
1.上部のメニューで新しく生成したデータベースを選択し、
   「SQL」タブをクリック
 2.「 データベース xxx にSQL 照会を実行する:」で、
   手順(1)のSQL文をペーストする
   ※ファイル読み込みだと、ファイルを保存するときの文字コードが
    トラブルの原因になるので、大きなデータでなければ、コピー&
    ペーストがお勧めです。もし、大容量データであれば、日本語の
    文字コードに十分注意してファイル保存、読み込みをお勧めします。
   MySQL で扱う日本語文字コードは、UTF-8、japanese_ci(EUC-JP)、
Shift-JIS の3つがあります。

以上です。

違うサーバへコピーする場合、少し複雑ですが。
PHP プログラムを自作するより簡単だと思います。