Changeset 8371 for lang/php/SQL_Abstract

Show
Ignore:
Timestamp:
03/25/08 18:01:00 (10 months ago)
Author:
fbis
Message:

lang/php/SQL_Abstract/trunk/lib/SQL/Abstract.class.php: fixed -between bugs

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/php/SQL_Abstract/trunk/lib/SQL/Abstract.class.php

    r4815 r8371  
    22/** 
    33* SQL/Abstract.php 
    4 * @author ittetsu miyazaki<ittetsu.miyazaki@gmail.com> 
     4* @author ittetsu miyazaki<ittetsu.miyazaki _at_ gmail.com> 
    55* @package SQL 
    66*/ 
    7 error_reporting( E_ALL ); 
    87 
    98/** 
    109* SQL_Abstract 
    11 * CPAN��QL::Abstract��HP�łł� 
    12 *  
    13 * include_path�̒ʂ�Ă������ɗႦ��ib/SQL/Abstract.class.php�ɒu���āA 
     10* CPANのSQL::AbstractのPHP版です 
     11*  
     12* include_pathの通っている場所に例えばlib/SQL/Abstract.class.phpに置いて、 
    1413*  
    1514* require_once 'SQL/Abstract.class.php'; 
    1615*  
    17 * ���̂悤�ɂ��g���������B 
    18 *  
    19 * �h�L�������g�Ɋւ��Ă�L::Abstract��Ȃ藬�p���Ă��邱�Ƃɂ������肢�����B 
    20 * PHP�ɂ͘A�z�z��z��œ���array()�𗘗p���� 
    21 * ���̂��ߌ���QL::Abstract�Ǝ኱�Ⴄ�d�l�̕����������Œ��ӂ��Ȃ�����ė~���� 
    22 *  
    23 * WHERE���� 
    24 *  
    25 * �ł��P�ɐ������͑����̗������邱�Ƃ��B���ꂼ��here�A�z�z��񎦂����������ȉ��̂悤�Ɏg������Ƃ���*  
     16* このようにお使い下さい。 
     17*  
     18* ドキュメントに関してもSQL::Abstractをかなり流用していることにご了承願いたい。 
     19* PHPには連想配列と配列とで同じarray()を利用する。 
     20* そのため元のSQL::Abstractと若干違う仕様の部分があるので注意しながら使って欲しい 
     21*  
     22* WHERE句の説明 
     23*  
     24* 最も簡単に説明するには多くの例を見せることだ。それぞれ$where連想配列を提示した後、それを以下のように使ったものとする 
     25*  
    2626*  list($stmt,$bind) = $sql->where($where); 
    2727*  
    28 * where���\�b�h�͍œK���̂��߃��t�@�����X����B 
    29 * ���Ĕz��󂯎������ʓI�ƌ����邾�낤�B�ilist�̃o�O�̂��߃��t�@�����X�ɂȂ����̂Łj 
     28* whereメソッドは最適化のためリファレンスを返す。 
     29* よって配列で受け取る方がより効果的と言えるだろう。(listのバグのためリファレンスにならないので) 
    3030*  
    3131*  $data = $sql->where($where); 
     
    3333*  $bind =& $data[1]; 
    3434*  
    35 * �����A�n�߂悤�B�܂��̓V���v���ȘA�z�z�񂩂炾�B 
     35* さあ、始めよう。まずはシンプルな連想配列からだ。 
    3636*  
    3737*     $where  = array( 
     
    4040*     ); 
    4141*  
    42 * key = val��QL���ɕϊ����� 
     42* key = valのSQL文に変換される 
    4343*  
    4444*     $stmt = "WHERE user = ? AND status = ?"; 
    4545*     $bind = array('nwiger', 'completed'); 
    4646*  
    47 * ����������ɋ��ʂȂ̂́A�����B�[���h�����”\�Ȓl�̔z�����Ă����������Ƃ��B 
    48 * ���̂��߂ɂ́A�P�ɘA�z�z��z��w�肷�邾���ł悢�B 
     47* 処理を終えるのに共通なのは、あるフィールドが代入可能な値の配列を持っているということだ。 
     48* そのためには、単に連想配列に配列を指定するだけでよい。 
    4949*  
    5050*     $where  = array( 
     
    5353*     ); 
    5454*  
    55 * ���̒P���ȃR�[�h�́A���̌��ʂɂȂ�*  
     55* この単純なコードは、次の結果になる 
     56*  
    5657*     $stmt = "WHERE user = ? AND ( status = ? OR status = ? OR status = ? )"; 
    5758*     $bind = array('nwiger', 'assigned', 'in-progress', 'pending'); 
    5859*  
    59 * �قȂ��C�v�̔����Z�q��肵�����Ȃ��A�z�z��g���F 
     60* 異なるタイプの比較演算子を指定したいなら、連想配列を使う: 
    6061*  
    6162*     $where  = array( 
     
    6465*     ); 
    6566*  
    66 * �����Ȃ�*  
     67* こうなる 
     68*  
    6769*     $stmt = "WHERE user = ? AND status != ?"; 
    6870*     $bind = array('nwiger', 'completed'); 
    6971*  
    70 * ���̂Ƃ��A�K���u=>�v���Ă��������B�u,�v����Ɣz����Ȃ������܂��������B 
    71 *  
    72 *     $where  = array( 
    73 *         'user'   => 'nwiger', 
    74 *         'status' => array( '!=' , 'completed' ) // �u,�v�̓_���I 
    75 *     ); 
    76 *  
    77 * �����Z�q�̒l���������̕���R��Ȃ��ł��� 
     72* このとき、必ず「=>」を使ってください。「,」を使うと配列と見なされてしまうからです。 
     73*  
     74*     $where  = array( 
     75*         'user'   => 'nwiger', 
     76*         'status' => array( '!=' , 'completed' ) // 「,」はダメ! 
     77*     ); 
     78*  
     79* 比較演算子の値を配列にするとその文のORをつないでくれる 
    7880*  
    7981*     'status' => array( '!=' => array('assigned', 'in-progress', 'pending')) 
    8082*  
    81 * �����Ȃ�*  
     83* こうなる 
     84*  
    8285*     "WHERE status != ? OR status != ? OR status != ?" 
    8386*  
    84 * �܂��A�A�z�z��͕����̃y�A��߂������̏ꍇ�A���̗v�f��AND�Ɋg������ 
     87* また、連想配列には複数のペアを含められる。その場合、その要素は ANDに拡張される 
    8588*  
    8689*     $where  = array( 
     
    9194*     $bind = array('nwiger', 0, 10); 
    9295*  
    93 * ���������Z�q�𕡐��w�肵�����ꍇ�͂����z����ߍ��ނ��Ƃʼn”\�ƂȂ����B���̏ꍇ�A���̗v�f��R�ƂȂ����B 
     96* 同じ比較演算子を複数指定したい場合はさらに配列に埋め込むことで可能となります。その場合、その要素はORとなります。 
    9497*  
    9598*     $where  = array( 
     
    100103*     $bind = array('nwiger', 0, 10); 
    101104*  
    102 * ���̃P�[�X�ł�R���ɕύX�������A���L�̂悤�ɏ����܂��B 
     105* このケースではORをANDに変更する場合、下記のように書けます。 
    103106*  
    104107*     $where  = array( 
     
    109112*     $bind = array('nwiger', 0, 10); 
    110113*  
    111 * -and,-or�ɂ‚��Ă̂����‚��̗��Љ�܂��B 
    112 *  
    113 *  // �����Ӗ� 
     114* -and,-orについてのいくつかの例を紹介します。 
     115*  
     116*  // 同じ意味 
    114117*  'status' => array( '>' => 0 , '<' => 10 ) 
    115118*  'status' => array( '-and' => array(array( '>' => 0),array('<' => 10 )) ) 
    116119 
    117 *  // �����Ӗ� 
     120*  // 同じ意味 
    118121*  'status' => array('assigned', 'in-progress') 
    119122*  'status' => array( '=' => array('assigned', 'in-progress') ) 
     
    121124*  'status' => array( '-or' => array( array( '=' => 'assigned' ), array( '=' => 'in-progress') ) ) 
    122125*  
    123 * ���ɁA�l�X�g�\����HERE���������ꍇ�̏��������������L�̂悤�Ȍ��ʂ�҂������A 
     126* 次に、ネスト構造のWHERE句を作りたい場合の書き方を説明する。下記のような結果を期待する場合、 
    124127*  
    125128*     $stmt = WHERE user = ? AND ( workhrs > ? OR geo = ? ) 
    126129*     $bind = array('nwiger', '20', 'ASIA'); 
    127130*  
    128 * ����-nest�Ƃ����\������Ύ���ł��� 
     131* これは-nestという構文を使えば実現できる。 
    129132*  
    130133*     $where = array( 
     
    133136*     ); 
    134137*  
    135 * ��������Z�q�Ƃ��ĉ��L�̂���|�[�g���Ă��� 
     138* 特殊な比較演算子として下記のものをサポートしている。 
    136139*  
    137140*  -in 
     
    141144*  -not_between 
    142145*  
    143 * -in�̗�*  
     146* -inの例 
     147*  
    144148*     $where  = array( 
    145149*         'status'   => 'completed', 
     
    147151*     ); 
    148152*  
    149 * �����Ȃ�*  
     153* こうなる 
     154*  
    150155*     $stmt = "WHERE status = ? AND reportid IN (?,?,?)"; 
    151156*     $bind = array('completed', '567', '2335', '2'); 
    152157*  
    153 * -not_between�̗�*  
     158* -not_betweenの例 
     159*  
    154160*    $where  = array( 
    155161*         'user'   => 'nwiger', 
     
    159165*     ); 
    160166*  
    161 * �����Ȃ�*  
    162 *   WHERE user = ? AND completion_date NOT BETWEEN ( ? AND ? ) 
    163 *  
    164 * �����܂łŁA�����ɂ��ĕ����̏��AND�Ō��т‚�����Ă����B 
    165 * �������A�قȂ�����z�z��ɒu���āA���ꂩ�炻���̘A�z�z��z����邱�ƂŁA���̓����ς��邱�Ƃ��ł����Ⴆ�΁F 
     167* こうなる 
     168*  
     169*   WHERE user = ? AND completion_date NOT BETWEEN( ? AND ? ) 
     170*  
     171* ここまでで、いかにして複数の条件がANDで結びつくかをみてきた。 
     172* しかし、異なる条件を連想配列内に置いて、それからそれらの連想配列を配列にすることで、この動作を変えることができる。例えば: 
    166173*  
    167174*     $where = array( 
     
    176183*     ); 
    177184*  
    178 * ���̃f�[�^�\���͎��̂悤�ɂȂ� 
     185* このデータ構造は次のようになる: 
    179186*  
    180187*     $stmt = "WHERE ( user = ? AND ( status = ? OR status = ? ) ) 
     
    182189*     $bind = array('nwiger', 'pending', 'dispatched', 'robot', 'unassigned'); 
    183190*  
    184 * ���ɂ͕����ʂ�SQL���������K�v�ƂȂ邾�낤�B�������� SQL��܂������Ȃ�-inject��肷���‚܂� 
     191* 時には文字通りのSQL文だけが必要となるだろう。もし字句通りに SQLを含ませたいなら、-injectを指定する。つまり: 
    185192*  
    186193*     $inn = 'is not null'; 
     
    190197*     ); 
    191198*  
    192 * �����Ȃ� 
     199* こうなる: 
    193200*  
    194201*     $stmt = "WHERE priority < ? AND requestor is not null"; 
    195202*     $bind = array('2'); 
    196203*  
    197 * �Ō��A�l��null�l�̏ꍇ�͏�������A!=��S NOT NULL�A�����O�̔����Z�q�̏ꍇ��S NULL�ɂȂ� 
     204* 最後に、値がnull値の場合は少し特殊で、!=はIS NOT NULL、それ以外の比較演算子の場合はIS NULLになる。 
    198205*  
    199206*     $where = array( 
     
    205212*     $bind = array('2'); 
    206213*  
    207 * ���� 2007/06/13 ver 0.01 �ق�����蒼�� 
    208 *  
    209 * @version 0.01 
     214* 履歴 
     215* 2007/06/13 ver 0.01 ほんの少し手直し 
     216* 2008/03/25 ver 0.02 -betweenを使用するとSQLエラーが発生していた問題を修正 
     217*                     error_reportingを削除。(使う側でスキにしてね) 
     218*                     ソースコードをUTF8に変更 
     219*  
     220* @version 0.02 
    210221* @package SQL 
    211222* @access public 
     
    214225     
    215226    /** 
    216     * �R���X�g���N�^ 
     227    * コンストラクタ 
    217228    * <pre> 
    218229    * $cgi = new SQL_Abstract() 
    219230    * </pre> 
    220231    * @access public 
    221     * @return object SQL_Abstract �I�u�W�F�N�g 
     232    * @return object SQL_Abstract オブジェクト 
    222233    */ 
    223234    function SQL_Abstract () {} 
     
    229240     
    230241    /** 
    231     * �n���ꂽ�z����ׂ�    * 
     242    * 渡された配列を調べる 
     243    * 
    232244    * @access private 
    233245    * @param array 
    234     * @return �A�z�z�������B 
    235     *         �z�������B 
     246    * @return 連想配列なら真を返す。 
     247    *         配列なら偽を返す。 
    236248    */ 
    237249    function _is_hash (&$array) { 
     
    242254     
    243255    /** 
    244     * �n���ꂽ�z����ׂ�    * 
     256    * 渡された配列を調べる 
     257    * 
    245258    * @access private 
    246259    * @param array 
    247     * @return �A�z�z����ƒL�[��-and,-or�Ȃ炻�̕�����Ԃ��B 
    248     *         �A�z�z�������B 
    249     *         �z�������B 
     260    * @return 連想配列で且つキーが-and,-orならその文字列を返す。 
     261    *         連想配列なら真を返す。 
     262    *         配列なら偽を返す。 
    250263    */ 
    251264    function _hash_and_or (&$array) { 
     
    320333     
    321334    /** 
    322     * WHERE����������    * 
     335    * WHERE句を生成する 
     336    * 
    323337    * @access public 
    324     * @param array WHERE��    * @param array ORDER��ȗ��� 
    325     * @return �A�z�z����ƒL�[��-and,-or�Ȃ炻�̕�����Ԃ��B 
    326     *         �A�z�z�������B 
    327     *         �z�������B 
     338    * @param array WHERE句 
     339    * @param array ORDER句(省略可) 
     340    * @return 連想配列で且つキーが-and,-orならその文字列を返す。 
     341    *         連想配列なら真を返す。 
     342    *         配列なら偽を返す。 
    328343    */ 
    329344    function where ($where,$order=null){ 
     
    464479                case '-not_between': 
    465480                    if( is_array($val) ){ 
    466                         $sqls[] = "$column NOT BETWEEN ( ? AND ? )"; 
     481                        $sqls[] = "$column NOT BETWEEN ? AND ?"; 
    467482                        array_push($args,$val[0],$val[1]); 
    468483                    } 
     
    474489                case '-between': 
    475490                    if( is_array($val) ){ 
    476                         $sqls[] = "$column BETWEEN ( ? AND ? )"; 
     491                        $sqls[] = "$column BETWEEN ? AND ?"; 
    477492                        array_push($args,$val[0],$val[1]); 
    478493                    } 
     
    515530    } 
    516531} 
    517  
    518  
    519 ?>