00001 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 class CI_DB_mysql_driver extends CI_DB {
00032
00033 var $dbdriver = 'mysql';
00034
00035
00036 var $_escape_char = '`';
00037
00038
00039
00040
00041
00042
00043 var $delete_hack = TRUE;
00044
00045
00046
00047
00048
00049
00050 var $_count_string = 'SELECT COUNT(*) AS ';
00051 var $_random_keyword = ' RAND()';
00052
00053
00054
00055
00056
00057
00058
00059 function db_connect()
00060 {
00061 if ($this->port != '')
00062 {
00063 $this->hostname .= ':'.$this->port;
00064 }
00065
00066 return @mysql_connect($this->hostname, $this->username, $this->password, TRUE);
00067 }
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 function db_pconnect()
00078 {
00079 if ($this->port != '')
00080 {
00081 $this->hostname .= ':'.$this->port;
00082 }
00083
00084 return @mysql_pconnect($this->hostname, $this->username, $this->password);
00085 }
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 function db_select()
00096 {
00097 return @mysql_select_db($this->database, $this->conn_id);
00098 }
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110 function db_set_charset($charset, $collation)
00111 {
00112 return @mysql_query("SET NAMES '".$this->escape_str($charset)."' COLLATE '".$this->escape_str($collation)."'", $this->conn_id);
00113 }
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123 function _version()
00124 {
00125 return "SELECT version() AS ver";
00126 }
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137 function _execute($sql)
00138 {
00139 $sql = $this->_prep_query($sql);
00140 return @mysql_query($sql, $this->conn_id);
00141 }
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154 function _prep_query($sql)
00155 {
00156
00157
00158 if ($this->delete_hack === TRUE)
00159 {
00160 if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql))
00161 {
00162 $sql = preg_replace("/^\s*DELETE\s+FROM\s+(\S+)\s*$/", "DELETE FROM \\1 WHERE 1=1", $sql);
00163 }
00164 }
00165
00166 return $sql;
00167 }
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 function trans_begin($test_mode = FALSE)
00178 {
00179 if ( ! $this->trans_enabled)
00180 {
00181 return TRUE;
00182 }
00183
00184
00185 if ($this->_trans_depth > 0)
00186 {
00187 return TRUE;
00188 }
00189
00190
00191
00192
00193 $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
00194
00195 $this->simple_query('SET AUTOCOMMIT=0');
00196 $this->simple_query('START TRANSACTION');
00197 return TRUE;
00198 }
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208 function trans_commit()
00209 {
00210 if ( ! $this->trans_enabled)
00211 {
00212 return TRUE;
00213 }
00214
00215
00216 if ($this->_trans_depth > 0)
00217 {
00218 return TRUE;
00219 }
00220
00221 $this->simple_query('COMMIT');
00222 $this->simple_query('SET AUTOCOMMIT=1');
00223 return TRUE;
00224 }
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234 function trans_rollback()
00235 {
00236 if ( ! $this->trans_enabled)
00237 {
00238 return TRUE;
00239 }
00240
00241
00242 if ($this->_trans_depth > 0)
00243 {
00244 return TRUE;
00245 }
00246
00247 $this->simple_query('ROLLBACK');
00248 $this->simple_query('SET AUTOCOMMIT=1');
00249 return TRUE;
00250 }
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261 function escape_str($str)
00262 {
00263 if (is_array($str))
00264 {
00265 foreach($str as $key => $val)
00266 {
00267 $str[$key] = $this->escape_str($val);
00268 }
00269
00270 return $str;
00271 }
00272
00273 if (function_exists('mysql_real_escape_string') AND is_resource($this->conn_id))
00274 {
00275 return mysql_real_escape_string($str, $this->conn_id);
00276 }
00277 elseif (function_exists('mysql_escape_string'))
00278 {
00279 return mysql_escape_string($str);
00280 }
00281 else
00282 {
00283 return addslashes($str);
00284 }
00285 }
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295 function affected_rows()
00296 {
00297 return @mysql_affected_rows($this->conn_id);
00298 }
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308 function insert_id()
00309 {
00310 return @mysql_insert_id($this->conn_id);
00311 }
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325 function count_all($table = '')
00326 {
00327 if ($table == '')
00328 return '0';
00329
00330 $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));
00331
00332 if ($query->num_rows() == 0)
00333 return '0';
00334
00335 $row = $query->row();
00336 return (int)$row->numrows;
00337 }
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350 function _list_tables($prefix_limit = FALSE)
00351 {
00352 $sql = "SHOW TABLES FROM ".$this->_escape_char.$this->database.$this->_escape_char;
00353
00354 if ($prefix_limit !== FALSE AND $this->dbprefix != '')
00355 {
00356 $sql .= " LIKE '".$this->dbprefix."%'";
00357 }
00358
00359 return $sql;
00360 }
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373 function _list_columns($table = '')
00374 {
00375 return "SHOW COLUMNS FROM ".$table;
00376 }
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389 function _field_data($table)
00390 {
00391 return "SELECT * FROM ".$table." LIMIT 1";
00392 }
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402 function _error_message()
00403 {
00404 return mysql_error($this->conn_id);
00405 }
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415 function _error_number()
00416 {
00417 return mysql_errno($this->conn_id);
00418 }
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431 function _escape_identifiers($item)
00432 {
00433 if ($this->_escape_char == '')
00434 {
00435 return $item;
00436 }
00437
00438 if (strpos($item, '.') !== FALSE)
00439 {
00440 $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;
00441 }
00442 else
00443 {
00444 $str = $this->_escape_char.$item.$this->_escape_char;
00445 }
00446
00447
00448 return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
00449 }
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463 function _from_tables($tables)
00464 {
00465 if ( ! is_array($tables))
00466 {
00467 $tables = array($tables);
00468 }
00469
00470 return '('.implode(', ', $tables).')';
00471 }
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486 function _insert($table, $keys, $values)
00487 {
00488 return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
00489 }
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506 function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
00507 {
00508 foreach($values as $key => $val)
00509 {
00510 $valstr[] = $key." = ".$val;
00511 }
00512
00513 $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
00514
00515 $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
00516
00517 $sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
00518
00519 $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
00520
00521 $sql .= $orderby.$limit;
00522
00523 return $sql;
00524 }
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539 function _truncate($table)
00540 {
00541 return "TRUNCATE ".$table;
00542 }
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557 function _delete($table, $where = array(), $like = array(), $limit = FALSE)
00558 {
00559 $conditions = '';
00560
00561 if (count($where) > 0 OR count($like) > 0)
00562 {
00563 $conditions = "\nWHERE ";
00564 $conditions .= implode("\n", $this->ar_where);
00565
00566 if (count($where) > 0 && count($like) > 0)
00567 {
00568 $conditions .= " AND ";
00569 }
00570 $conditions .= implode("\n", $like);
00571 }
00572
00573 $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
00574
00575 return "DELETE FROM ".$table.$conditions.$limit;
00576 }
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591 function _limit($sql, $limit, $offset)
00592 {
00593 if ($offset == 0)
00594 {
00595 $offset = '';
00596 }
00597 else
00598 {
00599 $offset .= ", ";
00600 }
00601
00602 return $sql."LIMIT ".$offset.$limit;
00603 }
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614 function _close($conn_id)
00615 {
00616 @mysql_close($conn_id);
00617 }
00618
00619 }
00620
00621
00622
00623