Memo/PHP/CakePHP

https://dexlab.net:443/pukiwiki/index.php?Memo/PHP/CakePHP
 

CakePHP


CakePHP2.0

  • 大きな変更点
    • PHP5.2.6以上

OAuth


html解析


Fatal error: session_start()

  • 環境
    • CakePHP v1.2.3.8166
    • CentOS5.2, httpd-2.2.3-11.el5_1.centos.3, php-5.1.6-20.el5_2.1
    • app/config/core.php
      Configure::write('Session.save', 'sess_user');
  • app/config/sess_user.php
    ユーザ定義のセッション処理
  • エラー
    Fatal error: session_start()
    [<a href='http://php.net/function.session-start'>function.session-start</a>]:  Failed to initialize storage module: user (path: ...) in .../cake/libs/session.php on line 543
  • 対策
    • require_once() を require()に変更したらなぜか動作した
      #!diff
      --- cake/libs/session.php       (リビジョン 536)
      +++ cake/libs/session.php       (作業コピー)
      @@ -517,7 +517,7 @@
                                              $config = CONFIGS . Configure::read('Session.save') . '.php';
       
                                              if (is_file($config)) {
      -                                               require_once ($config);
      +                                               require($config);
                                              }
                                      }
                              break;
      

Modell::create()でbool型がstring型で戻る対策

  • bool型が (string)"true" or (string)"false"で返却されるので$form->input()でデフォルト値が常にtrueになる対策
    • CakePHP v1.2.3.8166
  • app/app_model.php
    	function create($data = array(), $filterKey = false)
    	{
    		parent::create($data, $filterKey);
    		$alias = $this->alias;
    		foreach($this->schema() as $field => $properties){
    			if($properties['type'] == 'boolean'){
    				// bool型が (string)"true"で返却されるので$form->input()でデフォルト値が常にtrueになる対策
    				$this->data[$alias][$field] = $this->db()->boolean($this->data[$alias][$field]);
    			}
    		}
    		return $this->data;
    	}

モデル::read() するとエラーが表示されない

  • 対策。app_model.phpに追加
    public function myread($id, $fields = array())
    {
    	$conditions = array(
    		'conditions' => array($this->alias . '.' . $this->primaryKey => $id),
    	);
    	if (!empty($fields)) {
    		$conditions['fields'] = $fields;
    	}
    	return $this->find('first', $conditions);
    }
    

キャッシュの複数設定

 Configure::write('Cache.disable', false); // サイト全体のキャッシュを有効に
 Configure::write('Cache.check', true); // viewキャッシュのチェックを有効に
// short
Cache::config('short', array(
    'engine' => 'File',      // キャッシュエンジン (デフォルト:File)
    'duration'=> '+2 hours', // キャッシュ期間(デフォルト:3600 秒) strtotime()で使える文字列
    'probability'=> 100,     // ガベージコレクタの起動確率(デフォルト:100)
    'path' => CACHE,         // キャッシュディレクトリ(デフォルト:CACHE)
    'prefix' => 'cake_',     // キャッシュファイルに付ける接頭語
    'lock' => false,         // write時にロックするか(デフォルト:false)
    'serialize' => true)     // シリアライズするか。(デフォルト:true)
);

// medium
Cache::config('medium', array(
    'engine' => 'File',
    'duration'=> '+1 day',
    'probability'=> 100,
    'path' => CACHE,
    'prefix' => 'cake_',
    'lock' => false,
    'serialize' => true)
);

// long
Cache::config('long', array(
    'engine' => 'File',
    'duration'=> '+1 week',
    'probability'=> 100,
    'path' => CACHE,
    'prefix' => 'cake_',
    'lock' => false,
    'serialize' => true)
);

// default = medium
Cache::config('default', Cache::config('medium'));

if (!$cachedata = Cache::read(('cache_key','short')) {
    // retrieve data if cache is empty
    $data = $this->Model->read(null, $id);
    Cache::write('cache_key', $data, 'short');
}
  • Cache::config('設定名')のように第二引数を省略すると、現在の設定が取得できる。
  • Cache::settings('File')のようにエンジンを指定すると、エンジン毎の現在の設定が取得できる。

携帯サイトを作る際の注意点

携帯でsession.use_trans_sid=1だと、セッション文字列が消える不具合

  • セパレータ「:」を「-」にして回避。実機(F-01A)確認済み。「/」はさすがに動作しなかった
  • app/config/routes.php
    // 携帯でsession.use_trans_sid=1だと、セッション文字列が消える不具合対応。「:」=>「-」に変更
    Router::connectNamed(array(),array('argSeparator'=>'-'));

SQLエラーを取得

  • CakePHP 1.2.2.8120
    $db = &ConnectionManager::getDataSource($this->useDbConfig);
    echo $db->error; // プロパティの場合
    echo $db->lastError(); // メソッド
    

AuthComponent?と連携してcreated_by, modified_byを保存するビヘイビア

  • Authコンポーネントで認証済みのUser.idが、自動でモデルに保存するビヘイビアがありました。

query() fetchRow()の結果がMySQLとPostgreSQLで違う

  • PostgreSQLでquery() fetchRow()を実行するとキーとしてのテーブル名が無い
  • 原因
    • PostgreSQLは dbo_postgres.php DboPostgres?::resultSet()で pg_field_name() を使用しているが、フィールド名しか取れない。フィールド名からテーブル情報を取得する関数が無い。`'テーブル名__フィールド名'`の場合にテーブル名が入る。
    • MySQLは dbo_mysql.php :: で mysql_fetch_field() を使用しているので、テーブル名も取得できる。
  • 解決方法
    • find()を使うと結果は同じになる。
    • `'select "User__id", "User__username" from users'`のように「モデル__カラム」とする
  • CakePHP 1.2.1.8004
  • CentOS5.2
  • php 5.1.6
  • MySQL 5.0.45
  • PostgreSQL 8.1.11
  • クエリ
    $result = $this->query('select id, username from users');
  • 結果:MySQL
    array (
      0 => 
      array (
        'users' => 
        array (
          'id' => '1',
          'username' => 'test1',
        ),
      ),
    )
    
  • 結果:PostgreSQL
    array (
      0 => 
      array (
        0 => 
        array (
          'id' => '5',
          'username' => 'test1',
        ),
      ),
    )

添付ファイル: filewhodidit.php.patch 1459件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-09-15 (土) 07:31:38 (9d)