セッション絡みのエラー

とある既存システムの改修作業をしていて、こんなエラーメッセージに出会った。

Warning: Unknown(): Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively. in Unknown on line 0

これはどうもセッションへ変数とグローバル変数絡みのエラーのように見受けられる。「セッション機能はregister_globalsをonにしない限り、グローバル変数をデータのソースとして認識しません」。意味がよくわかんない。

まぁ、文章から判断して「register_globals」をonに設定するか、「session.bug_compat_42」か「session.bug_compat_warn」をoffにするか、で対応できる模様。

(1)「register_globals」をon
 動作した
(2)「session.bug_compat_42」をoff
 動作した
(3)「session.bug_compat_warn」をoff
 動作しなかった

それぞれをhtaccessファイルで設定してみたら、上記のような結果になった。ということで(2)を採用した。
これって結局はPHPのバグということなのかな。

WordPressメールフォームプラグインCWCFバージョンアップ

2007/11/28 | SNS/CMS/ブログ

WordPressのメールフォームプラグインCWCFのバージョンを0.6にして公開することにした。以下のリンクからどうぞ。

WordPress Contact Form Plugin CWCF 0.6

■ 変更点
セッションの使用をやめた。

■ メモ
WordPress2.0系のバグかもしれないのだが、プラグインを作成してそのトリガを「the_content」としているのだが、どういうわけか2度処理が呼び出される。2回処理が呼ばれるので、メールが2通送信される。これはかなり気持ち悪い。
原因を詳しく突き止めようとはしていないが、前バージョン(0.5)ではセッションでメール送信実行の可否を判別するルーチンを持っていた(簡単なスパム対策も入れ込んであった)。でも基本的にセッションは使用したくなかったので、そこの部分についてのみ修正した。

ほんとはもうちょっとまじめにプログラムの中身を見ないといけないのかもしれないけれど・・・。

イメージマネージャーの表示順序

2007/11/21 | XOOPS

Xoopsのイメージマネージャーを普通に使っているのだが・・・(2.0.16ね)。
たいていは画像を使いたいときに、その都度アップロードして、そしてリストから画像を選択して使うことになるはず。
このリスト10件ずつ表示でページングとなり登録順に表示される。これは非常に不便だ。つまりこの方式だと、新規登録した画像を使おうと思ったら、必ずページング処理をしてから画像を選択しなくてはいけない。だいたい記事を書く際に、昔登録した画像を使うことは稀なはず。ということでこれは仕様がまずいのだ。
んでもってimagemaneger.phpを少しハックした。ハックした箇所はファイルの90行目付近。

$criteria->setLimit(10);
$criteria->setStart($start);

この下に以下の2行を追加した。
$criteria->setSort(‘image_id’);
$criteria->setOrder(‘desc’);

これで画像リストの表示順序が逆になった。やっぱこれのほうが断然使いやすい。
ということでめでたしめでたし。

ヒアドキュメント内で配列変数の展開

2007/11/20 | PHPの基本

