source: branches/camp/camp-2_5-E/data/class/SC_Query.php @ 19595

Revision 19595, 24.8 KB checked in by miningbrownie, 12 years ago (diff)
  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2010 LOCKON CO.,LTD. All Rights Reserved.
6 *
7 * http://www.lockon.co.jp/
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 */
23
24require_once(realpath(dirname(__FILE__)) . "/../module/MDB2.php");
25
26/**
27 * SQLの構築・実行を行う
28 *
29 * TODO エラーハンドリング, ロギング方法を見直す
30 *
31 * @author LOCKON CO.,LTD.
32 * @version $Id$
33 */
34class SC_Query {
35
36    var $instance;
37    var $option;
38    var $where;
39    var $conn;
40    var $groupby;
41    var $order;
42    var $force_run;
43
44    /**
45     * コンストラクタ.
46     *
47     * @param string $dsn データソース名
48     * @param boolean $force_run エラーが発生しても処理を続行する場合 true
49     * @param boolean $new 新規に接続を行うかどうか
50     */
51    function SC_Query($dsn = "", $force_run = false, $new = false) {
52
53        if ($dsn == "") {
54            $dsn = DEFAULT_DSN;
55        }
56
57        // Debugモード指定
58        $options['debug'] = PEAR_DB_DEBUG;
59        // 持続的接続オプション
60        $options['persistent'] = PEAR_DB_PERSISTENT;
61
62        if ($new) {
63            $this->conn = MDB2::connect($dsn, $options);
64        } else {
65            $this->conn = MDB2::singleton($dsn, $options);
66        }
67
68        if (!PEAR::isError($this->conn)) {
69            $this->conn->setCharset(CHAR_CODE);
70            $this->conn->setFetchMode(MDB2_FETCHMODE_ASSOC);
71        }
72
73        $this->dbFactory = SC_DB_DBFactory_Ex::getInstance();
74        $this->force_run = $force_run;
75        $this->where = "";
76        $this->order = "";
77        $this->groupby = "";
78        $this->option = "";
79    }
80
81    /**
82     * シングルトンの SC_Query インスタンスを取得する.
83     *
84     * @param string $dsn データソース名
85     * @param boolean $force_run エラーが発生しても処理を続行する場合 true
86     * @param boolean $new 新規に接続を行うかどうか
87     * @return SC_Query シングルトンの SC_Query インスタンス
88     */
89    function getSingletonInstance($dsn = "", $force_run = false, $new = false) {
90        if (is_null($this->instance)) {
91            $this->instance =& new SC_Query($dsn, $force_run, $new);
92        }
93        $this->instance->where = "";
94        $this->instance->order = "";
95        $this->instance->groupby = "";
96        $this->instance->option = "";
97        return $this->instance;
98    }
99
100    /**
101     *  エラー判定を行う.
102     *
103     * @deprecated PEAR::isError() を使用して下さい
104     * @return boolean
105     */
106    function isError() {
107        if(PEAR::isError($this->conn)) {
108            return true;
109        }
110        return false;
111    }
112
113    /**
114     * COUNT文を実行する.
115     *
116     * @param string $table テーブル名
117     * @param string $where where句
118     * @param array $arrval プレースホルダ
119     * @return integer 件数
120     */
121    function count($table, $where = "", $arrval = array()) {
122        if(strlen($where) <= 0) {
123            $sqlse = "SELECT COUNT(*) FROM $table";
124        } else {
125            $sqlse = "SELECT COUNT(*) FROM $table WHERE $where";
126        }
127        $sqlse = $this->dbFactory->sfChangeMySQL($sqlse);
128        return $this->getOne($sqlse, $arrval);
129    }
130
131    /**
132     * SELECT文を実行する.
133     *
134     * @param string $col カラム名. 複数カラムの場合はカンマ区切りで書く
135     * @param string $table テーブル名
136     * @param string $where WHERE句
137     * @param array $arrval プレースホルダ
138     * @param integer $fetchmode 使用するフェッチモード。デフォルトは MDB2_FETCHMODE_ASSOC。
139     * @return array|null
140     */
141    function select($col, $table, $where = "", $arrval = array(), $fetchmode = MDB2_FETCHMODE_ASSOC) {
142        $sqlse = $this->getSql($col, $table, $where);
143        echo $sqlse;
144        return $this->getAll($sqlse, $arrval, $fetchmode);
145    }
146
147    /**
148     * 直前に実行されたSQL文を取得する.
149     *
150     * @param boolean $disp trueの場合、画面出力を行う.
151     * @return string SQL文
152     */
153    function getLastQuery($disp = true) {
154        $sql = $this->conn->last_query;
155        if($disp) {
156            print($sql.";<br />\n");
157        }
158        return $sql;
159    }
160
161    /**
162     * トランザクションをコミットする.
163     *
164     * @return MDB2_OK 成功した場合は MDB2_OK;
165     *         失敗した場合は PEAR::Error オブジェクト
166     */
167    function commit() {
168        return $this->conn->commit();
169    }
170
171    /**
172     * トランザクションを開始する.
173     *
174     * @return MDB2_OK 成功した場合は MDB2_OK;
175     *         失敗した場合は PEAR::Error オブジェクト
176     */
177    function begin() {
178        return $this->conn->beginTransaction();
179    }
180
181    /**
182     * トランザクションをロールバックする.
183     *
184     * @return MDB2_OK 成功した場合は MDB2_OK;
185     *         失敗した場合は PEAR::Error オブジェクト
186     */
187    function rollback() {
188        return $this->conn->rollback();
189    }
190
191    /**
192     * トランザクションが開始されているかチェックする.
193     *
194     * @return boolean トランザクションが開始されている場合 true
195     */
196    function inTransaction() {
197        return $this->conn->inTransaction();
198    }
199
200    /**
201     * 更新系の SQL を実行する.
202     *
203     * この関数は SC_Query::query() のエイリアスです.
204     *
205     * FIXME MDB2::exec() の実装であるべき
206     */
207    function exec($str, $arrval = array()) {
208        return $this->query($str, $arrval);
209    }
210
211    /**
212     * クエリを実行し、全ての行を返す
213     *
214     * @param string $sql SQL クエリ
215     * @param array $arrVal プリペアドステートメントの実行時に使用される配列。配列の要素数は、クエリ内のプレースホルダの数と同じでなければなりません。
216     * @param integer $fetchmode 使用するフェッチモード。デフォルトは DB_FETCHMODE_ASSOC。
217     * @return array データを含む2次元配列。失敗した場合に 0 または DB_Error オブジェクトを返します。
218     */
219    function getAll($sql, $arrval = array(), $fetchmode = MDB2_FETCHMODE_ASSOC) {
220
221        $sql = $this->dbFactory->sfChangeMySQL($sql);
222
223        $sth =& $this->prepare($sql);
224        if (PEAR::isError($sth) && $this->force_run) {
225            return;
226        }
227
228        $affected =& $this->execute($sth, $arrval);
229        if (PEAR::isError($affected) && $this->force_run) {
230            return;
231        }
232
233        return $affected->fetchAll($fetchmode);
234    }
235
236    /**
237     * 構築した SELECT 文を取得する.
238     *
239     * @param string $col SELECT 文に含めるカラム名
240     * @param string $table SELECT 文に含めるテーブル名
241     * @param string $where SELECT 文に含める WHERE 句
242     * @return string 構築済みの SELECT 文
243     */
244    function getSql($col, $table, $where = '') {
245        $sqlse = "SELECT $col FROM $table";
246
247        // 引数の$whereを優先する。
248        if (strlen($where) >= 1) {
249            $sqlse .= " WHERE $where";
250        } elseif (strlen($this->where) >= 1) {
251            $sqlse .= " WHERE " . $this->where;
252        }
253
254        $sqlse .= ' ' . $this->groupby . ' ' . $this->order . ' ' . $this->option;
255
256        return $sqlse;
257    }
258
259    /**
260     * SELECT 文の末尾に付与する SQL を設定する.
261     *
262     * この関数で設定した値は SC_Query::getSql() で使用されます.
263     *
264     * @param string $str 付与する SQL 文
265     * @return SC_Query 自分自身のインスタンス
266     */
267    function setOption($str) {
268        $this->option = $str;
269        return $this;
270    }
271
272    /**
273     * SELECT 文に付与する LIMIT, OFFSET 句を設定する.
274     *
275     * この関数で設定した値は SC_Query::getSql() で使用されます.
276     * TODO MDB2::setLimit() を使用する
277     *
278     * @param integer $limit LIMIT 句に付与する値
279     * @param integer $offset OFFSET 句に付与する値
280     * @return SC_Query 自分自身のインスタンス
281     */
282    function setLimitOffset($limit, $offset = 0) {
283        if (is_numeric($limit) && is_numeric($offset)){
284
285            $option = " LIMIT " . $limit;
286            $option.= " OFFSET " . $offset;
287            $this->option .= $option;
288        }
289        return $this;
290    }
291
292    /**
293     * SELECT 文に付与する GROUP BY 句を設定する.
294     *
295     * この関数で設定した値は SC_Query::getSql() で使用されます.
296     *
297     * @param string $str GROUP BY 句に付与する文字列
298     * @return SC_Query 自分自身のインスタンス
299     */
300    function setGroupBy($str) {
301        if (strlen($str) == 0) {
302            $this->groupby = '';
303        } else {
304            $this->groupby = "GROUP BY " . $str;
305        }
306        return $this;
307    }
308
309    /**
310     * SELECT 文の WHERE 句に付与する AND 条件を設定する.
311     *
312     * この関数で設定した値は SC_Query::getSql() で使用されます.
313     *
314     * @param string $str WHERE 句に付与する AND 条件の文字列
315     * @return SC_Query 自分自身のインスタンス
316     */
317    function andWhere($str) {
318        if($this->where != "") {
319            $this->where .= " AND " . $str;
320        } else {
321            $this->where = $str;
322        }
323        return $this;
324    }
325
326    /**
327     * SELECT 文の WHERE 句に付与する OR 条件を設定する.
328     *
329     * この関数で設定した値は SC_Query::getSql() で使用されます.
330     *
331     * @param string $str WHERE 句に付与する OR 条件の文字列
332     * @return SC_Query 自分自身のインスタンス
333     */
334    function orWhere($str) {
335        if($this->where != "") {
336            $this->where .= " OR " . $str;
337        } else {
338            $this->where = $str;
339        }
340        return $this;
341    }
342
343    /**
344     * SELECT 文に付与する WHERE 句を設定する.
345     *
346     * この関数で設定した値は SC_Query::getSql() で使用されます.
347     *
348     * @param string $str WHERE 句に付与する文字列
349     * @return SC_Query 自分自身のインスタンス
350     */
351    function setWhere($str) {
352        $this->where = $str;
353        return $this;
354    }
355
356    /**
357     * SELECT 文に付与する ORDER BY 句を設定する.
358     *
359     * この関数で設定した値は SC_Query::getSql() で使用されます.
360     *
361     * @param string $str ORDER BY 句に付与する文字列
362     * @return SC_Query 自分自身のインスタンス
363     */
364    function setOrder($str) {
365        if (strlen($str) == 0) {
366            $this->order = '';
367        } else {
368            $this->order = "ORDER BY " . $str;
369        }
370        return $this;
371    }
372
373    /**
374     * SELECT 文に付与する LIMIT 句を設定する.
375     *
376     * この関数で設定した値は SC_Query::getSql() で使用されます.
377     *
378     * @param integer $limit LIMIT 句に設定する値
379     * @return SC_Query 自分自身のインスタンス
380     */
381    function setLimit($limit){
382        if ( is_numeric($limit)){
383            $this->option = " LIMIT " .$limit;
384        }
385        return $this;
386    }
387
388    /**
389     * SELECT 文に付与する OFFSET 句を設定する.
390     *
391     * この関数で設定した値は SC_Query::getSql() で使用されます.
392     *
393     * @param integer $offset LIMIT 句に設定する値
394     * @return SC_Query 自分自身のインスタンス
395     */
396    function setOffset($offset) {
397        if ( is_numeric($offset)){
398            $this->offset = " OFFSET " .$offset;
399        }
400        return $this;
401    }
402
403    /**
404     * INSERT文を実行する.
405     *
406     * @param string $table テーブル名
407     * @param array $sqlval array('カラム名' => '値',...)の連想配列
408     * @return
409     */
410    function insert($table, $sqlval) {
411        $strcol = '';
412        $strval = '';
413        $find = false;
414
415        if(count($sqlval) <= 0 ) return false;
416
417        foreach ($sqlval as $key => $val) {
418            $strcol .= $key . ',';
419            if(eregi("^Now\(\)$", $val)) {
420                $strval .= 'Now(),';
421            } else {
422                $strval .= '?,';
423                $arrval[] = $val;
424            }
425            $find = true;
426        }
427        if(!$find) {
428            return false;
429        }
430        // 文末の","を削除
431        $strcol = ereg_replace(",$","",$strcol);
432        // 文末の","を削除
433        $strval = ereg_replace(",$","",$strval);
434        $sqlin = "INSERT INTO $table(" . $strcol. ") VALUES (" . $strval . ")";
435        // INSERT文の実行
436        $ret = $this->query($sqlin, $arrval);
437
438        return $ret;
439    }
440
441    /**
442     * UPDATE文を実行する.
443     *
444     * @param string $table テーブル名
445     * @param array $sqlval array('カラム名' => '値',...)の連想配列
446     * @param string $where WHERE句
447     * @param array $arrValIn WHERE句用のプレースホルダ配列 (従来は追加カラム用も兼ねていた)
448     * @param array $arrRawSql 追加カラム
449     * @param array $arrRawSqlVal 追加カラム用のプレースホルダ配列
450     * @return
451     */
452    function update($table, $sqlval, $where = "", $arrValIn = array(), $arrRawSql = array(), $arrRawSqlVal = array()) {
453        $arrCol = array();
454        $arrVal = array();
455        $find = false;
456        foreach ($sqlval as $key => $val) {
457            if (eregi("^Now\(\)$", $val)) {
458                $arrCol[] = $key . '= Now()';
459            } else {
460                $arrCol[] = $key . '= ?';
461                $arrVal[] = $val;
462            }
463            $find = true;
464        }
465
466        if ($arrRawSql != "") {
467            foreach($arrRawSql as $key => $val) {
468                $arrCol[] = "$key = $val";
469            }
470        }
471       
472        $arrVal = array_merge($arrVal, $arrRawSqlVal);
473       
474        if (empty($arrCol)) {
475            return false;
476        }
477
478        // 文末の","を削除
479        $strcol = implode(', ', $arrCol);
480
481        if (is_array($arrValIn)) { // 旧版との互換用
482            // プレースホルダー用に配列を追加
483            $arrVal = array_merge($arrVal, $arrValIn);
484        }
485
486        $sqlup = "UPDATE $table SET $strcol";
487        if (strlen($where) >= 1) {
488            $sqlup .= " WHERE $where";
489        }
490
491        // UPDATE文の実行
492        return $this->query($sqlup, $arrVal);
493    }
494
495    /**
496     * MAX文を実行する.
497     *
498     * @param string $table テーブル名
499     * @param string $col カラム名
500     * @param string $where 付与する WHERE 句
501     * @param array $arrval ブレースホルダに挿入する値
502     * @return integer MAX文の実行結果
503     */
504    function max($table, $col, $where = "", $arrval = array()) {
505        $ret = $this->get($table, "MAX($col)", $where, $arrval);
506        return $ret;
507    }
508
509    /**
510     * MIN文を実行する.
511     *
512     * @param string $table テーブル名
513     * @param string $col カラム名
514     * @param string $where 付与する WHERE 句
515     * @param array $arrval ブレースホルダに挿入する値
516     * @return integer MIN文の実行結果
517     */
518    function min($table, $col, $where = "", $arrval = array()) {
519        $ret = $this->get($table, "MIN($col)", $where, $arrval);
520        return $ret;
521    }
522
523    /**
524     * SQL を構築して, 特定のカラムの値を取得する.
525     *
526     * @param string $table テーブル名
527     * @param string $col カラム名
528     * @param string $where 付与する WHERE 句
529     * @param array $arrval ブレースホルダに挿入する値
530     * @return mixed SQL の実行結果
531     */
532    function get($table, $col, $where = "", $arrval = array()) {
533        $sqlse = $this->getSql($col, $table, $where);
534        // SQL文の実行
535        $ret = $this->getOne($sqlse, $arrval);
536        return $ret;
537    }
538
539    /**
540     * SQL を指定して, 特定のカラムの値を取得する.
541     *
542     * @param string $sql 実行する SQL
543     * @param array $arrval ブレースホルダに挿入する値
544     * @return mixed SQL の実行結果
545     */
546    function getOne($sql, $arrval = array()) {
547
548        $sql = $this->dbFactory->sfChangeMySQL($sql);
549
550        $sth =& $this->prepare($sql);
551        if (PEAR::isError($sth) && $this->force_run) {
552            return;
553        }
554
555        $affected =& $this->execute($sth, $arrval);
556        if (PEAR::isError($affected) && $this->force_run) {
557            return;
558        }
559
560        return $affected->fetchOne();
561    }
562
563    /**
564     * 一行をカラム名をキーとした連想配列として取得
565     *
566     * @param string $table テーブル名
567     * @param string $col カラム名
568     * @param string $where WHERE句
569     * @param array $arrVal プレースホルダ配列
570     * @param integer $fetchmode 使用するフェッチモード。デフォルトは MDB2_FETCHMODE_ASSOC。
571     * @return array array('カラム名' => '値', ...)の連想配列
572     */
573    function getRow($table, $col, $where = "", $arrVal = array(), $fetchmode = MDB2_FETCHMODE_ASSOC) {
574
575        $sql = $this->getSql($col, $table, $where);
576        $sql = $this->dbFactory->sfChangeMySQL($sql);
577
578        $sth =& $this->prepare($sql);
579        if (PEAR::isError($sth) && $this->force_run) {
580            return;
581        }
582
583        $affected =& $this->execute($sth, $arrVal);
584        if (PEAR::isError($affected) && $this->force_run) {
585            return;
586        }
587
588        return $affected->fetchRow($fetchmode);
589    }
590
591    /**
592     * SELECT 文の実行結果を 1行のみ取得する.
593     *
594     * @param string $table テーブル名
595     * @param string $col カラム名
596     * @param string $where 付与する WHERE 句
597     * @param array $arrval ブレースホルダに挿入する値
598     * @return array SQL の実行結果の配列
599     */
600    function getCol($table, $col, $where = "", $arrval = array()) {
601        $sql = $this->getSql($col, $table, $where);
602        $sql = $this->dbFactory->sfChangeMySQL($sql);
603
604        $sth =& $this->prepare($sql);
605        if (PEAR::isError($sth) && $this->force_run) {
606            return;
607        }
608
609        $affected =& $this->execute($sth, $arrval);
610        if (PEAR::isError($affected) && $this->force_run) {
611            return;
612        }
613
614        return $affected->fetchCol($col);
615    }
616
617    /**
618     * レコードの削除
619     *
620     * @param string $table テーブル名
621     * @param string $where WHERE句
622     * @param array $arrval プレースホルダ
623     * @return
624     */
625    function delete($table, $where = "", $arrval = array()) {
626        if(strlen($where) <= 0) {
627            $sqlde = "DELETE FROM $table";
628        } else {
629            $sqlde = "DELETE FROM $table WHERE $where";
630        }
631        $ret = $this->query($sqlde, $arrval);
632        return $ret;
633    }
634
635    /**
636     * 次のシーケンス値を取得する.
637     *
638     * @param string $seq_name 取得するシーケンス名
639     * @param integer 次のシーケンス値
640     */
641    function nextVal($seq_name) {
642        return $this->conn->nextID($seq_name);
643    }
644
645    /**
646     * 現在のシーケンス値を取得する.
647     *
648     * @param string $seq_name 取得するシーケンス名
649     * @return integer 現在のシーケンス値
650     */
651    function currVal($seq_name) {
652        return $this->conn->currID($seq_name);
653    }
654
655    /**
656     * シーケンス値を設定する.
657     *
658     * @param string $seq_name シーケンス名
659     * @param integer $start 設定するシーケンス値
660     * @return MDB2_OK
661     */
662    function setVal($seq_name, $start) {
663        $this->conn->loadModule('Manager');
664        // XXX エラーハンドリングを行う
665        $this->conn->dropSequence($seq_name);
666        return $this->conn->createSequence($seq_name, $start);
667    }
668
669    /**
670     * SQL を実行する.
671     *
672     * XXX 更新系には exec() を使用するべき
673     *
674     * @param string $n 実行する SQL 文
675     * @param array $arrval ブレースホルダに挿入する値
676     * @return array SQL の実行結果の配列
677     */
678    function query($n ,$arr = array(), $ignore_err = false){
679
680        $n = $this->dbFactory->sfChangeMySQL($n);
681
682        $sth =& $this->prepare($n);
683        if (PEAR::isError($sth) && $this->force_run) {
684            return;
685        }
686
687        $result = $this->execute($sth, $arr);
688        if (PEAR::isError($result) && $this->force_run) {
689            return;
690        }
691
692        return $result;
693    }
694
695    /**
696     * シーケンスの一覧を取得する.
697     *
698     * @return array シーケンス名の配列
699     */
700    function listSequences() {
701        $this->conn->loadModule('Manager');
702        return $this->conn->listSequences();
703    }
704
705    /**
706     * テーブル一覧を取得する.
707     *
708     * @return array テーブル名の配列
709     */
710    function listTables() {
711        $this->conn->loadModule('Manager');
712        return $this->conn->listTables();
713    }
714
715    /**
716     * テーブルのカラム一覧を取得する.
717     *
718     * @param string $table テーブル名
719     * @return array 指定のテーブルのカラム名の配列
720     */
721    function listTableFields($table) {
722        $this->conn->loadModule('Manager');
723        return $this->conn->listTableFields($table);
724    }
725
726    /**
727     * テーブルのインデックス一覧を取得する.
728     *
729     * @param string $table テーブル名
730     * @return array 指定のテーブルのインデックス一覧
731     */
732    function listTableIndexes($table) {
733        $this->conn->loadModule('Manager');
734        return $this->conn->listTableIndexes($table);
735    }
736
737    /**
738     * 値を適切にクォートする.
739     *
740     * TODO MDB2 に対応するための暫定的な措置.
741     *      ブレースホルダが使用できない実装があるため.
742     *      本来であれば, MDB2::prepare() を適切に使用するべき
743     *
744     * @see MDB2::quote()
745     * @param string $val クォートを行う文字列
746     * @return string クォートされた文字列
747     */
748    function quote($val) {
749        return $this->conn->quote($val);
750    }
751
752    /**
753     * プリペアドステートメントを構築する.
754     *
755     * @access private
756     * @param string $sql プリペアドステートメントを構築する SQL
757     * @return MDB2_Statement_Common プリペアドステートメントインスタンス
758     */
759    function prepare($sql) {
760        $sth =& $this->conn->prepare($sql);
761        if (PEAR::isError($sth)) {
762            if (!$this->force_run) {
763                trigger_error($this->traceError($sth, $sql), E_USER_ERROR);
764            } else {
765                error_log($this->traceError($sth, $sql), 3, LOG_PATH);
766            }
767        }
768        return $sth;
769    }
770
771    /**
772     * プリペアドクエリを実行する.
773     *
774     * @access private
775     * @param MDB2_Statement_Common プリペアドステートメントインスタンス
776     * @param array $arrVal ブレースホルダに挿入する配列
777     * @return MDB2_Result 結果セットのインスタンス
778     */
779    function execute(&$sth, $arrVal = array()) {
780        $affected =& $sth->execute($arrVal);
781        if (PEAR::isError($affected)) {
782            $sql = isset($sth->query) ? $sth->query : '';
783            if (!$this->force_run) {
784                trigger_error($this->traceError($affected, $sql), E_USER_ERROR);
785            } else {
786                error_log($this->traceError($affected, $sql), 3, LOG_PATH);
787            }
788        }
789        return $affected;
790    }
791
792    /**
793     * エラーの内容をトレースする.
794     *
795     * @access private
796     * @param PEAR::Error $error PEAR::Error インスタンス
797     * @param string $sql エラーの発生した SQL 文
798     * @return string トレースしたエラー文字列
799     */
800    function traceError($error, $sql = "") {
801        $scheme = '';
802        if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
803            $scheme = "http://";
804        } else {
805            $scheme = "https://";
806        }
807
808        $err = $scheme . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . "\n\n"
809            . "SERVER_ADDR: " . $_SERVER['SERVER_ADDR'] . "\n"
810            . "REMOTE_ADDR: " . $_SERVER['REMOTE_ADDR'] . "\n"
811            . "USER_AGENT: " . $_SERVER['HTTP_USER_AGENT'] . "\n\n"
812            . "SQL: " . $sql . "\n\n"
813            . $error->getMessage() . "\n\n"
814            . $error->getUserInfo() . "\n\n";
815
816        $err .= SC_Utils_Ex::sfBacktraceToString($error->getBackTrace());
817
818        return $err;
819    }
820}
821
822?>
Note: See TracBrowser for help on using the repository browser.