diff --git a/ecrire/public/composer.php b/ecrire/public/composer.php index 2552d904e6777790f997ad4455ea350acc0f7deb..824e11a206c5fba77a855608215856512f80edcf 100644 --- a/ecrire/public/composer.php +++ b/ecrire/public/composer.php @@ -675,6 +675,12 @@ function trouver_sous_requetes($where) { return [$where_simples, $where_sous]; } +/** + * @see preparer_calculer_select() + */ +function calculer_select(...$args) { + return executer_calculer_select(preparer_calculer_select(...$args)); +} /** * Calcule une requête et l’exécute @@ -697,7 +703,7 @@ function trouver_sous_requetes($where) { * @param bool|array|string $requeter * @return resource */ -function calculer_select( +function preparer_calculer_select( $select = [], $from = [], $from_type = [], @@ -970,23 +976,55 @@ function calculer_select( $GLOBALS['debug']['debug'] = true; } } - $GLOBALS['debug']['aucasou'] = [$table, $id, $serveur, $requeter]; + + $requete = [ + 'select' => $select, + 'from' => $from, + 'where' => $where, + 'groupby' => $groupby, + 'orderby' => array_filter($orderby), + 'limit' => $limit, + 'having' => $having, + 'serveur' => $serveur, + 'requeter' => $requeter, + 'debug' => [$table, $id, $serveur, $requeter] + ]; + return $requete; +} + +function executer_calculer_select($requete) { + $GLOBALS['debug']['aucasou'] = $requete['debug']; $r = sql_select( - $select, - $from, - $where, - $groupby, - array_filter($orderby), - $limit, - $having, - $serveur, - $requeter + $requete['select'], + $requete['from'], + $requete['where'], + $requete['groupby'], + $requete['orderby'], + $requete['limit'], + $requete['having'], + $requete['serveur'], + $requete['requeter'] ); unset($GLOBALS['debug']['aucasou']); return $r; } +function compter_calculer_select($requete) { + $GLOBALS['debug']['aucasou'] = $requete['debug']; + $count = sql_countsel( + $requete['from'], + $requete['where'], + $requete['groupby'], + $requete['having'], + $requete['serveur'], + $requete['requeter'] + ); + unset($GLOBALS['debug']['aucasou']); + + return $count; +} + /** * Analogue a calculer_mysql_expression et autre (a unifier ?) * diff --git a/ecrire/src/Compilateur/Iterateur/Sql.php b/ecrire/src/Compilateur/Iterateur/Sql.php index 25223b3b6c5d6ab783ab6dc81f0946c16f111d65..d877e6ccf6fa1fc3688a0426916119474061772f 100644 --- a/ecrire/src/Compilateur/Iterateur/Sql.php +++ b/ecrire/src/Compilateur/Iterateur/Sql.php @@ -181,7 +181,8 @@ class Sql extends AbstractIterateur implements Iterator $count_total_from_query = true; } } - $this->sqlresult = calculer_select( + + $requete = preparer_calculer_select( $v['select'], $v['from'], $v['type'], @@ -197,28 +198,11 @@ class Sql extends AbstractIterateur implements Iterator $this->info ); + $this->sqlresult = executer_calculer_select($requete); $this->err = !$this->sqlresult; + if ($count_total_from_query && !$this->err) { - $query = calculer_select( - $v['select'], - $v['from'], - $v['type'], - $v['where'], - $v['join'], - $v['groupby'], - $v['orderby'], - '', - $v['having'], - $v['table'], - $v['id'], - $v['connect'], - false - ); - $query_parts = explode('FROM', $query, 2); - $query = 'SELECT count(*) FROM ' . end($query_parts); - $res = sql_query($query, $v['connect']); - $row = sql_fetch($res); - $this->total = reset($row); + $this->total = compter_calculer_select($requete); } $this->firstseek = false; $this->pos = -1;