広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

XAMPPのPHPで時計がずれている

自分のパソコンにXAMPPをインストールしました。
自作のPHPで現在の時刻でアクセスの制限をしようとしたら、うまく動作しませんでした。
調べてみるとPHPでのタイムゾーンが「Europe/Berlin」になっていました。

【1】php.iniを開く
xamppをインストールしたフォルダの php.ini を開く

【2】タイムゾーンを修正
php.ini 内の[Date]のタイムゾーンを修正

━ 変更前 ━
date.timezone = Europe/Berlin

━ 変更後 ━
date.timezone = Asia/Tokyo

【3】Apacheを再起動

これで時計が直りました。

PHPエラー:Fatal error: Cannot redeclare

PHPのエラーログで「Fatal error: Cannot redeclare」「(previously declared)」を検知
原因は同じ名前の関数が存在しているからでした。

function sample(){
echo 'あいうえお';
}

function sample(){
echo 'かきくけこ';
}


上記のように同じ関数名が定義されていると、「Fatal error: Cannot redeclare」「(previously declared)」が発生します。
したがって、どちらかを違う名前にしましょう。

また、試してはいませんが、クラス名などでも同じ名前があるとこのエラーが発生するかもしれません。

「Fatal error: Cannot redeclare」や「(previously declared)」などのエラーが発生したら名前の二重定義をチェックしてみましょう。

PHPでXML宣言するとエラーが発生

通常XML宣言は下記のように記述します。

<?xml version="1.0" encoding="euc-jp"?>

しかし、PHPでこのまま記述するとエラーが出てしまいます。

調べてみると、この記述がPHPのショートオープンタグとして認識しエラーが発生してしまうそうです。
だからといって、ショートオープンタグを無効にはしたくない場合があります。

そんな場合は以下のように「echo」や「print」などにより記述すればエラーがでなくなります。


<?php echo '<?xml version="1.0" encoding="euc-jp"?>' ?>

PHPでsubmit後に画面を閉じる

PHPでお問い合わせなどのフォームを作成する場合があります。
そこで、submitした後に画面を閉じる方法です。

画面を閉じるのはクライアントの操作のため、PHPのようなサーバーサイドスクリプトで画面を閉じることができないことがあります。
Javascriptを使用して画面を閉じます。

アクセスすると画面が閉じるページをJavascriptで作成します。

PHPで作成されたフォームでsubmitした後に、このJavascriptで作成したページに移動。
移動すると画面が自動的に閉じます。

正確にはPHPではなくJavascriptで画面を閉じるということになります。

すっきりした方法ではありませんが、これで一応submit後に画面が閉じるようになります。

PHPのチェックボックスの値を配列で取得

PHPでのチェックボックスの値を配列で取得する方法です。

通常はチェックボックスを

<input type="checkbox" name="test" value="sample1">sample1
<input type="checkbox" name="test" value="sample2">sample2
<input type="checkbox" name="test" value="sample3">sample3

と記述します。
しかし、これだとチェックしたものの中で最後の値しか取得できません。

これを以下のように記述します。

<input type="checkbox" name="test[]" value="sample1">sample1
<input type="checkbox" name="test[]" value="sample2">sample2
<input type="checkbox" name="test[]" value="sample3">sample3


このように記述すると、チェックボックスの値を配列で取得できます。

例えば、すべてにチェックを入れた場合、

$_POST['test'][0] の値は sample1
$_POST['test'][1] の値は sample2
$_POST['test'][2] の値は sample3


とすることで値を取得できます。

つまり、name属性の値の最後に [] を付けることでPHPのチェックボックスの値を配列取得することができます。

PHPのheader() 関数においてセッションが引き継がれない

PHPのheader() 関数を使用するとセッションが引き継がれない場合があります。
header() 関数後にサーバー内で新しいセッションを作成してしまうようです。

対策としては、URLにセッションIDを埋め込むことです。

例として、
index.php
---------------------------
header('Location: ./next.php?id='.session_id());

next.php
---------------------------
session_id($_GET['id']);
session_start();


