-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path_db_pgsql.php
193 lines (160 loc) · 7.74 KB
/
_db_pgsql.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
<?php
/* Database Tools
* A collection of tools for making database queries easier in PHP scripts
* Version 2.b for PostgreSQL
* Copyright (c) 2006-2013 Cyril Bornet, all rights reserved
* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
* Historique des versions :
* 05/03/2006 | 1.0 | Version initiale, comprenant méthodes openTable(), db_s(), db_g(), db_e(), db_i(), db_u() et db_d().
* 25/05/2007 | 1.2 | Renommage des fonctions ci-dessus vers db_o(), db_s(), db_g(), db_e(), db_i(), db_u(), db_d(), pour compatibilité avec version publique.
* 03/08/2007 | 1.3 | Correction affectant la fonction db_o() : suppression du paramètre $table (inutile) / ajout de la fonction ouverte db_x().
* 03/08/2007 | 1.4 | Système de journalisation pour toutes les méthodes altérant des données.
* 12/11/2010 | 1.5 | Potential security flaws fixes.
* 04/01/2011 | 1.6 | Unique connection in global variable
* 09/02/2012 | 2.0 | Updated sort arguments calls, added transactions support
* 23/07/2012 | 2.b | PostgreSQL version
* 27/05/2013 | 2.1 | Return values in case of errors/successes fix
* 13/06/2013 | 2.2 | Advanced selector implementation (credits to Vincent Barbay), bug fix in db_d()
*/
// === VARIABLES de connexion pour ce site =====================================================================================================================
define('STR_QUOTE', "'");
// === Ouvre une CONNEXION globale au serveur de DB ============================================================================================================
$GLOBALS['db_link'] = false;
function db_o() {
if ($GLOBALS['db_link']===false) {
$GLOBALS['db_link'] = pg_connect('host='.DB_HOST.' port='.DB_PORT.' dbname='.DB_NAME.' user='.DB_USER.' password='.DB_PASS);
pg_set_client_encoding($GLOBALS['db_link'], 'UTF8');
}
return $GLOBALS['db_link'];
}
// === Effectue une RECHERCHE dans la base de données du site ==================================================================================================
function db_s($table, $refs=array(), $sortParams=array()) {
$link = db_o(); // Ouvre une connexion
$sql = 'SELECT * FROM '.$table.db_w($refs);
// Sort parameters ______________________________________________________________________
if (count($sortParams)>0) {
$sort = array();
foreach ($sortParams as $key => $dir) {
$sort[] = $key.' '.$dir;
}
$sql.=' ORDER BY '.implode(', ', $sort);
}
else {
$sql.=' ORDER BY RANDOM()';
}
$result = pg_query($link, $sql);
if ( $result == false) {
dieWithError(pg_last_error($link), 'error', $sql); #mysql_error($link)
}
return $result;
}
function db_w($refs) {
// Filter parameters ____________________________________________________________________
$link = db_o(); // Ouvre une connexion
if (count($refs)>0) {
$where = array();
foreach ($refs as $key => $value) {
if(strstr($key, "%") !== false){
$proper_key = str_replace('%','',$proper_key);
$str_val = ($value===null)?'null':STR_QUOTE.pg_escape_string($link, str_replace($proper_key,(string)$value,$key)).STR_QUOTE;
$where[] = $proper_key.' ILIKE '.$str_val;
}elseif(strstr($key, "!")){
$proper_key = str_replace('!','',$proper_key);
$str_val = ($value===null)?'null':STR_QUOTE.pg_escape_string($link, (string)$value).STR_QUOTE;
$where[] = $proper_key.' != '.$str_val;
}else{
$str_val = ($value===null)?'null':STR_QUOTE.pg_escape_string($link, (string)$value).STR_QUOTE;
$where[] = $key.' = '.$str_val;
}
}
return ' WHERE ('.implode(' AND ', $where).')';
}
else return '';
}
// === INSERE les données $datas dans la table $table de la base de donnés de ce site ==========================================================================
function db_i($table, $datas, $do_log=false) {
$link = db_o(); // Ouvre une connexion
$keys = array();
$values = array();
foreach ($datas as $key => $value) { // |
$keys[] = $key; // |
$values[] = STR_QUOTE.pg_escape_string($link, $value).STR_QUOTE; // Parcourt les données en paramètres pour les réarranger conformément à la requête SQL
} // /
$sql = 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).');'; // Requête SQL
$result = pg_query($link, $sql); //
if ( $result == false) {
dieWithError(pg_last_error($link), 'error', $sql); #mysql_error($link)
}
else return true;
}
// === MODIFIE la ligne avec id=$id dans la table $table de la base de donnés de ce site =======================================================================
function db_u($table, $refs, $datas, $do_log=true) {
$link = db_o(); // Ouvre une connexion
$test = db_s($table, $refs); // Pour éviter le risque d'écraser des données, on fait un test de cohérence avant d'entamer les modifs.
if (db_count($test) > 1) { //
dieWithError('', '', 'db_u() cannot be used on tables with non-unique IDs.'); // Si plusieurs lignes ont le même ID, on arrête tout ici par précaution
}
$toChange = array(); // |
foreach ($datas as $key => $value) { // |
$sql_value = db_escape($value); // |
$toChange[] = $key.'='.STR_QUOTE.$sql_value.STR_QUOTE; // |
} // /
$sql = 'UPDATE '.$table.' SET '.implode(',',$toChange).db_w($refs); // Requête SQL
$result = pg_query($link, $sql); //
if ( $result == false) {
dieWithError(pg_last_error($link), 'error', $sql); #mysql_error($link)
}
else return true;
}
// === SUPPRIME la ligne avec id=$id dans la table $table de la base de donnés de ce site ======================================================================
function db_d($table, $refs, $do_log=false) {
$link = db_o(); // Ouvre une connexion
// Pour éviter le risque d'écraser des données, on fait un test de cohérence avant d'entamer les modifs.
$test = db_s($table, $refs);
if (db_count($test) > 1) {
dieWithError('', '', 'db_d() cannot be used on tables with non-unique IDs.'); // Si plusieurs lignes ont le même ID, on arrête tout ici par précaution
}
elseif (db_count($test) > 0) {
$sql = 'DELETE FROM '.$table.db_w($refs);
$result = pg_query($link, $sql);
if ( $result == false) {
dieWithError(pg_last_error($link), 'error', $sql); #mysql_error($link)
}
else return true;
}
}
// === EXECUTE la requête passée en paramètre ==================================================================================================================
function db_x($request, $do_log=false) {
$link = db_o();
$result = pg_query($link, $request);
if ( $result == false) {
dieWithError(pg_last_error($link), 'error', $sql); #mysql_error($link)
}
else {
return $result;
}
}
// === TRANSACTIONS ============================================================================================================================================
function db_begin() {
die('Not implemented for PostgreSQL yet.');
}
function db_commit() {
die('Not implemented for PostgreSQL yet.');
}
// === TOOLS & Helpers =========================================================================================================================================
function db_escape($string) {
$link = db_o();
return pg_escape_string($link, $string);
}
function db_fetch($src) {
return pg_fetch_assoc($src);
}
function db_seek($src, $offset = 0) {
return pg_result_seek($src,$offset);
}
function db_count($src) {
return pg_num_rows($src);
}
function dieWithError($code, $msg, $stmt) {
die('<br/><br/><b>PostgreSQL error '.$code.': '.$msg.'</b><br/>When executing : <pre style="background:#CCC;padding:5px;">'.$stmt.'</pre>');
}