[!!!][BUGFIX] Database API: Cast bool values to integer for MySQL 76/42376/2
authorMorton Jonuschat <m.jonuschat@mojocode.de>
Fri, 7 Aug 2015 10:03:24 +0000 (12:03 +0200)
committerStefan Neufeind <typo3.neufeind@speedpartner.de>
Fri, 7 Aug 2015 15:12:17 +0000 (17:12 +0200)
Convert boolean values to integers before processing them with
mysqli_real_escape_string() to ensure that FALSE values get converted to
'0' instead of '', which isn't a valid value for integer columns in
MySQL strict mode.

Resolves: #68562
Releases: master
Change-Id: Iefbdce55d872a94ad98bd2b9fa66627830725084
Reviewed-on: http://review.typo3.org/42376
Reviewed-by: Stefan Neufeind <typo3.neufeind@speedpartner.de>
Tested-by: Stefan Neufeind <typo3.neufeind@speedpartner.de>
typo3/sysext/core/Classes/Database/DatabaseConnection.php
typo3/sysext/core/Documentation/Changelog/master/Breaking-68562-BoolValuesNeedToBeCastToIntegerForMySQLStrictMode.rst [new file with mode: 0644]

index d3816e7..6333823 100644 (file)
@@ -816,6 +816,9 @@ class DatabaseConnection {
                if ($allowNull && $str === NULL) {
                        return 'NULL';
                }
+               if (is_bool($str)) {
+                       $str = (int)$str;
+               }
 
                return '\'' . $this->link->real_escape_string($str) . '\'';
        }
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-68562-BoolValuesNeedToBeCastToIntegerForMySQLStrictMode.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-68562-BoolValuesNeedToBeCastToIntegerForMySQLStrictMode.rst
new file mode 100644 (file)
index 0000000..cff2510
--- /dev/null
@@ -0,0 +1,34 @@
+===============================================================================
+Breaking: #68562 - Bool values need to be cast to integer for MySQL strict mode
+===============================================================================
+
+Description
+===========
+
+MySQL strict mode doesn't accept '' as a valid value to store in aninteger
+column if the MySQL server is running in strict mode.
+
+mysqli_real_escape() casts boolean values to string using '1' (for ``TRUE``)
+and '' (for ``FALSE``). Due to this special handling is required for boolean
+values to result in '0' and '1' for FALSE/TRUE.
+
+
+Impact
+======
+
+All TYPO3 CMS installations using MySQL as DBMS.
+
+
+Affected Installations
+======================
+
+Installations where 3rd party extension are relying on ``FALSE`` being cast to ''
+when they are storing boolean values in character type colums. In this case new
+values will get stored as '0'
+
+
+Migration
+=========
+
+Adjust the code to either store boolean values in integer type columns or
+manually cast the boolean value to string before storing it in the database.