カテゴリー: PHP

  • 【MySQL】nullを取得できないケースの対策

    PHPとMySQLを使っていて、null値の取得ができない場合の対策について覚書しておきます。

    テーブルからデータを取り出し(fetch)して、繰り返し処理で、配列に値を入れる場合、当該データがNULL(null)のケースでは、上手くいかないことがあります。

    具体的に言うと、null値でデータが無い場合には、ゼロ(0)が入って欲しいところ、データ自体(データの行そのもの)が無いものと処理されて、期待した結果にならないケースです。

    この場合には、先に、当該データを0で初期化するのが一つの解決方法です。

    つまり、あらがじめ、データを格納する配列の値に、繰り返し処理で0を代入しておく訳です。

    $i = 1 ;
    while ($i <= count($data)) {
      $data[$i] = 0 ; //0に初期設定
      $i++ ;
    }
    
    $sql = "SELECT * FROM table1" ;
    $res = mysql_query($sql) or die("error") ;
    while ($row = mysql_fetch_assoc($res)) {
      $i        = $row["no"] ;
      $data[$i] = $row["value"] ;
    }

    この様にゼロで初期化してから、データをfetchして配列$dataに入れれば、仮に、当該配列の値がnullで値を取れなくても、ゼロで初期化されているので、そのままゼロを出力できるようになるのです。

    ちなみに、whileでなくforで繰り返し初期化しても同様の結果になります。

  • 【PHP】2重ループ(2重while)が動かない時の注意点

    コーディングしていると、2重ループのスクリプトを書くケースが出てきます。

    今回、このケースで少し躓いたので覚書しておきます。

    結論を言うと、外側のループと内側のループでは、処理に違う変数を使うこと。

    当たり前のことですが、外側と内側で同じ変数を使うと2重ループとして処理されず、おかしな挙動になります。

    ちなみに、この場合は、構文エラーではないので、エラーメッセージが出ず不具合の原因がわかりにくくなっています。

    具体例を出すと下のような構文です。

    while($row = mysql_fetch_assoc($res1)) {
        while($row = mysql_fetch_assoc($res2)){
         echo $row["sample"] ;
        }
    }

    外と内のループで同じ変数$rowで結果を受けています。

    この場合には、二重ループとして処理されず、期待通りの結果になりません。

    $row を、$row1、$row2などと区別してやる必要があります。

    先にも述べましたが、このケースでは、エラーが出ないので間違いが分かりにくくなっています。

    単純なケアレスミスですが、一応、覚書しときます。

  • 【PHP】入力チェック用スクリプトの一覧

    PHPでは、フォームからの入力に対して、入力値のチェックが欠かせません。

    そこで、ここでは、PHPの基礎的な関数を利用して、入力値のチェックをする方法を一覧にしておきます。

    //ポストされた時のみ処理
    if ($_SERVER["REQUEST_METHOD"]=="POST"){
    //エラー格納変数の配列初期化
    $_errors = array() ;
    //変数$dataにポストの値を代入
    $data = $_POST['data'] ;
    //$dataが空でないかチェック
    if(trim($data) ==''){
    $_errors[] = "入力されていません。" ;
    }
    //文字数チェック
    if (strlen($data) > 8) {
    $_errors[] = "文字数が8文字を超えています" ;
    }
    //$dataが数値(整数値のみ)であるかチェック
    if(!ctype_digit($data)){
    $_errors[] = "数値以外が含まれています。" ;
    }
    //$dataに数値0-9以外が含まれていないかチェック
    if(preg_match("/[^0-9]/",$data)){
    $_errors[] = "数値以外が含まれています。" ;
    }
    //入力値が半角英数で10文字以内かチェック
    if (!preg_match("/^[A-Za-z0-9]{1,10}$/", $data)){
    $_errors[] = "入力値が不正です。";
    }
    //メールアドレスのチェック1
    if (!preg_match("/^[^@]+@([-a-z0-9]+\.)+[a-z]{2,}$/", $data)){
    $_errors[] = "不正なメールアドレスです。";
    }
    //メールアドレスのチェック2
    $reg = 
    "/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/iD";
    if (!preg_match($reg, $data)) {
    $_errors[] = "不正なメールアドレスです。";
    }
    foreach ($_errors as $error){
    echo "$error".'<br>';
    }
    //if_end
    }
    //その他
    //特定の文字以外は空に置き換える
    $data = preg_replace("/^[A-Za-z0-9_.-]/","", $data) ;
    //変数を整数型に変換する
    $data = intval($data) ;
    
    //変数を浮動小数点型に変換する
    $data = doubleval($data) ;
    //日付チェック
    if (!checkdate($month,$day,$year)) {
    $_errors = "日付に誤りがあります" ;
    }
  • 【書評】PHP逆引きレシピ

    PHP 逆引きレシピの書評

    良い点

    • 基本事項を網羅している
    • 解説が簡潔でわかりやすい
    • セキュリティを詳しく解説
    • ロリポ、さくら、XREAの3サーバーに言及
    • WordPress、phpMyAdmin、MyNETSの解説あり
    • 実践的なサンプルコード多数
    • 本は厚いがコンパクト

    悪い点

    • あえて言えば、字が小さめ

    総評

    非常にコストパフォーマンスの良い本です。

    体裁は、リファレンス本のようになっていますが、初歩から中級レベルの教科書にも使えます。

    特にサンプルコードは実践的で、そのままコーディングに使えるものが多数あります。

    取り扱われているのは、基本はもちろん、pear、smarty、クラスとオブジェクト、PDFまで至ります。いわばノウハウの宝庫です。ちなみに、開発環境構築ではXAMPPを紹介しています。

    ページの内容は、項目の説明→サンプルコード→実行結果というように一貫しているのでわかりやすいです。

    PHPの本は、20冊以上読みましたが、この本はいつも手元に置いておきたい一冊です。

    PHP 逆引きレシピ

  • XREA/CORESERVERにPEARをインストールする覚書

    PHPの本を読んでいたら、PEARを使ってベンチマークを利用するスクリプトが載っていたので早速試してみました。

    使用するPEARパッケージは、「Benchmark」なのですが、コアサーバーには残念ながらインストールされていないので、自分でサーバーにインストールすることになります。

    PEARをインストールする方法はいくつかあるのですが、ここでは、SSHログインしてPEARコマンドを実行する方法と取りました。

    ちなみにSSHログインするには、TeraTermというフリーソフトを使用するのがお勧めです。(SSHおよびTeraTermの説明は省略します)

    まず、SSHログインするために管理画面の『ホスト情報登録』から『SSH登録』をクリックします。すると、5~10分ほど待つようにいわれるので指示に従います。

    そして、TeraTermにホストとパスワードを入力してログインできたら、下のコマンドを実行して設定ファイル(.pearrcファイル)を作成します。

    pear config-create /virtual/account/public_html .pearrc

    accountには自分のアカウント(ユーザー名)を入れてください。

    このコマンドを実行すると、ルートディレクトリに .pearrcファイルが作成されます。
    次に、PEARをインストールするために下のコマンドを実行します。

    pear install -o PEAR

    このコマンドを実行すると、5~10秒ほど待たされますが、あわてないこと。サーバーにPEARをインストールしているので少し待たされます。

    この時点で、public_htmlの直下にpearディレクトリが作成されます。中をのぞいてみるとPEARに必要なディレクトリやファイルが複数作成されています。

    ここから、今度は、個別にPEARパッケージをインストールすることになります。

    ここでは、『Benchmark』パッケージをインストールします。

    PEAR公式のベンチマークパッケージのページを見るとEasyInstallとして下のコマンドが紹介されていますので、実行します。

    pear install Benchmark-1.2.8

    実行すると5秒後くらいに、次の表示がされます。

    install ok: channel://pear.php.net/Benchmark-1.2.8

    インストールが上手くいったようです。確認してみましょう。

    先ほど作ったpearディレクトリの中にphpディレクトリがあるので、その中を見ます。

    するとBenchmarkディレクトリが作成されています。これでインストールは完了です。

    最後にもうひとつ作業があります。

    インストールしたPEARは、実行スクリプトから見てローカルファイルになります。そこで、どのスクリプトからもPEARが有効になるように、いわゆる『パス』を設定します。

    具体的には、PEARを利用するディレクトリに.htaccessファイルを作成して、そのファイルにパスの記述をします。

    .htaccess

    php_value include_path ".:/usr/local/lib/php:/virtual/account/public_html/pear/php"

    当該PEARを利用するのが、example.comならその直下にこの.htaccessファイルを設置します。もし、既に有るなら、追記します。

    このファイルを設定することで、利用するファイルから単純にインクルードするだけでPEARを利用できます。

    たとえば、今回利用するベンチマークファイルでは、

    require_once 'Benchmark/Timer.php';

    とベンチマークディレクトリの中のファイルを指定するだけで、PEARを利用できることになります。

    以上です。

    参考
    PEAR公式インストール方法