ヒアドキュメントは便利な機能だ。複数行に及ぶ文字列をクオーテーション("や’)で囲まなくても、変数に格納したり、出力に使用したりすることができる。それにヒアドキュメント内で変数を使用すれば、ちゃんと展開してさえもくれる。こんな感じ。

$str=’テクメモ';
$doc=<<<__TESTDOC
これはテストです。
$str
__TESTDOC

上記で$docには「これはテストです。(改行)テクメモ」というテキストが格納される。
もちろん$strのような単なる文字列が格納された変数だけではなく、配列の要素も代入することが可能なのだが、これには一工夫必要になる。

$strArray=array(‘mother’=>’ママ’,’father’=>’パパ’);
$doc=<<<__TESTDOC
{$strArray[‘father’]}
{$strArray[‘mother’]}
__TESTDOC

おわかりだろうか。通常は配列の各要素を指定する場合は「変数名[キー]」の形で指定するのだが、ヒアドキュメント内ではさらにそれらを{}でくくってやる必要がある。

普段あんまりヒアドキュメントを使うことがないので知らなかった。

WordPressのユーザ一括登録プラグイン

2007/11/16 | SNS/CMS/ブログ

WordPressのプラグイン作成にのめりこんでしまっている感ではあるのだが・・・。今回作ったのはユーザを一括登録するためのプラグイン。カンマ区切りのユーザデータを用意しておくと、それを使って一括でユーザ登録ができる。会員専用のページを作る際などに、ユーザ一括登録ができるので便利だと思う(今回もそういう思惑で作った)。ただし・・・ひとつのサイトで何回も使うようなプラグインではないので、使用後は削除したほうがいいかもしれない。

CWBR batch registration plugin for WordPress

ソースコードはこんな感じ。

<?php
/*
Plugin Name: CW Batch Register
Plugin URI: http://php.tekmemo.com/
Description: Regist several users at one process.
Author: kaorun
Author URI: http://php.tekmemo.com/
Version: alpha
*/
  class cwbr
  {
    /*——————————————————————–
    |
    | Create administration menu
    | Called by add_filter()
    |
    ——————————————————————–*/
    function admin()
    {
      add_options_page(‘options-general.php’, ‘CWBR’, 8, basename(__FILE__), array(&$this,’processAdmin’));
    }
    
    /*——————————————————————–
    |
    | Provides administration tools
    | Called by above function “admin()”
    |
    ——————————————————————–*/
    function processAdmin()
    {
      global $wpdb;
      
      // [+] Batch registration processing
      $params=array(‘mail’,’list’);
      $errors=array();
      if(strtolower($_SERVER[‘REQUEST_METHOD’])==’post’){
        foreach($params as $param){
          $values[‘cwbr_’.$param]=(isset($_POST[‘cwbr_’.$param])? trim($_POST[‘cwbr_’.$param]):”);
        }
        extract($values);
        $cwbr_list=str_replace(“¥r¥n”,”¥n”,trim($cwbr_list));
        $cwbr_list=str_replace(“¥r”,”¥n”,$cwbr_list);
        $rows=explode(“¥n”,$cwbr_list);
        
        $already=array();
        $already[’email’]=array();
        $already[‘userid’]=array();
        $users=array();
        foreach($rows as $row){
          //$person=explode(‘,’,$row);
          
          list($user_email, $user_login, $user_pass, $user_url, $first_name, $last_name, $display_name, $nickname, $jabber, $aim, $yim)=explode(‘,’,$row);
          if(!is_email($user_email)){
            $errors[]=$user_email.’ … This email address is invalid.';
            break;
          }elseif($cwbr_mail && (in_array($user_email,$already[’email’]) || ($wpdb->get_row(“SELECT user_email FROM $wpdb->users WHERE user_email = ‘$user_email'”)))){
            $errors[]=$user_email.’ … This email address is used or already registered.';
            break;
          }else{
            $already[’email’][]=$cwbr_mail;
          }
          
          if(!validate_username($user_login)){
            $errors[]=$user_login.’ … This user id is invalid.';
            break;
          }elseif(username_exists($user_login)){
            $errors[]=$user_login.’ … This user id is already registered.';
            break;
          }elseif(in_array($user_login,$already[‘userid’])){
            $errors[]=$user_login.’ … The same user id is used.';
            break;
          }else{
            $already[‘userid’][]=$user_login;
          }
          
          if(!strlen($user_pass)){
            $errors[]=$user_email.'(‘.$user_login.’)’.’ … Password is always required.';
            break;
          }
          $users[]=compact(‘user_email’, ‘user_login’, ‘user_pass’, ‘user_url’, ‘first_name’, ‘last_name’, ‘display_name’, ‘nickname’, ‘jabber’, ‘aim’, ‘yim’);
        }
        
        if(!$errors){
          foreach($users as $user){
            if(!wp_insert_user($user)){
              $errors[]=$user[’email’].'(‘.$user[‘userid’].’)’.’ … This user is not registered. I do not know why.';
      &
nbsp;     }
          }
          if($errors){
            $errors[]=’Some errors are occurred.';
          }else{
            $errors[]=’Users are successfully registered.';
          }
        }
      }else{
        $values=array();
        foreach($params as $param){
          $values[‘cwbr_’.$param]=”;
        }
      }
      
      // [+] Get user list
      $userids = $wpdb->get_col(“SELECT ID FROM $wpdb->users;”);
      $roleclasses=array();
      foreach($userids as $userid) {
        $tmp_user = new WP_User($userid);
        $roles = $tmp_user->roles;
        $role = array_shift($roles);
        $roleclasses[$role][$tmp_user->user_login] = $tmp_user;
      }
      
      // [+] Output
      $cwbrOutput=”;
      $cwbrOutput.='<div class=”wrap”>';
      
      $cwbrOutput.='<h2>CW Batch Registration</h2>';
      if($errors){
        $cwbrOutput.='<ul>';
        foreach($errors as $error){
          $cwbrOutput.='<li>’.$error.'</li>';
        }
        $cwbrOutput.='</ul>';
      }
      $cwbrOutput.='<form name=”form1″ method=”post” action=”‘.$_SERVER[‘PHP_SELF’].’?page=cwbr.php”>';
      $cwbrOutput.='<div>[+] Do you need the check of duplication of e-mail addresses ?</div>';
      $cwbrOutput.='<div><input type=”checkbox” name=”cwbr_mail” value=”1″ ‘.(($values[‘cwbr_mail’])? ‘ checked':”).’/> I need check.</div>';
      $cwbrOutput.='<br />';
      $cwbrOutput.='<div>[+] Input the list separated with comma “,”.<br />EX) hoge@example.com, userid, password, website_url, first_name, last_name, display_name, nickname, jabber, aim, yim</div>';
      $cwbrOutput.='<div><textarea name=”cwbr_list” cols=”100″ rows=”10″>’.$values[‘cwbr_list’].'</textarea></div>';
      $cwbrOutput.='<input type=”submit” value=”submit” />';
      $cwbrOutput.='</form>';
      
      $cwbrOutput.='</div>';
      echo $cwbrOutput;
    }
  }
  
  $cwbrObj=& new cwbr;
  add_action(‘admin_menu’,  array(&$cwbrObj,’admin’));


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net