login/pass: error messages below page title
[minimedit.git] / database.inc.php
1 <?php
2 $dsn = require '.dbconfig.inc.php';
3 $Db = new DB($dsn);
4
5 class DB
6 {
7         public $dbh;
8
9         function __construct($config, $options = [])
10         {
11                 $options += [
12                         PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
13                         PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
14                 ];
15                 $this->dbh = new PDO($config, NULL, NULL, $options);
16         }
17
18         function query($sql, $params = [])
19         {
20                 $stmt = $this->dbh->prepare($sql);
21                 $stmt->execute($params);
22                 return $stmt;
23         }
24
25         function _value($val, &$params)
26         {
27                 if (is_array($val)) {
28                         $sql = array_shift($val);
29                         $params = array_merge($params, $val);
30                         return $sql;
31                 }
32                 elseif (is_bool($val)) {
33                         return $val ? 'TRUE' : 'FALSE';
34                 }
35
36                 $params[] = $val;
37                 return '?';
38         }
39
40         function set($table, $row, $filter = NULL)
41         {
42                 $params = [];
43                 if (is_null($filter)) {
44                         $cols = [];
45                         foreach ($row as $col => $val) {
46                                 $cols[] = $this->_value($val, $params);
47                         }
48                         $sql = sprintf('INSERT INTO %s (%s) VALUES (%s)',
49                                 '"'.$table.'"',
50                                 implode(', ', array_keys($row)),
51                                 implode(', ', $cols)
52                         );
53                 }
54                 else {
55                         $sql = 'UPDATE "'.$table.'"';
56                         $cols = [];
57                         foreach ($row as $col => $val) {
58                                 $cols[] = $col . ' = ' . $this->_value($val, $params);
59                         }
60
61                         $sql .= ' SET ' . implode(', ', $cols);
62                         if (is_array($filter)) {
63                                 $sql .= ' WHERE ' . array_shift($filter);
64                                 $params = array_merge($params, $filter);
65                         }
66                         else {
67                                 $sql .= ' ' . $filter;
68                         }
69                 }
70                 $sql .= ' RETURNING *';
71                 return $this->query($sql, $params);
72         }
73 }