page_adsence

2011年3月9日水曜日

DBDesigner4からMySQLサーバに接続する方法

DBDesigner4から自分のWindowsに入れてあるVMWare上のMySQLサーバに接続しようとした時のログ。

MySQLに接続しようとすると
「 dbExpress Error Invalid Username/password」
というエラーが発生して繋がらなかった。
で、MySQLを見てみたら、外部ホストから接続できるようにしてなかった。

MySQLにログインして、mysqlのDBを選択
GRANT ALL PRIVILEGES ON *.* to ユーザー名@"ホストIP" IDENTIFIED BY 'パスワード' WITH GRANT OPTION;

で、もう一回試してみたら再び同じエラーが…。
ググってみると、いろいろ引っかかってきた。

MySQL4.1以降の認証方式の違いで、MySQLに接続時に必ず
「 dbExpress Error Invalid Username/password」
といったエラーが発生する。
これは
「ユーザー名かパスワードが違う」
というエラーで、認証情報があっていても繋がらない。

これを回避するには以下のSQLを実行する必要がある。
SET PASSWORD FOR 'ユーザー'@'ホスト' = OLD_PASSWORD('新パスワード');
例)
SET PASSWORD FOR 'root'@'Windows上のVMnet8のIP' = OLD_PASSWORD('新パスワード');

で、もう一回接続。
キターーー。

とりあえず、これで問題ないみたいです。
が、PHP5.3以降はこの設定が使えないみたいなので、
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('新パスワード');
とする必要があるみたいです。

非SSLページからSSLページへリダイレクト

非SSLページからSSLにリダイレクトさせたい場合は、ssl.confに記載されている部分には触れずに、
httpd.conf内のバーチャルホストの設定を変更する。

<VirtualHost *:80>
    ServerName ~~~
    ServerAdmin ~~~
    DocumentRoot ~~~
    ErrorLog ~~~
    CustomLog ~~~
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{SERVER_PORT} !^443$
        RewriteRule (.*) https://%{HTTP_HOST}$1 [L,R]
    </IfModule>
</VirtualHost>

赤文字で記載されている部分を追記し、apacheの設定をリロードすればリダイレクトされるようになる。
この設定はポート443以外でアクセスされた全てのリクエストをSSLページにリダイレクトする。
という設定である。
例)
http://test.co.jp/test.phpにアクセスがあった場合に、https://test.co.jp/test.phpにリダイレクトされる。

2011年3月8日火曜日

mod_rewriteを使おうとしたらOSデフォルトのWebページになってしまった

.htaccessを使って新集計ツールサーバに来るアクセスを全てメンテナンスページにリダイレクトさせる設定をしようとした。
とりあえずhttpd.confの中のAllowOverrideがNoneになっていたので、そこをAllに修正して保存しreload
<Directory />
    Options FollowSymLinks
    AllowOverride None → All
</Directory>


で、.htaccessに以下のように記述してページにアクセス。
<Directory ~~~>
ErrorDocument 503 /html/maintenance.html

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_URI} !=/html/maintenance.html
  RewriteCond %{REQUEST_URI} !=/images/construction.jpg
  RewriteRule ^.*$ - [R=503,L]
</IfModule>
</Directory>


すると、CentOSデフォルトのWebページが表示されてしまった。
エラーログを見ると以下のようなエラーが出ていた。
Options FollowSymLinks or SymLinksIfOwnerMatch is off which implies that RewriteRule directive is forbidden: ディレクトリパス


mod_rewriteを使うディレクトリでは「Options FollowSymLinks」が必要だったので、
そこを.htaccessに追加したら問題なく動いた。
Options FollowSymLinks
ErrorDocument 503 /html/maintenance.html

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_URI} !=/html/maintenance.html
  RewriteCond %{REQUEST_URI} !=/images/construction.jpg
  RewriteRule ^.*$ - [R=503,L]
</IfModule>

2011年3月7日月曜日

mysqlの世代バックアップとリストアに関して

