PDA

Visualizza versione completa : PHP + MySQL: aliases e ORDER BY


quipo.it
09-01-2002, 14.43.26
Avevo sviluppato un'applicazione per statistiche in PHP 4.06 + MySQL 3.23.39,
con una query abbastanza lunga. Per maggior chiarezza, questa è la tabella:

------------------------------
CREATE TABLE movements (
ID int(10) unsigned NOT NULL auto_increment,
item_ID char(5) NOT NULL DEFAULT '0' ,
quantity int(10) unsigned NOT NULL DEFAULT '0' ,
date date NOT NULL DEFAULT '0000-00-00' ,
PRIMARY KEY (ID),
KEY ID_2 (ID),
UNIQUE ID (ID)
);
------------------------------

e questa è la query:

------------------------------
$SQL = "SELECT item_ID,"
."SUM(quantity) AS totale,"
."SUM(IF(date BETWEEN '$year_start-$month_start-01' AND '$year_end-$month_end-31',quantity,0)) AS media_tot_mesi,"
."SUM(IF(date BETWEEN '$year-01-01' AND '$year-01-31',quantity,0)) AS tot_gen,"
."SUM(IF(date BETWEEN '$year-02-01' AND '$year-02-31',quantity,0)) AS tot_feb,"
."SUM(IF(date BETWEEN '$year-03-01' AND '$year-03-31',quantity,0)) AS tot_mar,"
."SUM(IF(date BETWEEN '$year-04-01' AND '$year-04-31',quantity,0)) AS tot_apr,"
."SUM(IF(date BETWEEN '$year-05-01' AND '$year-05-31',quantity,0)) AS tot_mag,"
."SUM(IF(date BETWEEN '$year-06-01' AND '$year-06-31',quantity,0)) AS tot_giu,"
."SUM(IF(date BETWEEN '$year-07-01' AND '$year-07-31',quantity,0)) AS tot_lug,"
."SUM(IF(date BETWEEN '$year-08-01' AND '$year-08-31',quantity,0)) AS tot_ago,"
."SUM(IF(date BETWEEN '$year-09-01' AND '$year-09-31',quantity,0)) AS tot_set,"
."SUM(IF(date BETWEEN '$year-10-01' AND '$year-10-31',quantity,0)) AS tot_ott,"
."SUM(IF(date BETWEEN '$year-11-01' AND '$year-11-31',quantity,0)) AS tot_nov,"
."SUM(IF(date BETWEEN '$year-12-01' AND '$year-12-31',quantity,0)) AS tot_dic "
."from movements GROUP BY item_ID ORDER BY $order";
------------------------------

In pratica, visualizza il totale dei movimenti annuali,
il totale su un certo periodo e il totale mese per mese.

Avevo consentito all'utente l'ordinamento su uno qualunque di
questi campi, attraverso il settaggio della variabile $order
(passata via GET), e tutto funzionava a dovere.

Ora però ho aggiornato in locale (sulla MIA macchina, non
in quella del cliente...) PHP alla vers. 4.1.1 e MySQL
alla vers 3.23.46, e se passo un qualunque valore via GET
alla variabile $order, la pagina contiene solo più i totali annuali,
ma compaiono degli '0' in TUTTI gli altri campi (totale mensile e sul periodo).

In php.ini la variabile "register_globals" è settata su "On",
ovvero nel "vecchio stile". Ho provato anche a metterla su "Off"
e a prendere il parametro passato via GET con $_REQUEST["order"]
o con $_GET["order"], ma funge allo stesso modo.

Any idea?

EcHo2K
11-01-2002, 17.14.44
no...non ne ho idea...se fai la query direttamente da mysql funziona? per capire se il probelma sta nell'uno o nell'altro...

la query e' effettivamente corretta?

altro non saprei che dire...

quipo.it
11-01-2002, 18.43.26
Sì la query è corretta, tant'è che funziona a dovere.
L'unico problema è dato dall'ordinamento "dinamico":
ovvero, se io setto "a mano, nel codice" la dicitura ORDER BY tot_gen (ad esempio), tutto funge, ma se gliela passo via post allora fa i casini di cui sopra.
Questo però SOLO su PHP4.1.1 + MySQL 3.23.46, non su PHP4.0.6 e MySQL 3.23.39, dove tale problema non si presenta.
Proprio per questo motivo non posso fare la query direttamente in MySQL, perché lì devo specificare direttamente il campo secondo cui fare l'ordinamento (e il problema nasce quando si passa il campo come variabile), quindi il prob non sussisterebbe.
Sono quindi più propenso ad attribuire la colpa a PHP, ma come si rimedia?

EcHo2K
18-01-2002, 16.03.59
utilizzando una versione che non ha questo bug...probabilmente e' un difettuccio di php 4.1.1, prova asegnalare il bug...

quipo.it
18-01-2002, 17.12.53
Beh, se di bug si tratta, era presente anche nella 4.1.0... faccio ancora un po' di prove e poi parto con la segnalazione...
Grazie e ciao!