Changelog for the next release.
[platal.git] / classes / xdb.php
index 4eb8ae1..6a15660 100644 (file)
@@ -22,6 +22,7 @@
 class XDB
 {
     private static $mysqli = null;
+    private static $fatalErrors = true;
 
     public static function connect()
     {
@@ -39,11 +40,16 @@ class XDB
         return true;
     }
 
+    public static function setNonFatalError()
+    {
+        self::$fatalErrors = false;
+    }
+
     public static function _prepare($args)
     {
         global $globals;
         $query    = array_map(Array('XDB', 'escape'), $args);
-        $query[0] = preg_replace('/#([a-z0-9]*)#/', $globals->dbprefix . '$1', $args[0]);
+        $query[0] = preg_replace('/#([a-z0-9]+)#/', $globals->dbprefix . '$1', $args[0]);
         $query[0] = str_replace('%',   '%%', $query[0]);
         $query[0] = str_replace('{?}', '%s', $query[0]);
         return call_user_func_array('sprintf', $query);
@@ -114,16 +120,25 @@ class XDB
             } else {
                 $text = 'Erreur lors de l\'écriture dans la base de données';
             }
-            if ($globals->debug) {
+            if (php_sapi_name() == 'cli') {
+                $text .= "\n" . XDB::_reformatQuery($query)
+                       . "\n" . XDB::$mysqli->error;
+            } else if ($globals->debug) {
                 $text .= '<pre>' . pl_entities(XDB::_reformatQuery($query)) . '</pre>';
             } else {
                 $file = fopen($globals->spoolroot . '/spool/tmp/query_errors', 'a');
-                fwrite($file, '<pre>' . pl_entities(XDB::_reformatQuery($query)) . '</pre>'
-                            . '<pre>' . XDB::$mysqli->error . '</pre>' . "\n");
+                fwrite($file, '<pre>' . date("Y-m-d G:i:s") . '</pre>'
+                            . '<pre>' . pl_entities(XDB::_reformatQuery($query)) . '</pre>'
+                            . '<pre>' . XDB::$mysqli->error . '</pre>'
+                            . "--------------------------------------------------------------------------------\n");
                 fclose($file);
             }
-            Platal::page()->kill($text);
-            exit;
+            if (self::$fatalErrors) {
+                Platal::page()->kill($text);
+                exit;
+            } else {
+                throw new Exception($text . " :\n" . $query);
+            }
         }
         return $res;
     }
@@ -156,7 +171,7 @@ class XDB
     // Produce the SQL statement representing an array
     public static function formatArray(array $array)
     {
-        return '(' . implode(', ', array_map(array('XDB', 'escape'), $array)) . ')';
+        return self::escape($array);
     }
 
     const WILDCARD_EXACT    = 0x00;
@@ -314,9 +329,12 @@ class XDB
           case 'object':
             if ($var instanceof PlFlagSet) {
                 return "'" . addslashes($var->flags()) . "'";
+            } else {
+                return "'".addslashes(serialize($var))."'";
             }
+
           case 'array':
-            return "'".addslashes(serialize($var))."'";
+            return '(' . implode(', ', array_map(array('XDB', 'escape'), $var)) . ')';
 
           default:
             die(var_export($var, true).' is not a valid for a database entry');