≒ コード指定

今日参考書の演習で打ったスクリプト。

<?php

$midnight_today=mktime(0,0,0);
print'<select name=”date”>’;
for($i=0;$i<7;$i+=1){
$time_stamp=strtotime(“+$i day”,$midnight_today);
$display_date=strftime(‘%y年%m月%d日(%a)’,$time_stamp);
print'<option value=”‘.$time_stamp.'”>’.$display_date.”</option>\n”;
}
print”\n</select><br/>”;

require’form_helpers.php’;
$midnight_today2=mktime(0,0,0);
$choices=array();
for($i=0;$i<7;$i+=1){
$time_stamp2=strtotime(“+$i day”,$midnight_today2);
$display_date2=strftime(‘%y年%m月%d日(%a)’,$time_stamp2);
$choices[$time_stamp2]=$display_date2;
}
input_select(‘date’,$_POST,$choices);
foreach($choices as $key => $value){
print”<br/>$key:::$value”;
}
?>

別ファイル該当部分

function input_select($element_name,$selected,$options,$multiple=0){
print'<select name=”‘.$element_name;
if($multiple){
print'[]” multiple=”multiple’;}
print'”>’;
$selected_option=array();
if(($multiple)&&($selected[$element_name])){
foreach($selected[$element_name] as $val){
$selected_options[$val]=true;
}
}else{
$selected_options[$selected[$element_name]]=true;
}
foreach($options as $option => $label){
print'<option value=”‘.htmlspecialchars($option,ENT_QUOTES, ‘UTF-8’).'”‘;
if(isset($selected_options[$option])){
print’ selected=”selected”‘;
}
print’>’.htmlspecialchars($label,ENT_QUOTES, ‘UTF-8′).'</option>’;
}
print'</select>’;
}
動作はこんな感じ。
上のselectが裸のやつ。下のselectはhtmlspecialcharsでサニタイズしてるやつ。PCに入れてるxamppでは下のselectが動作しない。

で、foreachで配列吐き出し。ちゃんと値は設定されてる。

  1. htmlspecialcharsはずして裸で出力してみたら大丈夫。ってことはコード変換の問題か。
  2. あれ?関数格納phpファイルはUTF-8だけど(前に作ったやつの流用だから)、今書いたスクリプトはSjisで保存してた。原因はこれか?
  3. 両方UTF-8に統一した→何もかもおかしくなった。
  4. 頭北ー!サーバにあげてtestだ。
  5. 最初のファイル(ただしUTF-8に統一)で全く問題なし。

原因はxamppの文字コード設定だった。前からphpの演習はこれで苦労してるんだよなー。

結構な時間をかけて色々な設定試してるんだけど、文字コード関係で躓くこと多し。学習の環境として導入してるのに、その環境の設定のために時間とられてたら馬鹿馬鹿しいな。

サーバのほうの文字コード設定は最初にちょっといじっただけで済んだ。情報も少ないし。xamppの方は設定について、情報多すぎて迷っちゃうんだよね。

設定に困って探し回ってたときに見た情報で、うろ覚えなんだけど、xampp日本向けパッケージはsjis前提でコンパイルされているので深いところでは完全にUTF-8対応にできないといった話があったような。本気で環境作るならApache、PHP、MySQLそれぞれ個別に導入すべし、とか。

ホントかどうか分からない。今の僕には理解力が足りない。とりあえず今はhtmlspecialcharsが動作してるってことでOKということにしておきます。つーかSjisなんてこの世から無くなればいいのに。

PHPの学習がまともなレベルまで進んだら、セキュリティ関係掘り下げないとまずいなー。で、もう一度このコード検証しよう。