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);
13 # $this->db->query("SET NAMES 'utf8'");
14 # $this->db->query("SET CHARACTER SET 'utf8'");
15 # $this->db->query("SET collation_connection = 'utf8_general_ci'");
16 # $this->db->query("SET lc_time_names = 'de_DE'");
19 public function enableErrorLog()
21 $this->error_log = true;
24 public function disableErrorLog()
26 $this->error_log = false;
29 public function setErrorMail($address)
31 $this->error_mail = $address;
34 private function logQuery($sql)
36 if ($this->error_log) error_log(trim(str_replace("\n", ' ', $sql)));
39 private function handleError($sth, $sql, $data=false)
41 if (!$this->error_log) error_log(trim(str_replace("\n", ' ', $sql)));
42 $arr = $this->db->errorInfo();
43 foreach (explode("\n", $arr[2]) as $line)
46 if ($this->error_mail && defined('MAIL_FROM') && defined('MAIL_FROM_NAME')) {
48 $mail->env_from(MAIL_FROM);
49 $mail->set('From', mb_encode_mimeheader(utf8_decode(sprintf("%s <%s>", MAIL_FROM_NAME, MAIL_FROM)),'latin1'));
50 $mail->set('To', $this->error_mail);
51 $mail->set('Subject', 'SQL Error in ' . $_SERVER['REQUEST_URI']);
53 $body = sprintf("http://%s%s%s\nReferer: %s\nUser: %s\n\n%s\n\nError Number %d\n%s\n\n",
54 $_SERVER['SERVER_NAME'],
55 $_SERVER['SERVER_PORT'] != 80 ? ':'.$_SERVER['SERVER_PORT'] : '',
56 $_SERVER['REQUEST_URI'],
57 $_SERVER['HTTP_REFERER'],
58 $_SESSION['sys']['login'],
64 debug_print_backtrace();
65 $body .= ob_get_contents()."\n";
68 if (count($_POST)) $body .= 'POST: ' . var_export($_POST,true)."\n";
69 if (count($_GET)) $body .= 'GET: ' . var_export($_GET,true)."\n";
70 if (count($_SESSION)) $body .= 'SESSION: ' . var_export($_SESSION,true)."\n";
71 if ($data) $body .= 'data: ' . var_export($data,true)."\n";
78 public function errorInfo()
80 return $this->db->errorInfo();
83 public function quote($string)
85 if (is_null($string)) return 'NULL';
86 if (strtolower($string) == 'now()' || strtolower($string) == 'current_timestamp') return 'now()';
87 return $this->db->quote($string);
90 public function lastInsertId()
92 if (DBDRIVER == 'pgsql')
93 return $this->db->lastInsertId($this->lastInsertTable.'_id_seq');
95 return $this->db->lastInsertId();
98 private function query($sql)
100 $this->logQuery($sql);
101 $sth = $this->db->query($sql);
103 if ($sth === false) return $this->handleError($sth,$sql);
105 if (preg_match('/INSERT\s+INTO\s+(\S+)\s+/i', $sql, $matches))
106 $this->lastInsertTable = $matches[1];
111 public function execute($sql)
113 return $this->query($sql) !== false;
116 public function fetchValue($sql)
118 $sth = $this->query($sql);
119 if ($sth === false) return false;
120 $ret = $sth->fetch(PDO::FETCH_BOTH);
121 if ($ret === false) return false;
125 public function fetchAssoc($sql)
127 $sth = $this->query($sql);
128 if ($sth === false) return false;
129 return $sth->fetch(PDO::FETCH_ASSOC);
132 public function fetchObject($sql)
134 $sth = $this->query($sql);
135 if ($sth === false) return false;
136 return $sth->fetchObject();
139 public function fetchAssocList($sql)
142 $sth = $this->query($sql);
143 if ($sth === false) return $result;
144 while ($row = $sth->fetch(PDO::FETCH_ASSOC))
149 public function fetchObjectList($sql)
152 $sth = $this->query($sql);
153 if ($sth === false) return $result;
154 while ($row = $sth->fetchObject())
159 private function executeBind($sql, $data)
161 $sth = $this->db->prepare($sql);
162 if ($sth === false) return $this->handleError($sth,$sql);
164 foreach ($data as $key => $value) {
166 $param = PDO::PARAM_INT;
167 elseif(is_bool($value))
168 $param = PDO::PARAM_BOOL;
169 elseif(is_null($value))
170 $param = PDO::PARAM_NULL;
171 elseif(is_string($value))
172 $param = PDO::PARAM_STR;
176 $sth->bindValue(':'.$key, $value, $param);
179 $ok = $sth->execute();
180 if ($ok === false) return $this->handleError($sth,$sql,$data);
182 if (preg_match('/INSERT\s+INTO\s+(\S+)\s+/i', $sql, $matches))
183 $this->lastInsertTable = $matches[1];
188 public function insertInto($table, $data)
190 if (!is_array($data)) throw Exception('insertInto called without data array');
193 foreach ($data as $k => $v) {
195 $values[] = ':' . $k;
198 $sql = sprintf("INSERT INTO %s (%s)\n VALUES (%s)",
200 implode(',', $columns),
201 implode(',', $values));
202 return $this->executeBind($sql, $data);
205 public function update($table, $data, $condition)
207 if (!is_array($data)) throw Exception('update called without data array');
208 if (empty($condition)) throw Exception('update called without condition');
211 foreach ($data as $k => $v)
214 $sql = sprintf("UPDATE %s SET %s\n WHERE %s",
218 return $this->executeBind($sql, $data);