5 private $error_log = false;
6 private $error_mail = false;
7 private $lastInsertTable = null;
9 public function __construct($driver, $host, $dbname, $user, $passwd)
11 $this->db = new PDO(sprintf('%s:host=%s;dbname=%s', $driver, $host, $dbname), $user, $passwd);
12 $this->db->query("SET DateStyle = 'ISO'");
14 # $this->db->query("SET NAMES 'utf8'");
15 # $this->db->query("SET CHARACTER SET 'utf8'");
16 # $this->db->query("SET collation_connection = 'utf8_general_ci'");
17 # $this->db->query("SET lc_time_names = 'de_DE'");
20 public function enableErrorLog()
22 $this->error_log = true;
25 public function disableErrorLog()
27 $this->error_log = false;
30 public function setErrorMail($address)
32 $this->error_mail = $address;
35 private function logQuery($sql)
37 if ($this->error_log) error_log(trim(str_replace("\n", ' ', $sql)));
40 private function handleError($sth, $sql, $data=false)
42 if (!$this->error_log) error_log(trim(str_replace("\n", ' ', $sql)));
43 $arr = $this->db->errorInfo();
44 foreach (explode("\n", $arr[2]) as $line)
47 if ($this->error_mail && defined('MAIL_FROM') && defined('MAIL_FROM_NAME')) {
49 $mail->env_from(MAIL_FROM);
50 $mail->set('From', mb_encode_mimeheader(utf8_decode(sprintf("%s <%s>", MAIL_FROM_NAME, MAIL_FROM)),'latin1'));
51 $mail->set('To', $this->error_mail);
52 $mail->set('Subject', 'SQL Error in ' . $_SERVER['REQUEST_URI']);
54 $body = sprintf("http://%s%s%s\nReferer: %s\nUser: %s\n\n%s\n\nError Number %d\n%s\n\n",
55 $_SERVER['SERVER_NAME'],
56 $_SERVER['SERVER_PORT'] != 80 ? ':'.$_SERVER['SERVER_PORT'] : '',
57 $_SERVER['REQUEST_URI'],
58 $_SERVER['HTTP_REFERER'],
59 $_SESSION['sys']['login'],
65 debug_print_backtrace();
66 $body .= ob_get_contents()."\n";
69 if (count($_POST)) $body .= 'POST: ' . var_export($_POST,true)."\n";
70 if (count($_GET)) $body .= 'GET: ' . var_export($_GET,true)."\n";
71 if (count($_SESSION)) $body .= 'SESSION: ' . var_export($_SESSION,true)."\n";
72 if ($data) $body .= 'data: ' . var_export($data,true)."\n";
79 public function errorInfo()
81 return $this->db->errorInfo();
84 public function quote($string)
86 if (is_null($string)) return 'NULL';
87 if (strtolower($string) == 'now()' || strtolower($string) == 'current_timestamp') return 'now()';
88 return $this->db->quote($string);
91 public function lastInsertId()
93 if (DBDRIVER == 'pgsql')
94 return $this->db->lastInsertId($this->lastInsertTable.'_id_seq');
96 return $this->db->lastInsertId();
99 private function query($sql)
101 $this->logQuery($sql);
102 $sth = $this->db->query($sql);
104 if ($sth === false) return $this->handleError($sth,$sql);
106 if (preg_match('/INSERT\s+INTO\s+(\S+)\s+/i', $sql, $matches))
107 $this->lastInsertTable = $matches[1];
112 public function execute($sql)
114 return $this->query($sql) !== false;
117 public function fetchValue($sql)
119 $sth = $this->query($sql);
120 if ($sth === false) return false;
121 $ret = $sth->fetch(PDO::FETCH_BOTH);
122 if ($ret === false) return false;
126 public function fetchAssoc($sql)
128 $sth = $this->query($sql);
129 if ($sth === false) return false;
130 return $sth->fetch(PDO::FETCH_ASSOC);
133 public function fetchObject($sql)
135 $sth = $this->query($sql);
136 if ($sth === false) return false;
137 return $sth->fetchObject();
140 public function fetchAssocList($sql)
143 $sth = $this->query($sql);
144 if ($sth === false) return $result;
145 while ($row = $sth->fetch(PDO::FETCH_ASSOC))
150 public function fetchObjectList($sql)
153 $sth = $this->query($sql);
154 if ($sth === false) return $result;
155 while ($row = $sth->fetchObject())
160 private function executeBind($sql, $data)
162 $sth = $this->db->prepare($sql);
163 if ($sth === false) return $this->handleError($sth,$sql);
165 foreach ($data as $key => $value) {
167 $param = PDO::PARAM_INT;
168 elseif(is_bool($value))
169 $param = PDO::PARAM_BOOL;
170 elseif(is_null($value))
171 $param = PDO::PARAM_NULL;
172 elseif(is_string($value))
173 $param = PDO::PARAM_STR;
177 $sth->bindValue(':'.$key, $value, $param);
180 $ok = $sth->execute();
181 if ($ok === false) return $this->handleError($sth,$sql,$data);
183 if (preg_match('/INSERT\s+INTO\s+(\S+)\s+/i', $sql, $matches))
184 $this->lastInsertTable = $matches[1];
189 public function insertInto($table, $data)
191 if (!is_array($data)) throw Exception('insertInto called without data array');
194 foreach ($data as $k => $v) {
196 $values[] = ':' . $k;
199 $sql = sprintf("INSERT INTO %s (%s)\n VALUES (%s)",
201 implode(',', $columns),
202 implode(',', $values));
203 return $this->executeBind($sql, $data);
206 public function update($table, $data, $condition)
208 if (!is_array($data)) throw Exception('update called without data array');
209 if (empty($condition)) throw Exception('update called without condition');
212 foreach ($data as $k => $v)
215 $sql = sprintf("UPDATE %s SET %s\n WHERE %s",
219 return $this->executeBind($sql, $data);