mysqlの世代バックアップは以下の通り。
cronの実行時間に関しては適宜変更する。
以下の記述で4日間分のバックアップが残る

* * * * * mysqldump -u ユーザー名 -p パスワード データベース名 --default-character-set=文字コード | gzip > db/dump_`date +"\%Y\%m\%d_\%H"`.sql.gz
* * * * * find db/ -type f -name "dump_*.tar.gz" -mtime +3 -daystart | xargs rm

バックアップからデータベースにリストアする方法は以下の通り。
zcat ダンプファイル名.gz | mysql -u ユーザー名 -p パスワード データベース名

こんな感じでリストアできるみたい。
zcatコマンドとかつかったこと無かったけど、こんな風に使うのか。

2011年3月4日金曜日

PHPで数字かどうかを判定する

今まで数字かどうかは正規表現使ってましたけど、実はこんな関数があって、こっちの方が早いらしい。
今後はこれを使っていこうと思う。

ctype_digit

PHPの三項演算子のネストは使わない方がいい

何回か三項演算子をネストさせようとして、思い通りにいかなかくてあきらめていたけど、
PHPの仕様だったみたいです。
PHPで三項演算子のネストは駄目だ。

2011年3月2日水曜日

MySQLで「Got error 28 from...」と出るときの対処法

MySQLでmysqldumpを取ろうと思ったら、dumpファイル自体は生成されているが、明らかに容量が少ないファイルができていた。
で、出てくるエラーメッセージが「Got error 28 from storage engine」

ググってみたら、ディスクの容量が足りないってことが原因だったみたい。
dfコマンドで確かめてみたら確かに100%使い切っていた…。
VMWareのディスクを拡張したことで解決!
VMWareのディスク拡張方法はこちらに記載しました。

2011年2月25日金曜日

inputの属性にdisabled="true"が含まれているとPOSTされない件

disabledがtrueになっている要素に関してはPOSTされないらしい。
POSTしたい場合は、JSでPOSTする前にdisabledをfalseにしてからPOSTするか、
disabled属性ではなく、readonly属性に変更するという2種類の対応方法がある。

例)
<form action="hoge.php" method="post">
    <input type="text" name="disabled" disabled="true" /> ← こっちはPOSTされない
    <input type="text" name="readonly" readonly="readonly" /> ← こっちはPOSTされる
</form>

2011年2月24日木曜日

PHPで多次元配列のソートをする方法

array_multisortを使えば多次元配列のソートが可能なのは知っていたけど、
ソートキーって複数設定できたりするってことを初めて知った。

例えば二次元配列要素内の

二つの要素をソートキーに使いたい場合、

分類、商品売上順とか

伝票日付、伝票番号、行番号とか。。。

【コード、年齢】でソートを行う例です。

$data[] = array('code' => '01','age' => 30);
$data[] = array('code' => '02','age' => 25);
$data[] = array('code' => '01','age' => 18);

foreach($data as $key => $val)
{
$sortcode[$key] = $val['code']; //第一キー指定
$sortage[$key] = $val['age']; //第二キー指定
}

array_multisort($sortcode,SORT_ASC,$sortage,SORT_ASC,$data);

ソート実行前

Array
(
[0] => Array
(
[code] => 01
[age] => 30
)

[1] => Array
(
[code] => 02
[age] => 25
)

[2] => Array
(
[code] => 01
[age] => 18
)

)


ソート実行後

Array
(
[0] => Array
(
[code] => 01
[age] => 18
)

[1] => Array
(
[code] => 01
[age] => 30
)

[2] => Array
(
[code] => 02
[age] => 25
)

)

文字コードのShift-JISとSJISは別物らしい

Ajaxで通信しているところで、通信元はShift-JISで記載されてて、API側のPHPにはSJISと記載されていた。
てっきり同じ文字コードだと思っていたので問題ないんじゃないかと思っていたけど、
実際は別物で、きちんと書き分けないと文字化けしてしまう。