ブログ

  • 【phpMyAdmin】エラーが出たためセッションを開始できませんでした。【XAMPP】

    XAMPPを起動して、phpMyAdminにログインしようとすると、

    「エラーが出たためセッションを開始できませんでした。PHP やウェブサーバのログファイルに出ているエラーを確認して、PHP を正しく設定してください。」

    と赤い文字でエラーが出る場合があります。

    ここではその対処法を覚書しておきます。

    結論から言うと、セッション関連のエラーのようです。

    セッションファイルはどこに保存されているかというと、

    C:\xampp\tmp

    です。

    このtmpフォルダの中に、最近できたセッションファイルがあると思います。

    sess_xyzabc…

    のようなのが、セッションファイルです。このセッションファイルのうち自分がログインしてできたと思われる直近、または、最近のセッションファイルを削除します。(.tmpファイルは削除しないように。)

    削除した後に、再度ログインしてみると、上手くいきました。

    どういうことか推測すると、どうやら先に生成されたセッションファイルがあることで、後のセッションが開始されないエラーらしい。(あくまでも推測ですが。)

    以前にもこのエラーが発生したことがあるのですが、一晩おいたら、なぜか、ログインできた経験があります。

    多分、その時は、先に出来たセッションファイルが時間の経過によりガーべジコレクションとかで削除されたのかもしれません。

    ですから、tmpフォルダ内のセッションファイルを自分で削除してやるとセッションが開始できるという訳です。

    ちなみに、正常にできたセッションファイルは、ファイルのサイズが40KBほどですが、このエラーが生じているときには、0から1KBほどのセッションファイルが出来ていたような気がします。この中途半端なセッションファイルがエラーの原因かもしれません。

  • 【PHP】配列の初期化のベンチマーク

    PHPの配列を初期化する場合には、

    $array = array() ;

    とします。

    配列に値を入れて初期化する場合には、

    $array = array(1, 2, 3, 4, 5)  ;

    とします。

    それでは、要素を10個もつ配列のすべての要素を、NULLで初期化するにはどうしたら良いでしょうか?

    //1の方法
    $array = array(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL ) ;

    たしかに、これでも、初期化できてますが、スマートではありません。

    それでは、ループさせてみては?

    //2の方法
    for ($i = 0; $i < 10; $i++)  {       
      $array[] = NULL ;
    }

    たしかに、これでも初期化できます。しかし、ループにすると速度落ちない?という疑問もでてきます。

    そこで、関数を調べてみると、array_fill なる関数が使えそうです。

    //3の方法
    $array = array_fill(0, 10, NULL);

    これは、配列のインデックス0から10個をNULLで初期化するというものです。
    つまり、インデックス0から9までNULL値の配列ができるのです。

    ここまでで、3つの方法を挙げてみましたが、果たして、どれが一番よいのでしょうか?

    確認するためにベンチマークを取ってみました。

    配列初期化ベンチマーク
    配列初期化ベンチマーク

    1の方法と3の方法は、ほとんど速度が変わりませんでした。しかし、ループさせる2の方法は、倍以上も遅くなってます。

    1の方法は、NULLの羅列が目障りなので、やはり、3の array_fill 関数を利用するのが良いという結論に達します。

    一応、確認のため、別の方法でもベンチマークをとってみました。

    すると、結果はやはり同一になりました。

    array()を算出

    • 平均値: 0.000090 [sec]
    • 全測定結果:
      Array
      (
          [1] => 0.000098
          [2] => 0.000088
          [3] => 0.000092
          [4] => 0.000089
          [5] => 0.000087
          [6] => 0.000090
          [7] => 0.000090
          [8] => 0.000089
          [9] => 0.000090
          [10] => 0.000092
          [mean] => 0.000090
          [iterations] => 10
      )

    array_fillを算出

    • 平均値: 0.000099 [sec]
    • 全測定結果:
      Array
      (
          [1] => 0.000104
          [2] => 0.000099
          [3] => 0.000099
          [4] => 0.000099
          [5] => 0.000099
          [6] => 0.000098
          [7] => 0.000099
          [8] => 0.000100
          [9] => 0.000098
          [10] => 0.000100
          [mean] => 0.000099
          [iterations] => 10
      )

    for loopを算出

    • 平均値: 0.000227 [sec]
    • 全測定結果:
      Array
      (
          [1] => 0.000230
          [2] => 0.000229
          [3] => 0.000228
          [4] => 0.000227
          [5] => 0.000229
          [6] => 0.000227
          [7] => 0.000227
          [8] => 0.000226
          [9] => 0.000228
          [10] => 0.000228
          [mean] => 0.000227
          [iterations] => 10
      )

    以上、覚書です。

  • PHPの比較演算子についての覚書

    PHPの比較演算子には、気をつけるべき点が多くあります。

    今回、少しはまったので覚書しておきます。

    基本的に、一致を確認する場合には、型まで比較する
    ===
    演算子を使うことが推奨されています。

    === 演算子は、2つの要件を必要とします。

    1.型が同一であること。かつ、2.値が同一であること。

    この2つの要件を両方満たして、真となります。

    逆に、不一致を確認する場合には、
    !==
    演算子を使います。

    !== 演算子は、2つの要件のうち、1つを必要とします。

    1.型が同一でないこと。または、2.値が同一でないこと。

    このどちらか1つの要件を満たせば、真となります。

    つまり、=== は、かつ、という要件が必要ですが、!== は、または、で良いわけです。

    基本中の基本ですが、混乱しやすいので覚書しておきます。

    なお、型については、PHPマニュアルにかなり詳しく記述されています。

    比較演算子
    http://www.php.net/manual/ja/language.operators.comparison.php

    型の相互変換
    http://www.php.net/manual/ja/language.types.type-juggling.php

    型の比較表
    http://www.php.net/manual/ja/types.comparisons.php

    上記ページは、必読です。

    ところで、これらとは別に、型について緩く比較する演算子もあります。

    == 演算子ですが、これは使わない方が良いということです。

    理由は、気づかないうちに、型が自動変換されて、値も変換されてしまうからです。

    マニュアルにも以下の記述があります。

    整数値を文字列と比較したり、比較に数値形式の文字が含まれる場合は、文字列が    数値に変換され、数値としての比較を行います。

    型の自動変換は、便利なようで、思わぬバグの温床となるようです。

    もう一つの、

    != 演算子も、== 演算子ほどではないにしても、バグを生む可能性があります。理由は、やはり、型の自動変換をしているからです。

    以上、覚書でした。

  • 「コンピュータ」に外付けHDDが表示されない場合の対策

    新しく購入したパソコン(ネットブック、Windows 7 starter)の「コンピュータ」に外付けハードディスクドライブ(HDD)が表示されず暫くハマったので覚書として対策を記しておきます。

    トラブルの状況

    元々は、据え置きノートのVistaに、当該、外付けハードディスクをつないで使用していました。その際に、そのHDDには、Zというボリュームラベルを割り当て済み。

    このZと名付けた外付けHDDを、7 starterにUSB接続すると、接続ランプが点き、接続音もするのですが、どういう訳か「コンピュータ」にハードディスクドライブとして表示されないのです。

    表示するための対策

    この対策として、当該HDDに、新規にボリュームラベル(ドライブ文字)を割り当ててみたところ表示されるようになりました。

    以下、その際の手順です。

    スタートメニュー → 管理ツール → コンピュータの管理 → 記憶域 → ディスクの管理 と進みます。

    ここで、当該外付けHDDが表示されているものの、ディスクにボリュームラベル(ディスクの名前、例 C、D、Eなど)が付けられていない状態ならば、そのディスクの上で右クリックし、「ドライブ文字とパスの変更」をクリックします。

    すると、新規にドライブ文字を割り当てることができるようになるので、任意の好きなドライブ文字を割り当てます。自分の場合は、Vistaでのボリュームラベルと同じZを選択しました。

    このようにボリュームラベル(ドライブ文字)を割り当ててみたところ、無事に、「コンピュータ」に外付けHDDが表示されるようになりました。

    注意事項

    ただし、パソコン初心者でよく分からなければ詳しい人に見て貰いながら作業した方が良いと思います。間違っても、ドライブをフォーマットしたりしないように。ハードディスクが初期化されてデータが無くなる恐れがあります。

  • 【PHP】セッションの削除の仕方

    PHPのセッションの削除方法についての覚書です。

    まずは、コード

    /**** セッション情報を削除 ****/
    //セッション変数を空に
    $_SESSION = array();
    //セッションクッキー削除
    if (isset($_COOKIE[session_name()])) {
        setcookie(session_name(), '', time() - 42000, '/') ;
    }
    //セッション破棄
    session_destroy();

    マニュアルでは下のリンク先の通りです。

    http://jp.php.net/manual/ja/function.session-destroy.php

    ポイントは、サーバー側でセッションを破棄するだけでなく、クライアント側のブラウザのクッキーも削除しなければならない点です。

    セッションを紐付けるクッキーは、セッションクッキーと呼ばれるもので、この自動生成されるクッキーも忘れずに削除する必要があります。

    公式マニュアルでは、ini_get関数を使って下のようにセッションクッキーを削除しています。

    // Note: セッション情報だけでなくセッションを破壊する。
    if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
            $params["path"], $params["domain"],
            $params["secure"], $params["httponly"]
        );
    }

    ただ、これだと少しややこしいので、

    if (isset($_COOKIE[session_name()])) {
        setcookie(session_name(), '', time() - 42000, '/') ;
    }

    このように簡略化しても良いと思います。

    なお、蛇足ですが、このセッションの削除の処理は、ログアウト時点だけでなく、ログイン処理の最初でも行う方が良さそうです。ログイン前のセッションクッキーを削除することにより、セッションハイジャックの予防的な処理にもなるようです。