display MySQL warnings in debug mode
[racktables] / wwwroot / inc / database.php
index 83982f4456777e1b5a4d2f13712bce8f8ec3abd8..82e24f28556627becf02fa2c04d0e6a5654e9626 100644 (file)
@@ -3899,6 +3899,23 @@ function convertPDOException ($e)
        return new RTDatabaseError ($text);
 }
 
+// The strict SQL mode, which is the default since MySQL 5.7 and MariaDB 10.2.4,
+// generates an error (and in this case a PDO exception) when a column value is
+// invalid or missing. When the strict SQL mode is not enabled (for whatever
+// reason), the invalid or missing values (as well as other anomalies) end up in
+// the warnings buffer and remain out of sight by default. This function saves
+// the contents of the buffer such that it can be displayed later.
+function collectMySQLWarnings()
+{
+       global $dbxlink, $debug_mode, $rtdebug_mysql_warnings;
+       if (! isset ($debug_mode) || ! $debug_mode)
+               return;
+       if (! isset ($rtdebug_mysql_warnings))
+               $rtdebug_mysql_warnings = array();
+       $result = $dbxlink->query ('SHOW WARNINGS');
+       $rtdebug_mysql_warnings = array_merge ($rtdebug_mysql_warnings, $result->fetchAll (PDO::FETCH_ASSOC));
+}
+
 // This is a swiss-knife blade to insert a record into a table.
 // The first argument is table name.
 // The second argument is an array of "name" => "value" pairs.
@@ -3914,7 +3931,10 @@ function usePreparedInsertBlade ($tablename, $columns)
        {
                $prepared = $dbxlink->prepare ($query);
                $prepared->execute (array_values ($columns));
-               return $prepared->rowCount();
+               $ret = $prepared->rowCount();
+               unset ($prepared);
+               collectMySQLWarnings();
+               return $ret;
        }
        catch (PDOException $e)
        {
@@ -3971,7 +3991,10 @@ function usePreparedDeleteBlade ($tablename, $columns = array(), $conjunction =
        {
                $prepared = $dbxlink->prepare ($query);
                $prepared->execute ($where_values);
-               return $prepared->rowCount();
+               $ret = $prepared->rowCount();
+               unset ($prepared);
+               collectMySQLWarnings();
+               return $ret;
        }
        catch (PDOException $e)
        {
@@ -4008,7 +4031,10 @@ function usePreparedUpdateBlade ($tablename, $set_columns = array(), $where_colu
        {
                $prepared = $dbxlink->prepare ($query);
                $prepared->execute (array_merge (array_values ($set_columns), $where_values));
-               return $prepared->rowCount();
+               $ret = $prepared->rowCount();
+               unset ($prepared);
+               collectMySQLWarnings();
+               return $ret;
        }
        catch (PDOException $e)
        {