display MySQL warnings in debug mode
authorDenis Ovsienko <denis@ovsienko.info>
Thu, 18 May 2017 11:26:40 +0000 (12:26 +0100)
committerDenis Ovsienko <denis@ovsienko.info>
Thu, 18 May 2017 11:35:25 +0000 (12:35 +0100)
This optional means of debugging can provide a feedback loop when the
strict SQL mode is not enabled.

* collectMySQLWarnings(): new function to buffer the warnings
* usePreparedInsertBlade(): amend to call the above
* usePreparedDeleteBlade(): idem
* usePreparedUpdateBlade(): idem
* showMySQLWarnings(): new function to display the buffer
* index.php: call the above in the "redirect" case

ChangeLog
wwwroot/inc/database.php
wwwroot/inc/interface-lib.php
wwwroot/index.php

index c22e2f5f876da589ea68e8c6b389d0f21ac688da..974d1ad03b6a125896f4c381c4ebdf7557e60fca 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,5 @@
+0.21.0
+       update: display MySQL warnings in debug mode
 0.20.13 2017-05-12
        update: fix performance for pages with images (GH#190 by Michael A. Mikhailov)
        update: improve SNMP support for Brocade devices (GH#180 by Chris Jones)
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)
        {
index 548ad475569828546c8f42fddbf4c07cd3333250..816f95b0d323eff917fafc4be1852dd4f7ccacda 100644 (file)
@@ -1183,4 +1183,28 @@ function makeHtmlTag ($tagname, $attributes = array())
        return $ret;
 }
 
+function showMySQLWarnings()
+{
+       global $debug_mode, $rtdebug_mysql_warnings;
+       if (! isset ($debug_mode) || ! $debug_mode || ! isset ($rtdebug_mysql_warnings))
+               return;
+       foreach ($rtdebug_mysql_warnings as $each)
+       {
+               $text = $each['Code'] . ': ' . $each['Message'];
+               switch ($each['Level'])
+               {
+               case 'Warning':
+                       showWarning ($text);
+                       break;
+               case 'Note':
+                       showNotice ($text);
+                       break;
+               default:
+                       showError ($text);
+                       break;
+               }
+       }
+       $rtdebug_mysql_warnings = array();
+}
+
 ?>
index 40aaa6122b141dacacd21fa44d159dd58e33c00a..a1a3777bb5468e6d4b7e252219159089db920065 100644 (file)
@@ -254,6 +254,7 @@ try {
                        printException ($e);
                        break;
                }
+               showMySQLWarnings();
                redirectUser ($location);
                // any other error requires no special handling and will be caught outside
                break;