53件中 41-45件目     [ ... 2 3 4 5 6 7 8 9 10 11 ]

新しい環境にMySQLやPHPなどを入れたところ、MySQLを直接いじれば文字化けしないのに、PHPからMySQLに日本語データを入れた場合にのみ文字化けが起きた。 これは以前、直したことがあったのだが、かなり前のことだったので忘れてしまっていて、直すのに無駄に時間がかかってしまった。

この文字化けの原因は、MySQLのデフォルトの文字コードがlatin1で、さらにそれがスウェーデン語として扱われるためだ。 mysqlコマンドでstatusと打ち込むと、現在の設定が表示され、その中に文字コードの設定がある。

> status
(※省略)
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    latin1
Conn.  characterset:    latin1
(※省略)

PHPはapacheの権限で動くため、PHPによって作られたフォルダやファイルの所有者は、apacheユーザ(「www-data」「www」「nobody」など)になる。 そのフォルダやファイルのパーミッションが、他のユーザによる削除を許可していない場合、パーミッションか所有者を変更しない限り削除できないため、フォルダやファイルが削除できずに困ることがある。
そんなときには、パーミッションか所有者を変更すれば削除できる。 パーミッションを変更するならchmodコマンド、所有者を変更するならchownコマンドを使う。

> chown user_name file_name
> chmod 777 file_name

ただし、当然パーミッションを変更したり、所有者を変更できる権限が必要になる。 rootで実行できれば簡単だがroot権限で実行できない場合も多い。 そんなときは、ファイルを作ったapache自身に変えさせる。

PHPにはchmod関数chown関数があり、以下のように変更することができる。

chown($file_name, $user_name);
chmod($file_name, 0777);

PHPには配列をランダムに並べ替えるshuffle関数というものがあるが、この関数は配列のキーを削除してしまう。 例えば、以下のようなデータがあると

Array
(
	[mike] => ミケ
	[tama] => タマ
	[kuro] => クロ
	[siro] => シロ
)

以下のように、キーの文字列が削除され、数値キーに変えられてしまう。

Array
(
	[0] => シロ
	[1] => ミケ
	[2] => タマ
	[3] => クロ
)

そこで配列からキーを取り出し、それをshuffle関数でランダムに並び替え、その配列から元の配列をランダムに並び替えたものを作ることにする。


以下のようなIDと名前がセットになった配列データを送ることを考える。

Array
(
	[list] => Array
	(
		[1] => Array
		(
			[id] => 3
			[name] => 家康
		)
		[2] => Array
		(
			[id] => 5
			[name] => 秀忠
		)
		[3] => Array
		(
			[id] => 4
			[name] => 家光
		)
	)
)

PHPには、文字列からタグを取り除くstrip_tags関数があり、マニュアルにはこの関数に関して以下のような注意書きが書かれている。

現在、strip_tags()はHTMLの検証を行わないため、不完全または壊れたタグにより予想以上に多くのテキスト/データが削除される可能性があります。

これが具体的にどういう場合に起こるのか詳しく書かれていないので、どんな規則に従ってタグを取り除くのか調べてみた。

strip_tags関数の動作検証 (ソースコード)

どうもこの関数は、「<」のあとに空白と改行以外の文字が続くとそれをタグの始まりとみなし、「>」を見つけるまでの間を削除するようだ。 ただし、「"」や「'」で囲まれた中にある「>」はタグの終了と見なさない。 閉じられない場合は、最後まで削除する。

「lt;」のあとに記号や日本語がきても無条件で削除してしまうのでは使いにくいが、将来、新しいタグが出現する可能性を考えればこの動作は正しい。 strip_tagsが余計なテキストを削除するとしても、確実に有効なタグは取り除いてくれるようなので、それほど悪い関数でもないようだ。 ブラウザによって、HTMLの有効なタグの定義も変わってくるので、有効なタグのみを削除するというのもかなり難しい話だと思う。

タグは削除するよりも、htmlspecialchars関数などで無効化するのが無難な気がする。


53件中 41-45件目     [ ... 2 3 4 5 6 7 8 9 10 11 ]