File:
0.00.1a/core/database/MySQL.php (
View as Code)
1: 2: /* -------------------------------------------------------------
3: This file is part of FreeDESK
4:
5: FreeDESK is (C) Copyright 2012 David Cutting
6:
7: FreeDESK is free software: you can redistribute it and/or modify
8: it under the terms of the GNU General Public License as published by
9: the Free Software Foundation, either version 3 of the License, or
10: (at your option) any later version.
11:
12: FreeDESK is distributed in the hope that it will be useful,
13: but WITHOUT ANY WARRANTY; without even the implied warranty of
14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: GNU General Public License for more details.
16:
17: You should have received a copy of the GNU General Public License
18: along with FreeDESK. If not, see www.gnu.org/licenses
19:
20: For more information see www.purplepixie.org/freedesk/
21: -------------------------------------------------------------- */
22:
23: /**
24: * MySQL concrete implementation of DatabaseBase
25: **/
26:
27: class MySQL extends DatabaseBase
28: {
29: /**
30: * Pointer to the FreeDESK instance
31: **/
32: private $DESK = null;
33: /**
34: * MySQL data connection
35: **/
36: private $connection = null;
37:
38: /**
39: * Table prefix
40: **/
41: var $prefix = "";
42:
43: /**
44: * Constructor
45: * @param object $freeDESK FreeDESK instance
46: **/
47: function MySQL(&$freeDESK)
48: {
49: $this->DESK = &$freeDESK;
50:
51: $this->DESK->PluginManager->Register(new Plugin(
52: "MySQL Database Engine","0.01","Core","DB" ));
53: }
54:
55: /**
56: * Connect
57: * @param string $server Database server
58: * @param string $username Database username
59: * @param string $password Database password
60: * @param string $database Database name
61: * @param string $prefix Database table prefix (optonal, default "")
62: * @return bool Successful connection or not
63: **/
64: function Connect($server, $username, $password,
65: $database, $prefix="")
66: {
67: $this->prefix = $prefix;
68:
69: $this->connection = mysql_connect($server, $username, $password);
70: if ($this->connection <= 0) return false;
71:
72: if (!mysql_select_db($database, $this->connection))
73: return false;
74:
75: return true;
76: }
77:
78: /**
79: * Disconnect
80: **/
81: function Disconnect()
82: {
83: mysql_close($this->connection);
84: }
85:
86: /**
87: * Return table name with correct prefix and escaping
88: * @param string $table table un-prefixed
89: * @return string table with prefix and escape
90: **/
91: function Table($table)
92: {
93: return "`".$this->prefix.$table."`";
94: }
95:
96: /**
97: * Sanitise user-input using correct escaping
98: * @param string $input user input
99: * @return string Sanitised output
100: **/
101: function Safe($input)
102: {
103: return mysql_real_escape_string($input, $this->connection);
104: }
105:
106:
107: /**
108: * Sanitise user-input string and quote
109: * @param string $input user input
110: * @return string Sanitised quoted output
111: **/
112: function SafeQuote($input)
113: {
114: return "\"".$this->Safe($input)."\"";
115: }
116:
117:
118: /**
119: * Contain a field correctly
120: * @param string $field The field name
121: * @return string Escaped field
122: **/
123: function Field($field)
124: {
125: return "`".$field."`";
126: }
127:
128: /**
129: * Escape and contain a field correctly
130: * @param string $value The value of the field
131: * @return string Escaped and prefixed+suffixed data
132: **/
133: function FieldSafe($value)
134: {
135: return $this->Field($this->Safe($value));
136: }
137:
138: /**
139: * Perform a query
140: * @param string $query SQL query
141: * @param bool $report Record any errors using LoggingEngine (optonal, default true)
142: * @return mixed Results of query
143: **/
144: function Query($query, $report=true)
145: {
146: $result=mysql_query($query, $this->connection);
147:
148: if ($report && $this->Error()) // has an error and to be reported
149: {
150: $err="Query Failed: ".$query;
151: $error="SQL Error: ".$this->LastError();
152: $this->DESK->LoggingEngine->Log($err, "SQL", "Fail", 1);
153: $this->DESK->LoggingEngine->Log($error, "SQL", "Error", 1);
154: }
155:
156: return $result;
157: }
158:
159: /**
160: * Number of rows affected by last query
161: * @return int number of rows affected
162: **/
163: function RowsAffected()
164: {
165: return mysql_affected_rows($this->connection);
166: }
167:
168: /**
169: * Number of rows in a result set
170: * @param mixed $result Result set
171: * @return int number of rows in the set
172: **/
173: function NumRows(&$result)
174: {
175: return mysql_num_rows($result);
176: }
177:
178: /**
179: * Fetch next associated array from result set
180: * @param mixed $result Result Set
181: * @return array Assocative Array of Results
182: **/
183: function FetchAssoc(&$result)
184: {
185: return mysql_fetch_assoc($result);
186: }
187:
188: /**
189: * Free a result set
190: * @param mixed $result Result Set
191: **/
192: function Free(&$result)
193: {
194: mysql_free_result($result);
195: }
196:
197: /**
198: * Return an error flag
199: * @return bool Experienced error on last command
200: **/
201: function Error()
202: {
203: if (mysql_errno($this->connection)>0)
204: return true;
205: return false;
206: }
207:
208: /**
209: * Last error code
210: * @return int Error code
211: **/
212: function ErrorCode()
213: {
214: return mysql_errno($this->connection);
215: }
216:
217: /**
218: * Last error description
219: * @return string Error description
220: **/
221: function ErrorDescription()
222: {
223: return mysql_error($this->connection);
224: }
225:
226: /**
227: * The last inserted ID
228: * @return mixed Last inserted ID
229: **/
230: function InsertID()
231: {
232: return mysql_insert_id($this->connection);
233: }
234:
235: /**
236: * Generate a clause from a QueryBuilder object
237: * @param object &$query QueryBuilder object
238: * @return string query string
239: **/
240: function Clause(&$query)
241: {
242: $c = "";
243: foreach($query->items as $item)
244: {
245: if (isset($item['field']))
246: {
247: if ($c!="")
248: $c.=" ";
249: $c.=$this->Field($item['field']);
250:
251: switch($item['type'])
252: {
253: case QueryType::Equal:
254: $c.="=";
255: break;
256: case QueryType::Like:
257: $c.=" LIKE ";
258: break;
259: case QueryType::MoreThan:
260: $c.=" > ";
261: break;
262: case QueryType::MoreThanEqual:
263: $c.=" >= ";
264: break;
265: case QueryType::LessThan:
266: $c.=" < ";
267: break;
268: case QueryType::LessThanEqual:
269: $c.=" <= ";
270: break;
271: case QueryType::NotEqual;
272: $c.=" != ";
273: break;
274: }
275:
276: $c.=$item['value'];
277: }
278: else
279: {
280: switch($item['type'])
281: {
282: case QueryType::OpenBracket:
283: $c.=" ( ";
284: break;
285: case QueryType::CloseBracket:
286: $c.=" ) ";
287: break;
288: case QueryType::opAND:
289: $c.=" AND ";
290: break;
291: case QueryType::opOR:
292: $c.=" OR ";
293: break;
294: }
295: }
296: }
297:
298: if ($c=="")
299: $c="1";
300:
301: return $c;
302: }
303: }
304:
305: ?>
306: