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:?>