Fixed bug #17478: Wrong behaviour of "$TYPO3_CONF_VARS['SYS']['sqlDebug'] = TRUE...
[Packages/TYPO3.CMS.git] / t3lib / class.t3lib_db.php
index 3a1b1a7..5f8de23 100644 (file)
@@ -1,29 +1,29 @@
 <?php
 /***************************************************************
-*  Copyright notice
-*
-*  (c) 2004-2010 Kasper Skaarhoj (kasperYYYY@typo3.com)
-*  All rights reserved
-*
-*  This script is part of the TYPO3 project. The TYPO3 project is
-*  free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License as published by
-*  the Free Software Foundation; either version 2 of the License, or
-*  (at your option) any later version.
-*
-*  The GNU General Public License can be found at
-*  http://www.gnu.org/copyleft/gpl.html.
-*  A copy is found in the textfile GPL.txt and important notices to the license
-*  from the author is found in LICENSE.txt distributed with these scripts.
-*
-*
-*  This script is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*  GNU General Public License for more details.
-*
-*  This copyright notice MUST APPEAR in all copies of the script!
-***************************************************************/
+ *  Copyright notice
+ *
+ *  (c) 2004-2011 Kasper Skårhøj (kasperYYYY@typo3.com)
+ *  All rights reserved
+ *
+ *  This script is part of the TYPO3 project. The TYPO3 project is
+ *  free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  The GNU General Public License can be found at
+ *  http://www.gnu.org/copyleft/gpl.html.
+ *  A copy is found in the textfile GPL.txt and important notices to the license
+ *  from the author is found in LICENSE.txt distributed with these scripts.
+ *
+ *
+ *  This script is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  This copyright notice MUST APPEAR in all copies of the script!
+ ***************************************************************/
 /**
  * Contains the class "t3lib_db" containing functions for building SQL queries
  * and mysql wrappers, thus providing a foundational API to all database
@@ -32,7 +32,7 @@
  *
  * $Id$
  *
- * @author     Kasper Skaarhoj <kasperYYYY@typo3.com>
+ * @author     Kasper Skårhøj <kasperYYYY@typo3.com>
  */
 /**
  * [CLASS/FUNCTION INDEX of SCRIPT]
  *
  *  138: class t3lib_DB
  *
- *              SECTION: Query execution
- *  175:     function exec_INSERTquery($table,$fields_values,$no_quote_fields=FALSE)
- *  192:     function exec_UPDATEquery($table,$where,$fields_values,$no_quote_fields=FALSE)
- *  206:     function exec_DELETEquery($table,$where)
- *  225:     function exec_SELECTquery($select_fields,$from_table,$where_clause,$groupBy='',$orderBy='',$limit='')
- *  250:     function exec_SELECT_mm_query($select,$local_table,$mm_table,$foreign_table,$whereClause='',$groupBy='',$orderBy='',$limit='')
- *  278:     function exec_SELECT_queryArray($queryParts)
- *  301:     function exec_SELECTgetRows($select_fields,$from_table,$where_clause,$groupBy='',$orderBy='',$limit='',$uidIndexField='')
+ *                       SECTION: Query execution
+ *  175:        function exec_INSERTquery($table,$fields_values,$no_quote_fields=FALSE)
+ *  192:        function exec_UPDATEquery($table,$where,$fields_values,$no_quote_fields=FALSE)
+ *  206:        function exec_DELETEquery($table,$where)
+ *  225:        function exec_SELECTquery($select_fields,$from_table,$where_clause,$groupBy='',$orderBy='',$limit='')
+ *  250:        function exec_SELECT_mm_query($select,$local_table,$mm_table,$foreign_table,$whereClause='',$groupBy='',$orderBy='',$limit='')
+ *  278:        function exec_SELECT_queryArray($queryParts)
+ *  301:        function exec_SELECTgetRows($select_fields,$from_table,$where_clause,$groupBy='',$orderBy='',$limit='',$uidIndexField='')
  *
- *              SECTION: Query building
- *  346:     function INSERTquery($table,$fields_values,$no_quote_fields=FALSE)
- *  381:     function UPDATEquery($table,$where,$fields_values,$no_quote_fields=FALSE)
- *  422:     function DELETEquery($table,$where)
- *  451:     function SELECTquery($select_fields,$from_table,$where_clause,$groupBy='',$orderBy='',$limit='')
- *  492:     function listQuery($field, $value, $table)
- *  506:     function searchQuery($searchWords,$fields,$table)
+ *                       SECTION: Query building
+ *  346:        function INSERTquery($table,$fields_values,$no_quote_fields=FALSE)
+ *  381:        function UPDATEquery($table,$where,$fields_values,$no_quote_fields=FALSE)
+ *  422:        function DELETEquery($table,$where)
+ *  451:        function SELECTquery($select_fields,$from_table,$where_clause,$groupBy='',$orderBy='',$limit='')
+ *  492:        function listQuery($field, $value, $table)
+ *  506:        function searchQuery($searchWords,$fields,$table)
  *
- *              SECTION: Various helper functions
- *  552:     function fullQuoteStr($str, $table)
- *  569:     function fullQuoteArray($arr, $table, $noQuote=FALSE)
- *  596:     function quoteStr($str, $table)
- *  612:     function escapeStrForLike($str, $table)
- *  625:     function cleanIntArray($arr)
- *  641:     function cleanIntList($list)
- *  655:     function stripOrderBy($str)
- *  669:     function stripGroupBy($str)
- *  681:     function splitGroupOrderLimit($str)
+ *                       SECTION: Various helper functions
+ *  552:        function fullQuoteStr($str, $table)
+ *  569:        function fullQuoteArray($arr, $table, $noQuote=FALSE)
+ *  596:        function quoteStr($str, $table)
+ *  612:        function escapeStrForLike($str, $table)
+ *  625:        function cleanIntArray($arr)
+ *  641:        function cleanIntList($list)
+ *  655:        function stripOrderBy($str)
+ *  669:        function stripGroupBy($str)
+ *  681:        function splitGroupOrderLimit($str)
  *
- *              SECTION: MySQL wrapper functions
- *  749:     function sql($db,$query)
- *  763:     function sql_query($query)
- *  776:     function sql_error()
- *  788:     function sql_num_rows($res)
- *  800:     function sql_fetch_assoc($res)
- *  813:     function sql_fetch_row($res)
- *  825:     function sql_free_result($res)
- *  836:     function sql_insert_id()
- *  847:     function sql_affected_rows()
- *  860:     function sql_data_seek($res,$seek)
- *  873:     function sql_field_type($res,$pointer)
- *  887:     function sql_pconnect($TYPO3_db_host, $TYPO3_db_username, $TYPO3_db_password)
- *  915:     function sql_select_db($TYPO3_db)
+ *                       SECTION: MySQL wrapper functions
+ *  749:        function sql($db,$query)
+ *  763:        function sql_query($query)
+ *  776:        function sql_error()
+ *  788:        function sql_num_rows($res)
+ *  800:        function sql_fetch_assoc($res)
+ *  813:        function sql_fetch_row($res)
+ *  825:        function sql_free_result($res)
+ *  836:        function sql_insert_id()
+ *  847:        function sql_affected_rows()
+ *  860:        function sql_data_seek($res,$seek)
+ *  873:        function sql_field_type($res,$pointer)
+ *  887:        function sql_pconnect($TYPO3_db_host, $TYPO3_db_username, $TYPO3_db_password)
+ *  915:        function sql_select_db($TYPO3_db)
  *
- *              SECTION: SQL admin functions
- *  947:     function admin_get_dbs()
- *  965:     function admin_get_tables()
- *  984:     function admin_get_fields($tableName)
- * 1002:     function admin_get_keys($tableName)
- * 1020:     function admin_query($query)
+ *                       SECTION: SQL admin functions
+ *  947:        function admin_get_dbs()
+ *  965:        function admin_get_tables()
+ *  984:        function admin_get_fields($tableName)
+ * 1002:        function admin_get_keys($tableName)
+ * 1020:        function admin_query($query)
  *
- *              SECTION: Connecting service
- * 1048:     function connectDB()
+ *                       SECTION: Connecting service
+ * 1048:        function connectDB()
  *
- *              SECTION: Debugging
- * 1086:     function debug($func)
+ *                       SECTION: Debugging
+ * 1086:        function debug($func)
  *
  * TOTAL FUNCTIONS: 42
  * (This index is automatically created/updated by the extension "extdeveval")
  */
 
 
-
-
-
-
-
-
-
-
-
-
 /**
  * TYPO3 "database wrapper" class (new in 3.6.0)
  * This class contains
  *
  * USE:
  * In all TYPO3 scripts the global variable $TYPO3_DB is an instance of this class. Use that.
- * Eg.                 $GLOBALS['TYPO3_DB']->sql_fetch_assoc()
+ * Eg.          $GLOBALS['TYPO3_DB']->sql_fetch_assoc()
  *
- * @author     Kasper Skaarhoj <kasperYYYY@typo3.com>
+ * @author     Kasper Skårhøj <kasperYYYY@typo3.com>
  * @package TYPO3
  * @subpackage t3lib
  */
@@ -141,10 +131,10 @@ class t3lib_DB {
 
 
                // Debug:
-       var $debugOutput = FALSE;               // Set "TRUE" if you want database errors outputted.
-       var $debug_lastBuiltQuery = '';         // Internally: Set to last built query (not necessarily executed...)
-       var $store_lastBuiltQuery = FALSE;      // Set "TRUE" if you want the last built query to be stored in $debug_lastBuiltQuery independent of $this->debugOutput
-       var $explainOutput = 0;                 // Set this to 1 to get queries explained (devIPmask must match). Set the value to 2 to the same but disregarding the devIPmask. There is an alternative option to enable explain output in the admin panel under "TypoScript", which will produce much nicer output, but only works in FE.
+       var $debugOutput = FALSE; // Set "TRUE" or "1" if you want database errors outputted. Set to "2" if you also want successful database actions outputted.
+       var $debug_lastBuiltQuery = ''; // Internally: Set to last built query (not necessarily executed...)
+       var $store_lastBuiltQuery = FALSE; // Set "TRUE" if you want the last built query to be stored in $debug_lastBuiltQuery independent of $this->debugOutput
+       var $explainOutput = 0; // Set this to 1 to get queries explained (devIPmask must match). Set the value to 2 to the same but disregarding the devIPmask. There is an alternative option to enable explain output in the admin panel under "TypoScript", which will produce much nicer output, but only works in FE.
 
                // Default link identifier:
        var $link = FALSE;
@@ -153,8 +143,6 @@ class t3lib_DB {
        var $default_charset = 'utf8';
 
 
-
-
        /************************************
         *
         * Query execution
@@ -245,7 +233,7 @@ class t3lib_DB {
         *
         * @param       string          List of fields to select from the table. This is what comes right after "SELECT ...". Required value.
         * @param       string          Table(s) from which to select. This is what comes right after "FROM ...". Required value.
-        * @param       string          Optional additional WHERE clauses put in the end of the query. NOTICE: You must escape values in this argument with $this->fullQuoteStr() yourself! DO NOT PUT IN GROUP BY, ORDER BY or LIMIT!
+        * @param       string          additional WHERE clauses put in the end of the query. NOTICE: You must escape values in this argument with $this->fullQuoteStr() yourself! DO NOT PUT IN GROUP BY, ORDER BY or LIMIT!
         * @param       string          Optional GROUP BY field(s), if none, supply blank string.
         * @param       string          Optional ORDER BY field(s), if none, supply blank string.
         * @param       string          Optional LIMIT value ([begin,]max), if none, supply blank string.
@@ -300,14 +288,14 @@ class t3lib_DB {
                }
 
                return $this->exec_SELECTquery(
-                                       $select,
-                                       $tables,
-                                               // whereClauseMightContainGroupOrderBy
-                                       $mmWhere . ' ' . $whereClause,
-                                       $groupBy,
-                                       $orderBy,
-                                       $limit
-                               );
+                       $select,
+                       $tables,
+                               // whereClauseMightContainGroupOrderBy
+                               $mmWhere . ' ' . $whereClause,
+                       $groupBy,
+                       $orderBy,
+                       $limit
+               );
        }
 
        /**
@@ -356,7 +344,9 @@ class t3lib_DB {
                                        $output[$tempRow[$uidIndexField]] = $tempRow;
                                }
                        } else {
-                               while ($output[] = $this->sql_fetch_assoc($res));
+                               while ($output[] = $this->sql_fetch_assoc($res)) {
+                                       ;
+                               }
                                array_pop($output);
                        }
                        $this->sql_free_result($res);
@@ -365,6 +355,36 @@ class t3lib_DB {
        }
 
        /**
+        * Creates and executes a SELECT SQL-statement AND gets a result set and returns an array with a single record in.
+        * LIMIT is automatically set to 1 and can not be overridden.
+        *
+        * @param string $select_fields: List of fields to select from the table.
+        * @param string $from_table: Table(s) from which to select.
+        * @param string $where_clause: Optional additional WHERE clauses put in the end of the query. NOTICE: You must escape values in this argument with $this->fullQuoteStr() yourself!
+        * @param string $groupBy: Optional GROUP BY field(s), if none, supply blank string.
+        * @param string $orderBy: Optional ORDER BY field(s), if none, supply blank string.
+        * @param boolean $numIndex: If set, the result will be fetched with sql_fetch_row, otherwise sql_fetch_assoc will be used.
+        * @return array Single row or NULL if it fails.
+        */
+       public function exec_SELECTgetSingleRow($select_fields, $from_table, $where_clause, $groupBy = '', $orderBy = '', $numIndex = FALSE) {
+               $res = $this->exec_SELECTquery($select_fields, $from_table, $where_clause, $groupBy, $orderBy, '1');
+               if ($this->debugOutput) {
+                       $this->debug('exec_SELECTquery');
+               }
+
+               $output = NULL;
+               if ($res) {
+                       if ($numIndex) {
+                               $output = $this->sql_fetch_row($res);
+                       } else {
+                               $output = $this->sql_fetch_assoc($res);
+                       }
+                       $this->sql_free_result($res);
+               }
+               return $output;
+       }
+
+       /**
         * Counts the number of rows in a table.
         *
         * @param       string          $field: Name of the field to use in the COUNT() expression (e.g. '*')
@@ -373,9 +393,9 @@ class t3lib_DB {
         * @return      mixed           Number of rows counter (integer) or false if something went wrong (boolean)
         */
        public function exec_SELECTcountRows($field, $table, $where = '') {
-               $count = false;
+               $count = FALSE;
                $resultSet = $this->exec_SELECTquery('COUNT(' . $field . ')', $table, $where);
-               if ($resultSet !== false) {
+               if ($resultSet !== FALSE) {
                        list($count) = $this->sql_fetch_row($resultSet);
                        $this->sql_free_result($resultSet);
                }
@@ -397,15 +417,6 @@ class t3lib_DB {
        }
 
 
-
-
-
-
-
-
-
-
-
        /**************************************
         *
         * Query building
@@ -432,8 +443,8 @@ class t3lib_DB {
 
                                // Build query:
                        $query = 'INSERT INTO ' . $table .
-                               '(' . implode(',', array_keys($fields_values)) . ') VALUES ' .
-                               '(' . implode(',', $fields_values) . ')';
+                                       ' (' . implode(',', array_keys($fields_values)) . ') VALUES ' .
+                                       '(' . implode(',', $fields_values) . ')';
 
                                // Return query:
                        if ($this->debugOutput || $this->store_lastBuiltQuery) {
@@ -458,7 +469,7 @@ class t3lib_DB {
                if (count($rows)) {
                                // Build query:
                        $query = 'INSERT INTO ' . $table .
-                               ' (' . implode(', ', $fields) . ') VALUES ';
+                                       ' (' . implode(', ', $fields) . ') VALUES ';
 
                        $rowSQL = array();
                        foreach ($rows as $row) {
@@ -499,13 +510,13 @@ class t3lib_DB {
                                $nArr = $this->fullQuoteArray($fields_values, $table, $no_quote_fields);
 
                                foreach ($nArr as $k => $v) {
-                                       $fields[] = $k.'='.$v;
+                                       $fields[] = $k . '=' . $v;
                                }
                        }
 
                                // Build query:
                        $query = 'UPDATE ' . $table . ' SET ' . implode(',', $fields) .
-                               (strlen($where) > 0 ? ' WHERE ' . $where : '');
+                                       (strlen($where) > 0 ? ' WHERE ' . $where : '');
 
                        if ($this->debugOutput || $this->store_lastBuiltQuery) {
                                $this->debug_lastBuiltQuery = $query;
@@ -532,7 +543,7 @@ class t3lib_DB {
 
                                // Table and fieldnames should be "SQL-injection-safe" when supplied to this function
                        $query = 'DELETE FROM ' . $table .
-                               (strlen($where) > 0 ? ' WHERE ' . $where : '');
+                                       (strlen($where) > 0 ? ' WHERE ' . $where : '');
 
                        if ($this->debugOutput || $this->store_lastBuiltQuery) {
                                $this->debug_lastBuiltQuery = $query;
@@ -563,7 +574,7 @@ class t3lib_DB {
                        // Table and fieldnames should be "SQL-injection-safe" when supplied to this function
                        // Build basic query:
                $query = 'SELECT ' . $select_fields . ' FROM ' . $from_table .
-                       (strlen($where_clause) > 0 ? ' WHERE ' . $where_clause : '');
+                               (strlen($where_clause) > 0 ? ' WHERE ' . $where_clause : '');
 
                        // Group by:
                $query .= (strlen($groupBy) > 0 ? ' GROUP BY ' . $groupBy : '');
@@ -594,7 +605,7 @@ class t3lib_DB {
                        // Table and fieldnames should be "SQL-injection-safe" when supplied to this function
                        // Build basic query:
                $query = 'SELECT ' . $select_fields . ' FROM ' . $from_table .
-                       (strlen($where_clause) > 0 ? ' WHERE ' . $where_clause : '');
+                               (strlen($where_clause) > 0 ? ' WHERE ' . $where_clause : '');
 
                        // Return query:
                if ($this->debugOutput || $this->store_lastBuiltQuery) {
@@ -638,7 +649,7 @@ class t3lib_DB {
         * @return      string          WHERE clause for a query
         */
        public function listQuery($field, $value, $table) {
-               $value = (string)$value;
+               $value = (string) $value;
                if (strpos(',', $value) !== FALSE) {
                        throw new InvalidArgumentException('$value must not contain a comma (,) in $this->listQuery() !');
                }
@@ -658,27 +669,82 @@ class t3lib_DB {
        function searchQuery($searchWords, $fields, $table) {
                $queryParts = array();
 
-               foreach($searchWords as $sw) {
+               foreach ($searchWords as $sw) {
                        $like = ' LIKE \'%' . $this->quoteStr($sw, $table) . '%\'';
                        $queryParts[] = $table . '.' . implode($like . ' OR ' . $table . '.', $fields) . $like;
                }
                $query = '(' . implode(') AND (', $queryParts) . ')';
-               return $query ;
+               return $query;
        }
 
 
+       /**************************************
+        *
+        * Prepared Query Support
+        *
+        **************************************/
 
+       /**
+        * Creates a SELECT prepared SQL statement.
+        *
+        * @param string See exec_SELECTquery()
+        * @param string See exec_SELECTquery()
+        * @param string See exec_SELECTquery()
+        * @param string See exec_SELECTquery()
+        * @param string See exec_SELECTquery()
+        * @param string See exec_SELECTquery()
+        * @param array $input_parameters An array of values with as many elements as there are bound parameters in the SQL statement being executed. All values are treated as t3lib_db_PreparedStatement::PARAM_AUTOTYPE.
+        * @return t3lib_db_PreparedStatement Prepared statement
+        */
+       public function prepare_SELECTquery($select_fields, $from_table, $where_clause, $groupBy = '', $orderBy = '', $limit = '', array $input_parameters = array()) {
+               $query = $this->SELECTquery($select_fields, $from_table, $where_clause, $groupBy, $orderBy, $limit);
+               $preparedStatement = t3lib_div::makeInstance('t3lib_db_PreparedStatement', $query, $from_table, array());
+               /* @var $preparedStatement t3lib_db_PreparedStatement */
 
+                       // Bind values to parameters
+               foreach ($input_parameters as $key => $value) {
+                       $preparedStatement->bindValue($key, $value, t3lib_db_PreparedStatement::PARAM_AUTOTYPE);
+               }
 
+                       // Return prepared statement
+               return $preparedStatement;
+       }
 
+       /**
+        * Creates a SELECT prepared SQL statement based on input query parts array
+        *
+        * @param array Query parts array
+        * @param array $input_parameters An array of values with as many elements as there are bound parameters in the SQL statement being executed. All values are treated as t3lib_db_PreparedStatement::PARAM_AUTOTYPE.
+        * @return t3lib_db_PreparedStatement Prepared statement
+        */
+       public function prepare_SELECTqueryArray(array $queryParts, array $input_parameters = array()) {
+               return $this->prepare_SELECTquery(
+                       $queryParts['SELECT'],
+                       $queryParts['FROM'],
+                       $queryParts['WHERE'],
+                       $queryParts['GROUPBY'],
+                       $queryParts['ORDERBY'],
+                       $queryParts['LIMIT'],
+                       $input_parameters
+               );
+       }
 
-
-
-
-
-
-
-
+       /**
+        * Executes a prepared query.
+        * This method may only be called by t3lib_db_PreparedStatement.
+        *
+        * @param string $query The query to execute
+        * @param array $queryComponents The components of the query to execute
+        * @return pointer MySQL result pointer / DBAL object
+        * @access private
+        */
+       public function exec_PREPAREDquery($query, array $queryComponents) {
+               $res = mysql_query($query, $this->link);
+               if ($this->debugOutput) {
+                       $this->debug('stmt_execute', $query);
+               }
+               return $res;
+       }
 
 
        /**************************************
@@ -722,7 +788,7 @@ class t3lib_DB {
                        $noQuote = FALSE;
                }
 
-               foreach($arr as $k => $v) {
+               foreach ($arr as $k => $v) {
                        if ($noQuote === FALSE || !in_array($k, $noQuote)) {
                                $arr[$k] = $this->fullQuoteStr($v, $table);
                        }
@@ -755,7 +821,7 @@ class t3lib_DB {
         * @see quoteStr()
         */
        function escapeStrForLike($str, $table) {
-               return preg_replace('/[_%]/', '\\\$0', $str);
+               return addcslashes($str, '_%');
        }
 
        /**
@@ -768,7 +834,7 @@ class t3lib_DB {
         * @see cleanIntList()
         */
        function cleanIntArray($arr) {
-               foreach($arr as $k => $v) {
+               foreach ($arr as $k => $v) {
                        $arr[$k] = intval($arr[$k]);
                }
                return $arr;
@@ -863,19 +929,6 @@ class t3lib_DB {
        }
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
        /**************************************
         *
         * MySQL wrapper functions
@@ -891,7 +944,7 @@ class t3lib_DB {
         * @param       string          Database name
         * @param       string          Query to execute
         * @return      pointer         Result pointer / DBAL object
-        * @deprecated since TYPO3 3.6, will be removed in TYPO3 4.5
+        * @deprecated since TYPO3 3.6, will be removed in TYPO3 4.6
         * @see sql_query()
         */
        function sql($db, $query) {
@@ -907,6 +960,8 @@ class t3lib_DB {
        /**
         * Executes query
         * mysql_query() wrapper function
+        * Beware: Use of this method should be avoided as it is experimentally supported by DBAL. You should consider
+        *         using exec_SELECTquery() and similar methods instead.
         * Usage count/core: 1
         *
         * @param       string          Query to execute
@@ -1072,7 +1127,7 @@ class t3lib_DB {
         * @param       string          Password to connect with.
         * @return      pointer         Returns a positive MySQL persistent link identifier on success, or FALSE on error.
         */
-       function sql_pconnect($TYPO3_db_host, $TYPO3_db_username, $TYPO3_db_password)   {
+       function sql_pconnect($TYPO3_db_host, $TYPO3_db_username, $TYPO3_db_password) {
                        // mysql_error() is tied to an established connection
                        // if the connection fails we need a different method to get the error message
                @ini_set('track_errors', 1);
@@ -1091,7 +1146,7 @@ class t3lib_DB {
                                        // We use PHP's default value for 4th parameter (new_link), which is false.
                                        // See PHP sources, for example: file php-5.2.5/ext/mysql/php_mysql.c,
                                        // function php_mysql_do_connect(), near line 525
-                               $this->link = @mysql_connect($TYPO3_db_host, $TYPO3_db_username, $TYPO3_db_password, false, MYSQL_CLIENT_COMPRESS);
+                               $this->link = @mysql_connect($TYPO3_db_host, $TYPO3_db_username, $TYPO3_db_password, FALSE, MYSQL_CLIENT_COMPRESS);
                        } else {
                                $this->link = @mysql_connect($TYPO3_db_host, $TYPO3_db_username, $TYPO3_db_password);
                        }
@@ -1110,7 +1165,7 @@ class t3lib_DB {
 
                if (!$this->link) {
                        t3lib_div::sysLog('Could not connect to MySQL server ' . $TYPO3_db_host .
-                               ' with user ' . $TYPO3_db_username . ': ' . $error_msg,
+                                       ' with user ' . $TYPO3_db_username . ': ' . $error_msg,
                                'Core',
                                4
                        );
@@ -1119,18 +1174,45 @@ class t3lib_DB {
                        foreach ($setDBinit as $v) {
                                if (mysql_query($v, $this->link) === FALSE) {
                                        t3lib_div::sysLog('Could not initialize DB connection with query "' . $v .
-                                               '": ' . mysql_error($this->link),
+                                                       '": ' . mysql_error($this->link),
                                                'Core',
                                                3
                                        );
                                }
                        }
+                       $this->setSqlMode();
                }
 
                return $this->link;
        }
 
        /**
+        * Fixes the SQL mode by unsetting NO_BACKSLASH_ESCAPES if found.
+        *
+        * @return void
+        */
+       protected function setSqlMode() {
+               $resource = $this->sql_query('SELECT @@SESSION.sql_mode;');
+               if (is_resource($resource)) {
+                       $result = $this->sql_fetch_row($resource);
+                       if (isset($result[0]) && $result[0] && strpos($result[0], 'NO_BACKSLASH_ESCAPES') !== FALSE) {
+                               $modes = array_diff(
+                                       t3lib_div::trimExplode(',', $result[0]),
+                                       array('NO_BACKSLASH_ESCAPES')
+                               );
+                               $query = 'SET sql_mode=\'' . mysql_real_escape_string(implode(',', $modes)) . '\';';
+                               $success = $this->sql_query($query);
+
+                               t3lib_div::sysLog(
+                                       'NO_BACKSLASH_ESCAPES could not be removed from SQL mode: ' . $this->sql_error(),
+                                       'Core',
+                                       3
+                               );
+                       }
+               }
+       }
+
+       /**
         * Select a MySQL database
         * mysql_select_db() wrapper function
         * Usage count/core: 8
@@ -1142,7 +1224,7 @@ class t3lib_DB {
                $ret = @mysql_select_db($TYPO3_db, $this->link);
                if (!$ret) {
                        t3lib_div::sysLog('Could not select MySQL database ' . $TYPO3_db . ': ' .
-                               mysql_error(),
+                                       mysql_error(),
                                'Core',
                                4
                        );
@@ -1151,14 +1233,6 @@ class t3lib_DB {
        }
 
 
-
-
-
-
-
-
-
-
        /**************************************
         *
         * SQL admin functions
@@ -1296,16 +1370,6 @@ class t3lib_DB {
        }
 
 
-
-
-
-
-
-
-
-
-
-
        /******************************
         *
         * Connecting service
@@ -1352,7 +1416,6 @@ class t3lib_DB {
        }
 
 
-
        /******************************
         *
         * Debugging
@@ -1366,19 +1429,19 @@ class t3lib_DB {
         * @param       string          Last query if not last built query
         * @return      void
         */
-       function debug($func, $query='') {
+       function debug($func, $query = '') {
 
                $error = $this->sql_error();
-               if ($error) {
+               if ($error || (int)$this->debugOutput === 2) {
                        debug(
                                array(
                                        'caller' => 't3lib_DB::' . $func,
                                        'ERROR' => $error,
                                        'lastBuiltQuery' => ($query ? $query : $this->debug_lastBuiltQuery),
-                                       'debug_backtrace' => t3lib_div::debug_trail(),
+                                       'debug_backtrace' => t3lib_utility_Debug::debugTrail(),
                                ),
                                $func,
-                               is_object($GLOBALS['error']) && @is_callable(array($GLOBALS['error'], 'debug')) ? '' : 'DB Error'
+                                       is_object($GLOBALS['error']) && @is_callable(array($GLOBALS['error'], 'debug')) ? '' : 'DB Error'
                        );
                }
        }
@@ -1403,9 +1466,9 @@ class t3lib_DB {
                                }
                        }
                        $msg .= ': function t3lib_DB->' . $trace[0]['function'] . ' called from file ' .
-                               substr($trace[0]['file'], strlen(PATH_site) + 2) . ' in line ' .
-                               $trace[0]['line'];
-                       t3lib_div::sysLog($msg.'. Use a devLog extension to get more details.', 'Core/t3lib_db', 3);
+                                       substr($trace[0]['file'], strlen(PATH_site) + 2) . ' in line ' .
+                                       $trace[0]['line'];
+                       t3lib_div::sysLog($msg . '. Use a devLog extension to get more details.', 'Core/t3lib_db', 3);
                                // Send to devLog if enabled
                        if (TYPO3_DLOG) {
                                $debugLogData = array(
@@ -1437,20 +1500,20 @@ class t3lib_DB {
         */
        protected function explain($query, $from_table, $row_count) {
 
-               if ((int)$this->explainOutput == 1 || ((int)$this->explainOutput == 2 &&
-                       t3lib_div::cmpIP(t3lib_div::getIndpEnv('REMOTE_ADDR'), $GLOBALS['TYPO3_CONF_VARS']['SYS']['devIPmask']))
-                       ) {
+               if ((int) $this->explainOutput == 1 || ((int) $this->explainOutput == 2 &&
+                               t3lib_div::cmpIP(t3lib_div::getIndpEnv('REMOTE_ADDR'), $GLOBALS['TYPO3_CONF_VARS']['SYS']['devIPmask']))
+               ) {
                                // raw HTML output
                        $explainMode = 1;
-               } elseif ((int)$this->explainOutput == 3 && is_object($GLOBALS['TT'])) {
+               } elseif ((int) $this->explainOutput == 3 && is_object($GLOBALS['TT'])) {
                                // embed the output into the TS admin panel
                        $explainMode = 2;
                } else {
-                       return false;
+                       return FALSE;
                }
 
                $error = $this->sql_error();
-               $trail = t3lib_div::debug_trail();
+               $trail = t3lib_utility_Debug::debugTrail();
 
                $explain_tables = array();
                $explain_output = array();
@@ -1467,7 +1530,7 @@ class t3lib_DB {
                        // Notice: Rows are skipped if there is only one result, or if no conditions are set
                if ($explain_output[0]['rows'] > 1 || t3lib_div::inList('ALL', $explain_output[0]['type'])) {
                                // only enable output if it's really useful
-                       $debug = true;
+                       $debug = TRUE;
 
                        foreach ($explain_tables as $table) {
                                $tableRes = $this->sql_query('SHOW TABLE STATUS LIKE \'' . $table . '\'');
@@ -1484,7 +1547,7 @@ class t3lib_DB {
                                $this->sql_free_result($tableRes);
                        }
                } else {
-                       $debug = false;
+                       $debug = FALSE;
                }
 
                if ($debug) {
@@ -1505,22 +1568,22 @@ class t3lib_DB {
                                }
 
                                if ($explainMode == 1) {
-                                       t3lib_div::debug($data, 'Tables: ' . $from_table, 'DB SQL EXPLAIN');
+                                       t3lib_utility_Debug::debug($data, 'Tables: ' . $from_table, 'DB SQL EXPLAIN');
                                } elseif ($explainMode == 2) {
                                        $GLOBALS['TT']->setTSselectQuery($data);
                                }
                        }
-                       return true;
+                       return TRUE;
                }
 
-               return false;
+               return FALSE;
        }
 
 }
 
 
-if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_db.php'])       {
-       include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_db.php']);
+if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_db.php'])) {
+       include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_db.php']);
 }
 
 ?>
\ No newline at end of file