Changeset 8371 for lang/php/SQL_Abstract
- Timestamp:
- 03/25/08 18:01:00 (5 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
lang/php/SQL_Abstract/trunk/lib/SQL/Abstract.class.php
r4815 r8371 2 2 /** 3 3 * SQL/Abstract.php 4 * @author ittetsu miyazaki<ittetsu.miyazaki @gmail.com>4 * @author ittetsu miyazaki<ittetsu.miyazaki _at_ gmail.com> 5 5 * @package SQL 6 6 */ 7 error_reporting( E_ALL );8 7 9 8 /** 10 9 * SQL_Abstract 11 * CPAN ��QL::Abstract��HP�łł�12 * 13 * include_path �̒ʂ�Ă������ɗႦ��ib/SQL/Abstract.class.php�ɒu���āA10 * CPANのSQL::AbstractのPHP版です 11 * 12 * include_pathの通っている場所に例えばlib/SQL/Abstract.class.phpに置いて、 14 13 * 15 14 * require_once 'SQL/Abstract.class.php'; 16 15 * 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 * 26 26 * list($stmt,$bind) = $sql->where($where); 27 27 * 28 * where ���\�b�h�͍œK���̂��߃��t�@�����X����B29 * ���Ĕz��������ʓI�ƌ����邾�낤�B�ilist�̃o�O�̂��߃��t�@�����X�ɂȂ����̂Łj28 * whereメソッドは最適化のためリファレンスを返す。 29 * よって配列で受け取る方がより効果的と言えるだろう。(listのバグのためリファレンスにならないので) 30 30 * 31 31 * $data = $sql->where($where); … … 33 33 * $bind =& $data[1]; 34 34 * 35 * �����A�n�߂悤�B�܂��̓V���v���ȘA�z�z�炾�B35 * さあ、始めよう。まずはシンプルな連想配列からだ。 36 36 * 37 37 * $where = array( … … 40 40 * ); 41 41 * 42 * key = val ��QL���ɕϊ�����42 * key = valのSQL文に変換される 43 43 * 44 44 * $stmt = "WHERE user = ? AND status = ?"; 45 45 * $bind = array('nwiger', 'completed'); 46 46 * 47 * ����������ɋ��ʂȂ̂́A�����B�[���h�����\�Ȓl�̔z�����Ă����������Ƃ��B48 * ���̂��߂ɂ́A�P�ɘA�z�z��z��w�肷�邾���ł悢�B47 * 処理を終えるのに共通なのは、あるフィールドが代入可能な値の配列を持っているということだ。 48 * そのためには、単に連想配列に配列を指定するだけでよい。 49 49 * 50 50 * $where = array( … … 53 53 * ); 54 54 * 55 * ���̒P���ȃR�[�h�́A���̌��ʂɂȂ�* 55 * この単純なコードは、次の結果になる 56 * 56 57 * $stmt = "WHERE user = ? AND ( status = ? OR status = ? OR status = ? )"; 57 58 * $bind = array('nwiger', 'assigned', 'in-progress', 'pending'); 58 59 * 59 * �قȂ��C�v�̔����Z�q��肵�����Ȃ��A�z�z��g���F60 * 異なるタイプの比較演算子を指定したいなら、連想配列を使う: 60 61 * 61 62 * $where = array( … … 64 65 * ); 65 66 * 66 * �����Ȃ�* 67 * こうなる 68 * 67 69 * $stmt = "WHERE user = ? AND status != ?"; 68 70 * $bind = array('nwiger', 'completed'); 69 71 * 70 * ���̂Ƃ��A�K���u=>�v���Ă��������B�u,�v����Ɣz����Ȃ������܂��������B71 * 72 * $where = array( 73 * 'user' => 'nwiger', 74 * 'status' => array( '!=' , 'completed' ) // �u,�v�̓_���I75 * ); 76 * 77 * �����Z�q�̒l���������̕���R��Ȃ��ł���72 * このとき、必ず「=>」を使ってください。「,」を使うと配列と見なされてしまうからです。 73 * 74 * $where = array( 75 * 'user' => 'nwiger', 76 * 'status' => array( '!=' , 'completed' ) // 「,」はダメ! 77 * ); 78 * 79 * 比較演算子の値を配列にするとその文のORをつないでくれる 78 80 * 79 81 * 'status' => array( '!=' => array('assigned', 'in-progress', 'pending')) 80 82 * 81 * �����Ȃ�* 83 * こうなる 84 * 82 85 * "WHERE status != ? OR status != ? OR status != ?" 83 86 * 84 * �܂��A�A�z�z��͕����̃y�A��߂������̏ꍇ�A���̗v�f��AND�Ɋg������87 * また、連想配列には複数のペアを含められる。その場合、その要素は ANDに拡張される 85 88 * 86 89 * $where = array( … … 91 94 * $bind = array('nwiger', 0, 10); 92 95 * 93 * ���������Z�q���w�肵�����ꍇ�͂����z����ߍ��ނ��Ƃʼn\�ƂȂ����B���̏ꍇ�A���̗v�f��R�ƂȂ����B96 * 同じ比較演算子を複数指定したい場合はさらに配列に埋め込むことで可能となります。その場合、その要素はORとなります。 94 97 * 95 98 * $where = array( … … 100 103 * $bind = array('nwiger', 0, 10); 101 104 * 102 * ���̃P�[�X�ł�R���ɕύX�������A���L�̂悤�ɏ����܂��B105 * このケースではORをANDに変更する場合、下記のように書けます。 103 106 * 104 107 * $where = array( … … 109 112 * $bind = array('nwiger', 0, 10); 110 113 * 111 * -and,-or �ɂ��Ă̂������̗��Љ�܂��B112 * 113 * // �����Ӗ�114 * -and,-orについてのいくつかの例を紹介します。 115 * 116 * // 同じ意味 114 117 * 'status' => array( '>' => 0 , '<' => 10 ) 115 118 * 'status' => array( '-and' => array(array( '>' => 0),array('<' => 10 )) ) 116 119 * 117 * // �����Ӗ�120 * // 同じ意味 118 121 * 'status' => array('assigned', 'in-progress') 119 122 * 'status' => array( '=' => array('assigned', 'in-progress') ) … … 121 124 * 'status' => array( '-or' => array( array( '=' => 'assigned' ), array( '=' => 'in-progress') ) ) 122 125 * 123 * ���ɁA�l�X�g�\����HERE���������ꍇ�̏��������������L�̂悤�Ȍ��ʂ�҂������A126 * 次に、ネスト構造のWHERE句を作りたい場合の書き方を説明する。下記のような結果を期待する場合、 124 127 * 125 128 * $stmt = WHERE user = ? AND ( workhrs > ? OR geo = ? ) 126 129 * $bind = array('nwiger', '20', 'ASIA'); 127 130 * 128 * ����-nest�Ƃ����\������Ύ���ł���131 * これは-nestという構文を使えば実現できる。 129 132 * 130 133 * $where = array( … … 133 136 * ); 134 137 * 135 * ��������Z�q�Ƃ��ĉ��L�̂���|�[�g���Ă���138 * 特殊な比較演算子として下記のものをサポートしている。 136 139 * 137 140 * -in … … 141 144 * -not_between 142 145 * 143 * -in�̗�* 146 * -inの例 147 * 144 148 * $where = array( 145 149 * 'status' => 'completed', … … 147 151 * ); 148 152 * 149 * �����Ȃ�* 153 * こうなる 154 * 150 155 * $stmt = "WHERE status = ? AND reportid IN (?,?,?)"; 151 156 * $bind = array('completed', '567', '2335', '2'); 152 157 * 153 * -not_between�̗�* 158 * -not_betweenの例 159 * 154 160 * $where = array( 155 161 * 'user' => 'nwiger', … … 159 165 * ); 160 166 * 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 * しかし、異なる条件を連想配列内に置いて、それからそれらの連想配列を配列にすることで、この動作を変えることができる。例えば: 166 173 * 167 174 * $where = array( … … 176 183 * ); 177 184 * 178 * ���̃f�[�^�\���͎��̂悤�ɂȂ�185 * このデータ構造は次のようになる: 179 186 * 180 187 * $stmt = "WHERE ( user = ? AND ( status = ? OR status = ? ) ) … … 182 189 * $bind = array('nwiger', 'pending', 'dispatched', 'robot', 'unassigned'); 183 190 * 184 * ���ɂ͕����ʂ�SQL���������K�v�ƂȂ邾�낤�B�������� SQL��܂������Ȃ�-inject��肷���܂�191 * 時には文字通りのSQL文だけが必要となるだろう。もし字句通りに SQLを含ませたいなら、-injectを指定する。つまり: 185 192 * 186 193 * $inn = 'is not null'; … … 190 197 * ); 191 198 * 192 * �����Ȃ�199 * こうなる: 193 200 * 194 201 * $stmt = "WHERE priority < ? AND requestor is not null"; 195 202 * $bind = array('2'); 196 203 * 197 * �Ō��A�l��null�l�̏ꍇ�͏�������A!=��S NOT NULL�A�����O�̔����Z�q�̏ꍇ��S NULL�ɂȂ�204 * 最後に、値がnull値の場合は少し特殊で、!=はIS NOT NULL、それ以外の比較演算子の場合はIS NULLになる。 198 205 * 199 206 * $where = array( … … 205 212 * $bind = array('2'); 206 213 * 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 210 221 * @package SQL 211 222 * @access public … … 214 225 215 226 /** 216 * �R���X�g���N�^227 * コンストラクタ 217 228 * <pre> 218 229 * $cgi = new SQL_Abstract() 219 230 * </pre> 220 231 * @access public 221 * @return object SQL_Abstract �I�u�W�F�N�g232 * @return object SQL_Abstract オブジェクト 222 233 */ 223 234 function SQL_Abstract () {} … … 229 240 230 241 /** 231 * �n���ꂽ�z����ׂ� * 242 * 渡された配列を調べる 243 * 232 244 * @access private 233 245 * @param array 234 * @return �A�z�z�������B235 * �z�������B246 * @return 連想配列なら真を返す。 247 * 配列なら偽を返す。 236 248 */ 237 249 function _is_hash (&$array) { … … 242 254 243 255 /** 244 * �n���ꂽ�z����ׂ� * 256 * 渡された配列を調べる 257 * 245 258 * @access private 246 259 * @param array 247 * @return �A�z�z����L�[��-and,-or�Ȃ炻�̕�����Ԃ��B248 * �A�z�z�������B249 * �z�������B260 * @return 連想配列で且つキーが-and,-orならその文字列を返す。 261 * 連想配列なら真を返す。 262 * 配列なら偽を返す。 250 263 */ 251 264 function _hash_and_or (&$array) { … … 320 333 321 334 /** 322 * WHERE���������� * 335 * WHERE句を生成する 336 * 323 337 * @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 * 配列なら偽を返す。 328 343 */ 329 344 function where ($where,$order=null){ … … 464 479 case '-not_between': 465 480 if( is_array($val) ){ 466 $sqls[] = "$column NOT BETWEEN ( ? AND ? )";481 $sqls[] = "$column NOT BETWEEN ? AND ?"; 467 482 array_push($args,$val[0],$val[1]); 468 483 } … … 474 489 case '-between': 475 490 if( is_array($val) ){ 476 $sqls[] = "$column BETWEEN ( ? AND ? )";491 $sqls[] = "$column BETWEEN ? AND ?"; 477 492 array_push($args,$val[0],$val[1]); 478 493 } … … 515 530 } 516 531 } 517 518 519 ?>
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)