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

Revision 18796, 24.8 KB checked in by nanasess, 11 years ago (diff)

エラーログ出力の改善(#567)

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