From: Janusz Dobrowolski Date: Mon, 28 Oct 2013 07:08:13 +0000 (+0100) Subject: Improved db_pager query parsing (fixed error in Sales Quotation Inquiry) X-Git-Tag: v2.4.2~19^2~328 X-Git-Url: https://delta.frontaccounting.com/gitweb/?a=commitdiff_plain;h=e8ebca8f2b08eeb3bfd3da04ca946dfa8cc1fb3f;hp=fa43a9c974d05b77517a0d8e3e510ef4a088632e;p=fa-stable.git Improved db_pager query parsing (fixed error in Sales Quotation Inquiry) --- diff --git a/includes/db_pager.inc b/includes/db_pager.inc index 48359f3c..6ad1755a 100644 --- a/includes/db_pager.inc +++ b/includes/db_pager.inc @@ -57,7 +57,12 @@ class db_pager { var $key; // key field name // db_pager constructor - // accepts $sql like 'SELECT ...[FROM ...][WHERE ...][GROUP ...][ORDER ...]' + // accepts $sql query either as: + // a. string in form 'SELECT field_list FROM table_joins [WHERE conditions [GROUP group_list [ORDER order_list]]]' + // - if WHERE keyword is used in table_joins, WHERE conditions is obligatory + // b. associative array using select, where, group and order keys ex : + // array('select' => 'SUM(quantity)', 'from' => TB_PREF."stock_moves", 'group' => 'location') + // // $name is base name for pager controls function db_pager($sql, $name, $table = null, $page_len=0) { @@ -68,12 +73,8 @@ class db_pager { $this->set_sql($sql); } // - // Parse base sql select query. - // or use an associative array. - // Usefull is the query can't be split correctly (using subquery for example). - // The associative array shouldn't contain the keyword itself. - // ex : - // array('select' => 'SUM(quantity)', 'from' => TB_PREF."stock_moves", 'group' => 'location') + // Parse base sql select query or use an associative array. + // function set_sql($sql) { if ($sql != $this->sql) { @@ -88,27 +89,32 @@ class db_pager { } else { // parse the query - $parts = preg_split('/\sORDER\s*BY\s/si', $sql, 2); - if(count($parts) == 2) { - $sql = $parts[0]; - $this->order = $parts[1]; - } - $parts = preg_split('/\sGROUP\s*BY\s/si', $sql, 2); - if(count($parts) == 2) { - $sql = $parts[0]; - $this->group = $parts[1]; + $parts = preg_split('/\sFROM\s/si', $sql, 2); + if (count($parts) == 2) { + $this->select = $parts[0]; + $sql = $parts[1]; + } else { + if ($go_debug) + display_error("Invalid sql input for db_pager"); } - $parts = preg_split('/\sWHERE\s/si', $sql, 2); - if(count($parts) == 2) { - $sql = $parts[0]; - $this->where = $parts[1]; - } - $parts = preg_split('/\sFROM\s/si', $sql, 2); + + $parts = preg_split('/\sWHERE(?!.*WHERE.*)\s/si', $sql, 2); // last occurence if(count($parts) == 2) { - $sql = $parts[0]; - $this->from = $parts[1]; + $this->from = $parts[0]; + $sql = $parts[1]; + + $parts = preg_split('/\sORDER\s*BY\s/si', $sql, 2); + if(count($parts) == 2) { + $sql = $parts[0]; + $this->order = $parts[1]; + } + $parts = preg_split('/\sGROUP\s*BY\s/si', $sql, 2); + if(count($parts) == 2) { + $sql = $parts[0]; + $this->group = $parts[1]; + } + $this->where = $sql; } - $this->select = $sql; } } }