filtro tabella between and / or

Ivano Cardassi

Nuovo Utente
23 Nov 2013
14
0
0
Magione (Italia), Italy
Buongiorno, ho questo piccolissimo problema...
ho una datagrid con dei filtri impostati.

non riesco a far funzionare questa stringa insieme... perchè?

PHP:
$where = ("Vendita between '$Vendita%' and '$Vendita2%'") or ("Km between '$Km%' and '$Km2%'");

se però uso solo Vendita o solo km la tabella funziona perfettamente...

poi, visto che ci siamo ma non di fondamentale importanza, non mi ordina alfabeticamente la datagrid...

PHP:
$page = isset($_POST['page']) ? intval($_POST['page']) : 1;
$rows = isset($_POST['rows']) ? intval($_POST['rows']) : 50;
$sort = isset($_POST['sort']) ? strval($_POST['sort']) : 'Marca';
	$order = isset($_POST['order']) ? strval($_POST['order']) : 'asc';
$Vendita = isset($_POST['Vendita']) ? mysql_real_escape_string($_POST['Vendita']) : '';
$Vendita2 = isset($_POST['Vendita2']) ? mysql_real_escape_string($_POST['Vendita2']) : '99999';
$Km = isset($_POST['Km']) ? mysql_real_escape_string($_POST['Km']) : '';
$Km2 = isset($_POST['Km2']) ? mysql_real_escape_string($_POST['Km2']) : '999999';
	
$offset = ($page-1)*$rows;
	
$result = array();
 $sort = isset($_POST['sort']) ? strval($_POST['sort']) : 'Marca';
	$order = isset($_POST['order']) ? strval($_POST['order']) : 'asc';

 $where = ("Vendita between '$Vendita%' and '$Vendita2%'") or ("Km between '$Km%' and '$Km2%'");
  
 
$rs = mysql_query("select count(*) from usato where " . $where);
$row = mysql_fetch_row($rs);
$result["total"] = $row[0];

$rs = mysql_query("select * from usato where " . $where . " limit $offset,$rows");
	
$items = array();
while($row = mysql_fetch_object($rs)){
		array_push($items, $row);
	}
	$result["rows"] = $items;

	echo json_encode($result);

grazie
 
Ultima modifica:
L'istruzione OR che hai utilizzato è di PHP e quello che ti viene inserito nella variabile where è un booleano true, di conseguenza ti ritrovi che la tua query viene interpretata con "WHERE 1" come clausola di ricerca.

Devi correggere la stringa di modo che l'OR faccia parte delle istruzioni SQL:
PHP:
$where = "(Vendita between '{$Vendita}%' and '{$Vendita2}%') OR (Km between '{$Km}%' and '{$Km2}%')";

ps: le parentesi graffe che ho aggiunto non vengono interpretate ma sono utili per far capire a php che la variabile all'interno della stringa è quella delimitata.
 
L'istruzione OR che hai utilizzato è di PHP e quello che ti viene inserito nella variabile where è un booleano true, di conseguenza ti ritrovi che la tua query viene interpretata con "WHERE 1" come clausola di ricerca.

Devi correggere la stringa di modo che l'OR faccia parte delle istruzioni SQL:
PHP:
$where = "(Vendita between '{$Vendita}%' and '{$Vendita2}%') OR (Km between '{$Km}%' and '{$Km2}%')";

ps: le parentesi graffe che ho aggiunto non vengono interpretate ma sono utili per far capire a php che la variabile all'interno della stringa è quella delimitata.

Grazie del consiglio, ma adesso non funzionano nessuno dei filtri...
hai anche una soluzione per l'ordinamento?
grazie
 
Quei simboli jolly ( % ) sono necessari per la tua query ? Perché il mio sospetto verte su quelli.
Quanto all'ordinamento ti basta usare la clausola ORDER BY nell'istruzione sql, nel tuo codice vedo che hai già una variabile impostata per i tipi di ordinamento da associare.
 
Quei simboli jolly ( % ) sono necessari per la tua query ? Perché il mio sospetto verte su quelli.
Quanto all'ordinamento ti basta usare la clausola ORDER BY nell'istruzione sql, nel tuo codice vedo che hai già una variabile impostata per i tipi di ordinamento da associare.

no, non sono necessari, tanto i campi sono valori numerici esatti...
ho provato a modificarli, a togliere le graffe, ma non mi filtra i dati. se utilizzo solo un filtro si, 2 insieme non funzionano nessuno...

per l'ordinamento l'ho messo order by, ma se tolgo i filtri di cui parliamo, me li ordina, se invece scrivo i codici dei filtri, me li ordina solo per id e non per marca.
 
PHP:
$where = "(Vendita between '{$Vendita}' and '{$Vendita2}')";
così funziona...

PHP:
$where = "(Vendita between '{$Vendita}%' and '{$Vendita2}%') OR (Km between '{$Km}%' and '{$Km2}%')";
così no.
 
Ultima modifica:
PHP:
$where = "(Vendita between '{$Vendita}%' and '{$Vendita2}%') AND (Km between '{$Km}%' and '{$Km2}%')";

ho modificato or in and e ora funziona bene, come volevo io...
però è strano, con and dovrebbe unire le funzioni cioè se vendita=x e km=x allora mostra,
invece funziona al contrario, o vendita o km, insieme non funzionano, ma va bene così...

ora devo risolvere l'ordinamento, che non riesco a capire come mai non lo fa....
 
no, non sono necessari, tanto i campi sono valori numerici esatti...
Allora non ti serve continuare a mantenerli durante le prove: eliminali.
PHP:
$where = "(Vendita between '{$Vendita}' and '{$Vendita2}') OR (Km between '{$Km}' and '{$Km2}')";

Quanto all'ordinamento devi aggiungere l'istruzione nella query, altrimenti è normale che non funzioni:
PHP:
$rs = mysql_query("select * from usato where {$where} order by {$sort} {$order} limit {$offset},{$rows}");
 

Discussioni simili