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

Revision 18811, 25.1 KB checked in by Seasoft, 11 years ago (diff)

#565(SC_DbConn クラスの削除)

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