source: branches/version-2_5-dev/data/class/SC_Query.php @ 18801

Revision 18801, 24.8 KB checked in by nanasess, 14 years ago (diff)

SC_Query::getSql() の WHERE が動作していなかったため修正(#565)

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