MySQLによる完全外部結合
MySQLでは、FULL OUTER JOINが使えないので、UNIONで複数のSELECT文のデータの取得を行い、その結果を結合して1つのデータとして取得します。
以下の2つのテーブルに対して完全外部結合を行います。
fruits1 (テーブル名)
id | name |
---|---|
1 | リンゴ |
2 | オレンジ |
4 | バナナ |
fruits2 (テーブル名)
id | name |
---|---|
1 | グレープ |
3 | モモ |
4 | イチゴ |
5 | マスカット |
外部結合を使う方法
select f1.id, f1.name, f2.id, f2.name from fruits1 f1 left join fruits2 f2 on f1.id=f2.id union select f1.id, f1.name, f2.id, f2.name from fruits1 f1 right join fruits2 f2 on f1.id=f2.id
結果
id | name | id | name |
---|---|---|---|
1 | リンゴ | 1 | グレープ |
2 | オレンジ | NULL | NULL |
4 | バナナ | 4 | イチゴ |
NULL | NULL | 3 | モモ |
NULL | NULL | 5 | マスカット |
ホストOSからゲストOSにSSHでアクセスする
VMware PlayerにインストールしたUbuntuにopensshサーバーの設定を行い、ホストOSからSSHで接続してリモート操作を行えるようにするための設定方法。
以下の環境で設定を行いました。
ホストOS : windows7
ゲストOS : ubuntu11.10
SSHターミナルソフト : TeraTarm
opensshのインストール (Ubuntuでの作業)
端末を起動して以下のコマンドを実行します。
$sudo apt-get update $sudo apt-get install openssh-server
続いてSSHのモジュールもインストールします。
$sudo apt-get install ssh
opensshのコンフィグファイルの設定 (Ubuntuでの作業)
以下のコマンドでコンフィグファイルを開いて設定の変更をします。
$ sudo nano /etc/ssh/sshd_config
最初の接続方法としてID、PASSWORDの入力方式とするため以下の様に修正します。
PasswordAuthenticationはパスワード認証を許可するかどうかの設定。
#PasswordAuthentication yes (コメントを解除する) ↓ PasswordAuthentication yes
configの設定を変更した後は内容を適用させる為、以下のコマンドを実行します。
$sudo invoke-rc.d ssh reload
TeraTermの設定 (Windowsでの作業)
TeraTermを起動すると以下のダイアログが表示されるので、ホストにUbuntuのIPを入力して、SSHバージョンをSSH2に設定して「OK」をクリック。
※UbuntuのIPアドレスの確認方法はUbuntuの端末に「ifconfig」と実行して、「inetアドレス」に記述されている数字です。
続いて以下のダイアログが表示するのでユーザー名とパスフレーズをそれぞれ入力して、「プレインテキストを使う」にチェックをして「OK」をクリック。
以下の様に接続されていれば成功です。
これでクライアント(Windows)からUbuntuのサーバーに接続してリモート操作が出来る環境にはなりましたが、パスワードの認証だけではセキュリティ的にもあまりよろしくないので、公開鍵認証で接続する環境を設定します。
公開鍵認証とは何かというと、クライアントで秘密鍵と公開鍵を生成し、公開鍵の方をサーバーに登録することで、クライアントの秘密鍵とサーバーの公開鍵で照合を行い接続を認証するシステムです。
公開鍵と秘密鍵の作成 (Windowsでの作業)
TeraTermのメニューから「設定」→「SSH鍵生成」をクリック。
基本的にはデフォルトでチェックが入っている「RSA」を選択し、「生成」をクリックします。「公開鍵の保存」と「秘密鍵の保存」ボタンがアクティブになるので任意の場所に保存します。
「id_rsa」と「id_rsa.pub」の二つのファイルが出来ます。
「id_rsa」は秘密鍵なのでそのままクライアント側に保存。
「id_rsa.pub」は公開鍵で、こっちをサーバに登録します。
opensshに公開鍵を設定 (Ubuntuでの作業)
先程クライアント側で生成した公開鍵をUbuntuのホームフォルダに転送します。
続いて以下のコマンドを実行します。
$sudo mkdir .ssh(.ssh/ディレクトリがまだ作成されていない場合はこのコマンドを実行して作成します。) $sudo cat id_rsa.pub>>.ssh/authorized_keys
opensshのコンフィグファイルの設定(Ubuntuでの作業)
以下のコマンドでコンフィグファイルを開き設定を変更します。
$sudo nano /etc/ssh/sshd_config
以下の様に設定の変更を行います。
PermitRootLogin no (root ログイン許可) ChallengeResponseAuthentication no (チャレンジ・レスポンス認証) PasswordAuthentication no (パスワード認証) UsePAM no (PAM の使用)
コンフィグの設定をしたら内容を適用させます。
$sudo invoke-rc.d ssh reload
そして再起動をしておく。
$ sudo /etc/init.d/ssh restart
PHPで数値かどうかのチェック
ユーザーから入力された値が10進整数値かどうかのチェックにis_numeric()関数を使用してはいけません。
is_numeric()関数は数字または数値形式の文字列であるかどうかを調べる関数なので、16進数や浮動小数点数の形式であってもtrueを返します。
例えば「0xFF」や「12.34」や「+1」という値が入力されてもtrueを返してしまいます。
なので数値チェックを行うのは正規表現を使用するのがいいかなと思います。
preg_match("/^[0-9]+$/", $num)
というか数値チェックに限らず、ある程度の入力チェックであれば正規表現での記述で十分なんじゃないかなと思います。
でもあんまり長くなると今度は可読性が悪くなるのかな。
XAMPPにZend Framworkをインストール
事前の環境として
●XAMPP Version 1.7.3
●XAMPPのドキュメントルート「C:\xampp\htdocs」
●Zend FramworkのWebアプリケーションのドキュメントルートは「C:\xampp\htdocs\zend」と設定しています
Zend Framworkのインストール
以下のサイトから「Zend Framework 1.11.11 Full」のzip版をダウンロードします。
http://framework.zend.com/download/latest
ダウンロードしたZIPを展開します。ディレクトリ名にバージョン情報があるので削除して「ZendFramework」とします。
今回展開した場所は「C:\xampp\ZendFramework」としました。
(全部のファイルを移動しなくても「ZendFramework-1.11.1」直下の「library」だけでもよいです。)
Zend Framworkライブラリへのパスを通す
php.iniを編集してZend Framworkライブラリを読み込むように設定します。
変更前 include_path = ".;\xampp\php\PEAR" 変更後 include_path = ".;\xampp\php\PEAR.;C:\xampp\ZendFramework\library"
Apacheの設定
Zend Frameworkでは、URL変換にmod_rewriteモジュールを使用するため、mod_rewriteを使えるように設定します。
※XAMPP 1.7.3ではhttpd.confの設定は特に必要ありませんでした。
C:\xampp\apache\conf\httpd.conf
変更前 #LoadModule rewrite_module modules/mod_rewrite.so 変更後(#を削除してコメントアウトを解除するだけ) LoadModule rewrite_module modules/mod_rewrite.so
ドキュメントルートを設定以下に設定
DocumentRoot "/xampp/htdocs"
この後に設定するドキュメントフォルダ内の.htaccessの設定を有効にするため以下の様に設定します。
<Directory "/xampp/htdocs"> AllowOverride All </Directory>
Webアプリケーションのルートを「C:\xampp\htdocs\zend」とするので、そのディレクトリ内に.htaccessファイルを作成して、以下の内容を記述します。
RewriteEngine on RewriteBase / RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php
これで拡張子がjs、ico、gif、jpg、png、css以外のリクエストは全てフロントコントローラ(index.php)に渡されるようになります。
Zend Frameworkの動作確認
ドキュメントルート「C:\xampp\htdocs\zend」にindex.phpを作成し、以下のスクリプトを記述します。
<?php require_once'Zend/Version.php'; echo Zend_Version::VERSION; ?>
ブラウザのURLにhttp://localhost/zend/index.phpを入力してZend Frameworkのバージョンが表示すればこれでインストールと設定は完了です。
VMware PlayerでLAMP環境構築(2)
前回はVMware Playerで仮想環境を作って、その中にLinuxのUbuntu11.10をインストールしました。今回はApache、MySQL、PHPをインストールしたいと思います。
LAMP serverのインストール
まずは端末を起動して、以下のコマンドを実行してtaskselをインストールします。
# sudo -s # apt-get install tasksel
以下のダイアログが表示するので「LAMP server」にチェックして「TAB」キーで<了解>に移動して「Enter」キーを押します。(移動は「矢印」キー、選択は「Space」キー。)
MySQLのrootのパスワードが求められるので入力します。
以上で「LAMP server」のインストールは完了です。
Apacheの動作確認
まず、インストール直後はApacheがPHPを認識しないので、以下のコマンドを実行してApacheの再起動をしておきます。
# service apache2 restart
次にFirefoxを立ち上げて、アドレスバーにhttp://localhostを打ち込むと「It works!」が表示されることを確認します。
UbuntuのtaskselでLAMPサーバーをセットアップした直後のドキュメントルートは、"/var/www"になっています。
Apacheドキュメントルート(/var/www/)の所有者をrootから自分のユーザー名に変更しておきます。
# chown -R [ユーザー名] /var/www/
chownコマンドは、オプションスイッチ "-R" を付けて、ディレクトリを指定して実行すると、そのディレクトリを含めて、以下のディレクトリとファイルの全ての所有者、所有グループを一気に変更することができます。
PHPの動作確認
動作確認用ファイルとしてエディタを開いて以下のPHPファイルを作成します。
<?php phpinfo(); ?>
このファイルを「phpinfo.php」と名前を付けて「var/www」のディレクトリに保存します。
FirefoxのURLに「http://localhost/phpinfo.php」と入力します。以下の画面が表示されるのを確認します。
MySQLの動作確認とphpMyAdminの設定
以下のコマンドを実行し、phpMyAdminをインストールします。
# apt-get install phpmyadmin
途中で設定を聞かれるので「apache2」を選択します。
次に「phpmyadmin のデータベースを dbconfig-common で設定しますか?」と聞かれるので<はい>を選択。
次にパスワードの作成を求められるのでパスワードを入力します。
以上の処理が完了すれば以下のコマンドを実行してApacheを再起動します。
# service apache2 restart
再起動させてからFirefoxのURLに「http://localhost/phpmyadmin」と入力します。以下の画面が表示されます。
最後にexitコマンドを実行してrootから抜けておきます。
# exit
MySQLでのトランザクション
まず前提としてトランザクションの処理を行う時は、テーブルのストレートエンジンをInnoDBに設定します。
(MySQLのデフォルトはMyISAMになっています。)
以下のサンプルはINSERT文を実行して、処理が成功すればコミット、失敗すればロールバックを行っています。
<?php //データベース接続 $conn = mysql_connect('localhost', 'root', ''); if (!$conn) { die("データベース接続失敗"); } //データベース選択 mysql_select_db('test') or die("データベース選択失敗"); //文字コード指定 mysql_set_charset('utf8'); //オートコミットを0に設定 $sql = "SET AUTOCOMMIT = 0"; mysql_query($sql); //トランザクション開始 $sql = "BEGIN"; mysql_query($sql); //INSERT文発行 $sql = "INSERT INTO test(name) VALUES('test')"; $res = mysql_query($sql); if ($res) { //成功時はコミットする $sql = "COMMIT"; mysql_query($sql, $conn); echo "コミットしました"; } else { //失敗時はロールバックする $sql = "ROLLBACK"; mysql_query($sql, $conn); echo "ロールバックしました"; } //mysql切断 mysql_close($conn); ?>
最初にAUTOCOMMITを0にして機能をオフに設定します。デフォルトではAUTOCOMMITの機能はオンになっているので、オンのままだとINSERT、UPDATE、DELETEを実行するとCOMMITする前でもデータは確定されてしまいます。なのでまず最初にAUTOCOMMITの機能をオフにしてからトランザクションを開始します。