上記のようにセッションIDを受け渡すことでセッションが引き継がれます。

ただし、セッションIDが見えてしまうのはセキュリティ上よくないと思われる人は、
前後にランダムの文字列などを加えたりして工夫をする必要があるでしょう。

PHPの文字化け対応mb_regex_encoding

PHPで文字化け発生です。
PHPでプログラムを組んでいると、よく文字化けします。
ということで早速結論です。

【症状】
文字コードはEUC-JP
音引き(伸ばし棒)の部分で文字化け
例1
mb_ereg_replace('×', '○', '×アイウエオ');
⇒文字化けしない

例2
mb_ereg_replace('×', '○', '×アイウエオー');
⇒音引き(伸ばし棒)の部分だけ文字化けする


【対応】
mb_regex_encoding( "EUC-JP" );

という文を記述しておく。
例えば【症状】例2の場合
mb_regex_encoding( "EUC-JP" );
mb_ereg_replace('×', '○', '×アイウエオー');

とすると文字化けしません。

今回は私がEUC-JPで記述していたので、EUC-JPとしました。
他の文字コードの場合は、適宜文字コードの部分の変更してください。

★mb_ereg_replace
マルチバイトの文字列を置換する
マニュアル参照

★mb_regex_encoding
マルチバイト正規表現用のエンコーディングを文字列として返す
マニュアル参照

PHPに限らずですが、文字化けは厄介なものです。
常に文字コードが何かを気にしながら、プログラミングしないとすぐに文字化けします。

文字化けの原因もさまざまですので、参考になればと思います。

PHPの文字化け[mb_ereg_replace]

PHPのホームページを作成していたら文字化けした。
原因は文字列を置換する関数にあった。

文字列の置換には「ereg_replace」という関数を使用していたが、日本語の場合は文字化けしてしまう。
この場合は

mb_ereg_replace

という関数を使用すると文字化けせずに正常に表示された。

この2つの関数の違いは、両方とも正規表現による文字列の置換を行うのだが、「mb_ereg_replace」はマルチバイト文字列の置換を行う。

つまり、「mb_ereg_replace」は日本語の文字列置換をしてくれる。
「ereg_replace」はマルチバイト文字列に対応していないため、日本語が文字化けしてしまったということである。

さらには「ereg_replace」はPHP5.3.0で非推奨の関数とされているので、使わないほうがよい。

文字化けは文字コードなどの設定もあるため、面倒でよく悩まされる。
今後も、勉強していかなければならない分野である。

PHPのショートオープンタグ

以前インストールしたXAMPPでPHPの動作確認をしようとしたところ、
テキストボックス内のPHPの変数が<?= $test ?>という感じにそのまま表示された。

phpinfo() を確認してみると正常に表示されたが、short_open_tag がOff になっていた。
おそらくデフォルトでは Off になっているようだ。

したがって、phpフォルダ内のphp.iniを開いて

short_open_tag = Off
 ↓ ↓ ↓
short_open_tag = On

に変更し、Apache 再起動したところ、正常に表示された。


★まとめ

【症状】
<?= $test ?>という表現がそのまま表示される
PHP自体は動作している

【原因】
short_open_tagがOffになっていた

【対応】
C:\xampp\php\php.ini を開いて
short_open_tag = Off
 ↓ ↓ ↓
short_open_tag = On


【環境】
WindowsXP SP3
XAMPP1.7.3
PHP5.3.1
   
<< 2013年02月 >>
          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    
PC関連ショップ
ビックカメラ.com

ドスパラは最短当日出荷!
パソコン・パソコンパーツのTWOTOP
フェイスインターネットショップ
【送料・代引手数料無料】PCダイレクト!
【バッファロー】直販オンライン・ショップ
格安BTOノート!『BTO STORE』
ストームウェブショップ
QNAP社製品ラックNAS
おすすめ商品

3DCGでよくわかる パソコン解体全書

新品価格
¥3,150から
(2011/1/28 17:39時点)

×

この広告は30日以上新しい記事の更新がないブログに表示されております。