1:<?php 2:/** 3: * BLOG:CMS: PHP/MySQL Personal Content Management System 4: * http://blogcms.com/ 5: * http://forum.blogcms.com/ 6: * 7: * 2003-2004, (c) Radek HULAN 8: * http://hulan.info/ 9: * 10: * This program is free software; you can redistribute it and/or 11: * modify it under the terms of the GNU General Public License 12: * as published by the Free Software Foundation; either version 2 13: * of the License, or (at your option) any later version. 14:**/ 15: 16:define ('_MYSQL40',0); 17:define ('_MYSQL41',1); 18:define ('_SQLITE', 2); 19:define ('_PGSQL' , 3); 20: 21:/** 22: * Connects to mysql, mysqli, sqlite DB 23: */ 24:function sql_connect($select = true) { 25: global $SQL_HOST, $SQL_USER, $SQL_PASSWORD, $SQL_DATABASE, $SQL_PORT, $activedb, $SQL_TYPE; 26: $activedb = false; 27: switch ($SQL_TYPE) { 28: case _MYSQL40: 29: $activedb = @mysql_connect($SQL_HOST, $SQL_USER, $SQL_PASSWORD); 30: if (!$activedb) die('Could not connect do MySQL 4.0 database.'); 31: if ($select) sql_select_db($SQL_DATABASE); 32: break; 33: case _MYSQL41: 34: if (function_exists('mysqli_connect')) 35: $activedb = @mysqli_connect($SQL_HOST, $SQL_USER, $SQL_PASSWORD); 36: // try old mysql extension if mysqli fails 37: if (!$activedb) { 38: $activedb = @mysql_connect($SQL_HOST, $SQL_USER, $SQL_PASSWORD); 39: if ($activedb) $SQL_TYPE = 0; 40: } 41: if (!$activedb) die('Could not connect do MySQL 4.1 database.'); 42: if ($select) sql_select_db($SQL_DATABASE); 43: break; 44: case _SQLITE: 45: if (!is_readable($SQL_DATABASE)) die('Unable to open database \''.$dbname.'\' for reading. Permission denied.'); 46: if (!is_writable($SQL_DATABASE)) die('Unable to open database \''.$dbname.'\' for writing. Permission denied.'); 47: $activedb = true; 48: if ($select) sql_select_db($SQL_DATABASE); 49: break; 50: case _PGSQL: 51: if (!isset($SQL_PORT)) $SQL_PORT="5432"; 52: $conn_string = "host=$SQL_HOST port=$SQL_PORT dbname=$SQL_DATABASE user=$SQL_USER password=$SQL_PASSWORD"; 53: $activedb = @pg_connect($conn_string); 54: if (!$activedb) die('Could not connect to PostgreSQL database.'); 55: default: 56: die('sql_connect'); 57: } 58: // disable DB if not connected 59: if (!$activedb) $SQL_TYPE = -1; 60:} 61: 62:/** 63: * Creates a new database 64: */ 65:function sql_create_db($dbname){ 66: global $activedb, $SQL_TYPE; 67: switch ($SQL_TYPE) { 68: case _MYSQL40: 69: sql_query("CREATE DATABASE $dbname"); 70: break; 71: case _MYSQL41: 72: sql_query("CREATE DATABASE $dbname"); 73: break; 74: case _SQLITE: 75: if (!file_exists($dbname)) { 76: @touch($dbname); 77: @chmod($dbname, 0666); 78: } 79: if (!file_exists($dbname)) die('Unable to create new database \''.$dbname.'\'. Permission denied.'); 80: if (!is_readable($dbname)) die('Unable to open database \''.$dbname.'\' for reading. Permission denied.'); 81: if (!is_writable($dbname)) die('Unable to open database \''.$dbname.'\' for writing. Permission denied.'); 82: sql_connect(false); 83: break; 84: case _PGSQL: 85: sql_query("CREATE DATABASE $dbname"); 86: break; 87: default: 88: die('sql_create_db'); 89: } 90:} 91: 92:/** 93: * Selects active DB 94: */ 95:function sql_select_db($dbname) { 96: global $activedb, $SQL_TYPE; 97: switch ($SQL_TYPE) { 98: case _MYSQL40: 99: @mysql_select_db($dbname,$activedb) 100: or 101: die('Could not select MySQL 4.0 database: '.mysql_error($activedb)); 102: break; 103: case _MYSQL41: 104: @mysqli_select_db($activedb,$dbname) 105: or 106: die('Could not select MySQL 4.1 database: '. mysqli_error($activedb)); 107: break; 108: case _SQLITE: 109: $activedb = @sqlite_popen($dbname, 0666, $sqlite_error); 110: if (!$activedb) die('Could not open SQLite database.'); 111: sqlite_busy_timeout($activedb,1000); 112: sqlite_create_function($activedb,'UNIX_TIMESTAMP','strtotime',1); 113: sqlite_create_function($activedb,'NOW','time',0); 114: sqlite_create_function($activedb,'DAYOFMONTH','sql_day',1); 115: sqlite_create_function($activedb,'MONTH','sql_month',1); 116: sqlite_create_function($activedb,'YEAR','sql_year',1); 117: sqlite_create_function($activedb,'SUBSTRING','substr',3); 118: break; 119: case _PGSQL: 120: // no need to do anything 121: break; 122: default: 123: die('sql_select_db'); 124: } 125:} 126: 127: 128:function sql_day($time) { 129: return date("d",strtotime($time)); 130:} 131:function sql_month($time) { 132: return date("m",strtotime($time)); 133:} 134:function sql_year($time) { 135: return date("Y",strtotime($time)); 136:} 137: 138:/** 139: * Returns a prefixed table name 140: */ 141:function sql_table($name) { 142: global $SQL_PREFIX; 143: if ($SQL_PREFIX) 144: return $SQL_PREFIX . $name; 145: else 146: return $name; 147:} 148: 149:/** 150: * Disconnects from SQL server 151: */ 152:function sql_disconnect() { 153: global $activedb, $SQL_TYPE; 154: switch ($SQL_TYPE) { 155: case _MYSQL40: 156: @mysql_close($activedb); 157: unset($activedb); 158: break; 159: case _MYSQL41: 160: @mysqli_close($activedb); 161: unset($activedb); 162: break; 163: case _SQLITE: 164: @sqlite_close($activedb); 165: unset($activedb); 166: break; 167: case _PGSQL: 168: @pg_close($activedb); 169: unset($activedb); 170: break; 171: default: 172: die('sql_disconnect'); 173: } 174:} 175: 176:/** 177: * executes an SQL query 178: */ 179:function sql_query($query, $option = MYSQLI_STORE_RESULT) { 180: global $activedb, $SQL_TYPE; 181: switch ($SQL_TYPE) { 182: case _MYSQL40: 183: $result = @mysql_query($query,$activedb) 184: or 185: die ("Invalid query: ".htmlspecialchars($query)." <br><br>Error: <b>".sql_error()."</b>"); 186: break; 187: case _MYSQL41: 188: if (!isset($option)) $option=MYSQLI_STORE_RESULT; 189: $result = @mysqli_query($activedb,$query,$option) 190: or 191: die ("Invalid query: ".htmlspecialchars($query)." <br><br>Error: <b>".sql_error()."</b>"); 192: break; 193: case _SQLITE: 194: $query = preg_replace('/`(\w+)`/','$1',$query); 195: $result = @sqlite_query($activedb,$query) 196: or 197: die ("Invalid query: ".htmlspecialchars($query)." <br><br>Error: <b>".sql_error()."</b>"); 198: break; 199: case _PGSQL: 200: $result = @pg_query($activedb,$query) 201: or 202: die ("Invalid query: ".htmlspecialchars($query)." <br><br>Error: <b>".sql_error()."</b>"); 203: global $_pg; 204: $_pg = &$result; 205: break; 206: default: 207: die('sql_query'); 208: } 209: return $result; 210:} 211: 212:/** 213: * Shows SQL DB error message 214: */ 215:function sql_error() { 216: global $activedb, $SQL_TYPE; 217: switch ($SQL_TYPE) { 218: case _MYSQL40: 219: return @mysql_error($activedb); 220: break; 221: case _MYSQL41: 222: return @mysqli_error($activedb); 223: break; 224: case _SQLITE: 225: return @sqlite_error_string(@sqlite_last_error($activedb)); 226: break; 227: case _PGSQL: 228: return @pg_last_error($activedb); 229: break; 230: default: 231: die('sql_error'); 232: } 233:} 234: 235:/** 236: * Disconnects from SQL server 237: */ 238:function sql_close() { 239: sql_disconnect(); 240:} 241: 242:/** 243: * Fetch resultset as an object 244: */ 245:function sql_fetch_object(&$resource){ 246: global $activedb, $SQL_TYPE; 247: switch ($SQL_TYPE) { 248: case _MYSQL40: 249: return @mysql_fetch_object($resource); 250: break; 251: case _MYSQL41: 252: return @mysqli_fetch_object($resource); 253: break; 254: case _SQLITE: 255: return @sqlite_fetch_object($resource); 256: break; 257: case _PGSQL: 258: return @pg_fetch_object($resource); 259: break; 260: default: 261: die('sql_fetch_object'); 262: } 263:} 264: 265:/** 266: * Fetch resultset as an array (key - field names and row numbers) 267: */ 268:function sql_fetch_array(&$resource){ 269: global $activedb, $SQL_TYPE; 270: switch ($SQL_TYPE) { 271: case _MYSQL40: 272: return @mysql_fetch_array($resource,MYSQL_BOTH); 273: break; 274: case _MYSQL41: 275: return @mysqli_fetch_array($resource,MYSQLI_BOTH); 276: break; 277: case _SQLITE: 278: return @sqlite_fetch_array($resource,SQLITE_BOTH); 279: break; 280: case _PGSQL: 281: return @pg_fetch_array($resource, NULL, PGSQL_BOTH); 282: break; 283: default: 284: die('sql_fetch_array'); 285: } 286:} 287: 288:/** 289: * Fetch resultset as an array (key - field names) 290: */ 291:function sql_fetch_assoc(&$resource){ 292: global $activedb, $SQL_TYPE; 293: switch ($SQL_TYPE) { 294: case _MYSQL40: 295: return @mysql_fetch_assoc($resource); 296: break; 297: case _MYSQL41: 298: return @mysqli_fetch_assoc($resource); 299: break; 300: case _SQLITE: 301: return @sqlite_fetch_array($resource,SQLITE_ASSOC); 302: break; 303: case _PGSQL: 304: return @pg_fetch_array($resource, NULL, PGSQL_ASSOC); 305: break; 306: default: 307: die('sql_fetch_assoc'); 308: } 309:} 310: 311:/** 312: * Fetch resultset as an array (key - row numbers) 313: */ 314:function sql_fetch_row(&$resource){ 315: global $activedb, $SQL_TYPE; 316: switch ($SQL_TYPE) { 317: case _MYSQL40: 318: return @mysql_fetch_row($resource); 319: break; 320: case _MYSQL41: 321: return @mysqli_fetch_row($resource); 322: break; 323: case _SQLITE: 324: return @sqlite_fetch_array($resource,SQLITE_NUM); 325: break; 326: case _PGSQL: 327: return @pg_fetch_row($resource); 328: break; 329: default: 330: die('sql_fetch_row'); 331: } 332:} 333: 334:/** 335: * Returns number of rows for resultset 336: */ 337:function sql_num_rows(&$resource){ 338: global $activedb, $SQL_TYPE; 339: switch ($SQL_TYPE) { 340: case _MYSQL40: 341: return @mysql_num_rows($resource); 342: break; 343: case _MYSQL41: 344: return @mysqli_num_rows($resource); 345: break; 346: case _SQLITE: 347: return @sqlite_num_rows($resource); 348: break; 349: case _PGSQL: 350: return @pg_num_rows($resource); 351: break; 352: default: 353: die('sql_num_rows'); 354: } 355:} 356: 357:/** 358: * Frees from memory resultset 359: */ 360:function sql_free_result(&$resource){ 361: global $activedb, $SQL_TYPE; 362: switch ($SQL_TYPE) { 363: case _MYSQL40: 364: @mysql_free_result($resource); 365: unset($resource); 366: break; 367: case _MYSQL41: 368: @mysqli_free_result($resource); 369: unset($resource); 370: break; 371: case _SQLITE: 372: unset($resource); 373: break; 374: case _PGSQL: 375: @pg_free_result($resource); 376: unset($resource); 377: break; 378: default: 379: die('sql_free_result'); 380: } 381:} 382: 383:/** 384: * Returns autoincrement id of last INSERT INTO statement 385: */ 386:function sql_insert_id(){ 387: global $activedb, $SQL_TYPE; 388: switch ($SQL_TYPE) { 389: case _MYSQL40: 390: return @mysql_insert_id(); 391: break; 392: case _MYSQL41: 393: return @mysqli_insert_id($activedb); 394: break; 395: case _SQLITE: 396: return @sqlite_last_insert_rowid($activedb); 397: break; 398: case _PGSQL: 399: global $_pg; 400: return @pg_last_oid($_pg); 401: break; 402: default: 403: die('sql_insert_id'); 404: } 405:} 406: 407:/** 408: * Returns number of fields in a resultset 409: */ 410:function sql_num_fields(&$result){ 411: global $activedb, $SQL_TYPE; 412: switch ($SQL_TYPE) { 413: case _MYSQL40: 414: return @mysql_num_fields($result); 415: break; 416: case _MYSQL41: 417: return @mysqli_num_fields($result); 418: break; 419: case _SQLITE: 420: return @sqlite_num_fields($result); 421: break; 422: case _PGSQL: 423: return @pg_num_fields($result); 424: break; 425: default: 426: die('sql_num_fields'); 427: } 428:} 429: 430:/** 431: * Returns number of rows affected by query 432: */ 433:function sql_affected_rows(){ 434: global $activedb, $SQL_TYPE; 435: switch ($SQL_TYPE) { 436: case _MYSQL40: 437: return @mysql_affected_rows($activedb); 438: break; 439: case _MYSQL41: 440: return @mysqli_affected_rows($activedb); 441: break; 442: case _SQLITE: 443: return @sqlite_changes($activedb); 444: break; 445: case _PGSQL: 446: global $_pg; 447: return @pg_affected_rows($_pg); 448: break; 449: default: 450: die('sql_affected_rows'); 451: } 452:} 453: 454:/** 455: * Returns field attributes 456: */ 457:function sql_fetch_field(&$resource){ 458: global $activedb, $SQL_TYPE; 459: switch ($SQL_TYPE) { 460: case _MYSQL40: 461: return @mysql_fetch_field($resource); 462: break; 463: case _MYSQL41: 464: return @mysqli_fetch_field($resource); 465: break; 466: case _SQLITE: 467: return array(); 468: break; 469: case _PGSQL: 470: return array(); 471: break; 472: default: 473: die('sql_fetch_field'); 474: } 475:} 476: 477:/** 478: * Returns escaped string for query 479: */ 480:function sql_escape($text){ 481: global $SQL_TYPE, $activedb; 482: switch ($SQL_TYPE) { 483: case _MYSQL40: 484: if (is_callable('mysql_real_escape_string')) 485: return mysql_real_escape_string($text,$activedb); 486: else 487: return addslashes($text); 488: break; 489: case _MYSQL41: 490: if (is_callable('mysqli_real_escape_string')) 491: return mysqli_real_escape_string($activedb,$text); 492: else 493: return addslashes($text); 494: break; 495: case _SQLITE: 496: return sqlite_escape_string($text); 497: break; 498: case _PGSQL: 499: return pg_escape_string($text); 500: break; 501: default: 502: die('sql_escape'); 503: } 504:} 505: 506:/** 507: * Unescapes string 508: */ 509:function sql_unescape($text){ 510: global $SQL_TYPE; 511: switch ($SQL_TYPE) { 512: case _MYSQL40: 513: return stripslashes($text); 514: break; 515: case _MYSQL41: 516: return stripslashes($text); 517: break; 518: case _SQLITE: 519: return $text; 520: break; 521: case _PGSQL: 522: return $text; 523: break; 524: default: 525: die('sql_unescape'); 526: } 527:} 528: 529:?>