Listing Bug delle classi 'split_page_results'

Postate qui discussioni di carattere generale riguardo a problemi di installazione e configurazione di osCommerce

Moderatore: mod Generali

Rispondi
Avatar utente
marcus
membro Master
membro Master
Messaggi: 1619
Iscritto il: 04/12/2003, 1:00
Contatta:

Listing Bug delle classi 'split_page_results'

Messaggio da marcus »

Le classi split_page_results (file split_page_results.php), sia lato shop che lato admin, contengono un bug non critico, che si rivela nel listing di prodotti, o clienti, o ordini o altro, che coinvolge istanze di tali classi, quando gli items da listare sono zero.

L'errore genera un messaggio del tipo:
"1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-10, 10' at line 1
select p.products_id, pd.products_name, p.products_price, p.products_tax_class_id, p.products_image, s.specials_new_products_price from products p, products_description pd, specials s where p.products_status = '1' and s.products_id = p.products_id and p.products_id = pd.products_id and pd.language_id = '5' and s.status = '1' order by s.specials_date_added DESC limit -10, 10"
La causa è il codice seguente (riga 61 circa):

Codice: Seleziona tutto

if ($this->current_page_number > $this->number_of_pages) {
        $this->current_page_number = $this->number_of_pages;
}

La prima volta che il listing viene istanziato $this->current_page_number viene inizializzato ad 1. Se il numero di items è zero
$this->number_of_pages vale 0, per cui $this->current_page_number viene settato a 0.

La linea di codice successiva:

Codice: Seleziona tutto

$offset = ($this->number_of_rows_per_page * ($this->current_page_number - 1));
genera allora un offset negativo nell'opzione LIMIT della query che fa 'arrabbiare' MySQL se la versione e la 4.1 o sup.

La soluzione è banale. Basta aggiungere un if di controllo, come segue:

Codice: Seleziona tutto

if ($this->number_of_pages > 0) {
     if ($this->current_page_number > $this->number_of_pages) {
        	$this->current_page_number = $this->number_of_pages;
     }
} else $this->current_page_number=1;

Un discorso del tutto analogo vale per la classe split lato admin.

Concludo segnalando anche la mancanza di un controllo di consistenza sulla variabile $max_rows, in altre parole valori nulli o negativi non vengono 'filtrati'.

Marcus
Nuovo pacchetto osCommercePRO (osCPRO) + Modulo Interfacciamento Gestionale Danea.
Visita la demo: http://oscpro.oscommercedev.com/index.php
Rispondi