Newsgroup: it.comp.www.php
Titolo: operatore jolly mysql

esiste un operatore jolly mysql che mi restituisca tutti i risultati?
 
 
perchè ho da creare una serie di selezioni tipo WHERE  a=$a  AND b=$b
AND c=$c  
 
 
 
vorrei fare in maniera che son non ho un GET relativo specifico 
$_GET[a] mi dia tutto quello che c'è in a=?  
 
una sorta di:
 if (isset($_GET[a]) { $a=$_GET[a]; }
else{ $a=CARATTERE_JOLLY; }
 
 mi semplificherebbe molto il codice :)
 
Enrico 
 

 ha scritto:

Posso utilizzare LIKE % ma non mi sembra corretto quando poi richiedo un
risultato esatto.
 
o sbaglio?
 
Enrico 
 


Non dovrebbe. Se fai "nome like 'enrico'" diventa equivalente ad un =.
Però fattelo dire, come scorciatoia è davvero bruttina :p

 Però fattelo dire, come scorciatoia è davvero bruttina :p
 
appunto;  l'alternativa è riscrivere la query ogni volta che cambiano i
valori di richiesta dalla form;
 
esempio il cliente è interessato alla piscina allora  flagga
il ratio della piscina -> riscrivo la query 
 
sto cercando la maniera di scrivere una query sola che mi dia tutti i
risultati se non specificatamente richiesti alcuni parametri.
 
  se voglio mettere tutto con prepare-> (query) riscrivendo ogni
  query per ogni selezione 
il codice che ne viene fuori un bel po' più lungo.
 
sto appunto cercando qualche suggerimento. 
 
Enrico 
 

 il codice che ne viene fuori un bel po' più lungo.
 
Non esiste.
 
Per questo da 30 anni la gente scrive query builders e ORMs :)
 
Bye.
 

 ORMs
 
appunto.. e se la scrivo bruttina con LIKE % quale sono le contro
indicazioni a parte l'estetica? di cui sinceramente me ne sono sempre
poco interessato. 
 
Enrico

 poco interessato.
 
Dipende dall'engine, ma quando usi LIKE attivi il partial match sulla 
stringa, che potrebbe bypassare gli indici e quindi massacrarti le 
prestazioni.
 
Se hai 100 elementi nel DB chissene. Se ne hai milioni aspetti per 
qualche mezz'ora ad ogni query.
 
Bye.

 Bye.
 
Quello che sospettavo .
ci saranno un migliaio di record al massimo; ma cercherò di scrivere
qualcosa di esteticamente migliore e più funzionale
 
Grazie ancora
Enrico
 

 ha scritto:
 

In pratica, per fare un esempio, se ho  le relative opzioni
|provincia|località|categoria|camere|cucina|bagno|ariacondizionata|piscina|forno|tv|etc.
 
dovrò scrivere una query per ogni combinazione richiesta o sbaglio?
 
cosa mi son perso?
 
 


puoi scrivere qualcosa di simile ...
----------
$all = array(
	array('provincia', 'prov'),
	array('camere', 'camere'),
	);
$conc = '';
$q = ' WHERE ';
foreach($all as $item) {
	if(isset($_GET[$item[1]])) {
		$q .= $conc . $item[0]. '=' . $_GET[$item[1]];
		$conc = ' AND ';
		}
	}
if('' == $conc) {
	// nessun valore
	}
--------
 

 cosa mi son perso?
 
Io costruisco le query dinamicamente. Esempio al volo senza test:
 
function search($prov, $loc, $cat, $camere, ...) {
   $wheres = [];
 
   if (!is_null($prov)) {
     $wheres['provincia'] = $prov;
   }
   if (!is_null($loc)) {
     $wheres['località'] = $loc;
   }
   ...
 
   $query = "select * from dati where ";
   $query .= implode(
     ' and ',
     array_map(
       function($k) { return $k . '= :' .$k; },
       $wheres
     )
   );
 
   $stmt = $this->pdo->prepare($query);
   $res = $stmt->execute($wheres);
   // o qualcosa del genere
 
   return $res;
}
 
 
Bye.
 

          $q .= $conc . $item[0]. '=' . $_GET[$item[1]];
 
Occhio che questa è una SQL injection in attesa di esplodere. :)
 
Ma mi hai fatto notare un bug nel mio codice: se non ci sono condizioni 
la mia query fallisce. Bisogna attaccare la parte `where` solo se 
$wheres non è vuoto.
 
Bye.
 

 
 
 
Capisco quello che hai scritto, ma come l'inserisco dentro una query con
pdo e prepare?
 
tipo questa :
 
$sformloc =  $ndb->prepare('SELECT * FROM  ( articoli INNER JOIN
luogo ON articoli.idLuogo=luogo.idLuogo) INNER JOIN bookings_items ON
articoli.idArticoli=bookings_items.id_ref_external WHERE
online=:online  AND categoria=:categoria  GROUP BY
provincia,comune '); 
$sformloc->bindParam(':online', $online, PDO::PARAM_INT); 
$sformloc->bindParam(':categoria', $categoria,
PDO::PARAM_INT); $sformloc->execute();  
 
 
Hai qualche link dove possa studiarmi qualche esempio?
 
perchè il problema rimane prevenire sqlinjection.
 
Enrico
 

 
 
Più chiaro .
 
ma hai pulito le variabili $prov,  $loc, $cat, $camere ... ?
 
altrimenti si potrebbe annidare li dentro un sqlinjection  o sbaglio?
 
Enrico 
 
 

 perchè il problema rimane prevenire sqlinjection.
 
Usando i placeholder di PDO sei già a posto da questo punto di vista.
 
Bye.
 

 altrimenti si potrebbe annidare li dentro un sqlinjection  o sbaglio?
 
No. I placeholder PDO servono proprio a quello: fanno l'escape 
automaticamente in base al motore SQL che hai sotto.
 
Bye.
 

 ha scritto:
 

premesso che provo la soluzione che mi hai suggerito,  
""tanto per farmi fucilare ""
questa qui sotto sarebbe comunque a rischio sqlinjection o
sarebbe sicura?
 
 
----------
if (isset($_GET['provincia']) && (!empty($_GET['provincia'])))
{ $provincia=$_GET['provincia']; 
 
//per paranoia pulisco la stringa 
$provincia=trim($provincia); 
 $provincia=addslashes($provincia);
$provincia=htmlspecialchars($provincia);
 $provincia=substr($provincia, 0, 2);
 
//creo la condizione nel caso sia arrivata la richiesta della provincia
 $cond01=" AND provincia='".$provincia."'"; 
} 
//altrimenti la condizione non esiste
else { $provincia="";   $cond01="";  }
 
$sformloc =  $n2qdb->prepare('SELECT * FROM  ( articoli INNER JOIN
luogo ON articoli.idLuogo=luogo.idLuogo) INNER JOIN bookings_items ON
articoli.idArticoli=bookings_items.id_ref_external WHERE online=:online  AND categoria=:categoria 
//inserisco la condizione nella query se esiste
'.$cond01.' 
GROUP BY provincia,comune ');
 $sformloc->bindParam(':online', $online, PDO::PARAM_INT);
 $sformloc->bindParam(':categoria', $categoria, PDO::PARAM_INT);
 $sformloc->execute(); 
 
------------------------------------
Funzionare funziona, ma non so quanto sia sicura.
Enrico


Si, era giusto per una linea guida di come preparare la query per 
attaccare solo le variabili valorizzate
 

  $sformloc->execute(); 
 
Bye.
 

 Questi due non servono.
 
in verità ho trovato in diversi toutorial addslashes ;
htmlspecialchars in questo caso non serve ma per campi di testo mi leva
tutti i vari % & $ è à etc.
 
riformulo per vedere se ho capito:
------------------------ 
 
///// creo l'array $wheres 
  $wheres[]=$categoria;
  $wheres[]=$online;
 
if (isset($_GET['provincia']) && (!empty($_GET['provincia'])))
  { $provincia=$_GET['provincia']; 
 
$provincia=trim($provincia);   $provincia=addslashes($provincia);
$provincia=htmlspecialchars($provincia); $provincia=substr($provincia,
0, 2);
 
/////creo la condizione
 $cond01=" AND provincia=?"; 
 
/////aggiungo la provincia a $wheres
 
 $wheres[]=$provincia;
 
 
} else { $provincia="";     $cond01="";     }
 
 
$sqll =  $ndb->prepare('SELECT * FROM ((articoli  INNER JOIN tipologie ON articoli.idTipologia=tipologie.idTipologia) INNER JOIN
luogo ON articoli.idLuogo=luogo.idLuogo)   INNER JOIN bookings_items ON articoli.idArticoli=bookings_items.id_ref_external WHERE  categoria=?
AND online=? 
 
/////se presente aggiungo la condizione alla query
 
'.$cond01.' 
 
 ORDER BY occasione DESC, priorita ASC  LIMIT 
//// aggiungo i limiti che vengono dato dal sorgente,  non dovrebbero
creare falle, giusto?
 
 '.$pa.', '.$pb.''); 
 
//faccio eseguire l'array
 
$sqll->execute($wheres); 
 
$rqll = $sqll->fetchAll();
 
-----------------------
 
funzionare funziona ci sono falle?
Enrico 
 

 ha scritto:
 

ho provato così ma ho l'errore sotto riportato .
 
 
 
	$pa=0;
$pb=9;
   $wheres = [];
 
   if (!empty($garage)) {
     $wheres['garage'] = $garage;
   }
   if (!empty($terrazza)) {
     $wheres['terrazza'] = $terrazza;
   }
   if (!empty($giardino)) {
     $wheres['giardino'] = $giardino;
   }
   if (!empty($vani)) {
     $wheres['vani'] = $vani;
   }
   if (!empty($bagni)) {
     $wheres['bagni'] = $bagni;
   }
   if (!empty($classe)) {
     $wheres['classe'] = $classe;
   }
   if (!empty($condizione)) {
     $wheres['condizione'] = $condizione;
   }
   if (!empty($piscina)) {
     $wheres['piscina'] = $piscina;
   }
   if (!empty($occupato)) {
     $wheres['occupato'] = $occupato;
   }
   if (!empty($tipologia)) {
     $wheres['idTipologia'] = $tipologia;
   }
   if (!empty($categoria)) {
     $wheres['categoria'] = $categoria;
   }
   if (!empty($pauto)) {
     $wheres['pauto'] = $pauto;
   }
   if (!empty($piano)) {
     $wheres['piano'] = $piano;
   }
   if (!empty($npiani)) {
     $wheres['npiani'] = $npiani;
   }
   if (!empty($online)) {
     $wheres['online'] = $online;
   }
 
 
   //$query = "select * from dati where ";
   $query = implode(
     ' and ',
     array_map(
       function($k) { return $k . '= :' .$k; },
       $wheres
     )
   );
 
$sqll =  $n2qdb->prepare('SELECT * FROM ((articoli  INNER JOIN
tipologie ON articoli.idTipologia=tipologie.idTipologia) INNER JOIN
luogo ON articoli.idLuogo=luogo.idLuogo)   INNER JOIN bookings_items ON
articoli.idArticoli=bookings_items.id_ref_external WHERE    '.$query.'
ORDER BY occasione DESC, priorita ASC  LIMIT '.$pa.', '.$pb.''); 
 
$sqll->execute($wheres);  
 
 $rqll = $sqll->fetchAll();
 //  $stmt = $this->pdo->prepare($query);
 //  $res = $stmt->execute($wheres);
   // o qualcosa del genere
 
  return $rqll;
 
 
ERRORE
 
Warning
: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number:
parameter was not defined in linea: "" $sqll->execute($wheres);  ""
 
 

 
 
 
dentro $query trovo questo  "ad= :ad and 1= :1 "  mentre dovrebbe
essere questo "categoria= :categoria and online= :online"
 

 ha scritto:
 
 
così funziona  ma non so se  ha falle di sicurezza
 
 
	$pa=0;
$pb=9;
   $wheres = [];
	$condizioni =[];
   if (!empty($garage)) {
     $wheres[] = $garage;
     $condizioni[]='garage';
   }
   if (!empty($terrazza)) {
     $wheres[] = $terrazza;
     $condizioni[]='terrazza';
   }
   if (!empty($giardino)) {
     $wheres[] = $giardino;
     $condizioni[]='giardino';
   }
   if (!empty($vani)) {
     $wheres[] = $vani;
     $condizioni[]='vani';
   }
   if (!empty($bagni)) {
     $wheres[] = $bagni;
     $condizioni[]='bagni';
   }
   if (!empty($classe)) {
     $wheres[] = $classe;
     $condizioni[]='classe';
   }
   if (!empty($condizione)) {
     $wheres[] = $condizione;
     $condizioni[]='condizione';
 
   }
   if (!empty($piscina)) {
     $wheres[] = $piscina;
     $condizioni[]='piscina';
   }
   if (!empty($occupato)) {
     $wheres[] = $occupato;
     $condizioni[]='occupato';
   }
   if (!empty($tipologia)) {
     $wheres[] = $tipologia;
     $condizioni[]='idTipologia';
   }
   if (!empty($categoria)) {
     $wheres[] = $categoria;
     $condizioni[]='categoria';
   }
   if (!empty($pauto)) {
     $wheres[] = $pauto;
     $condizioni[]='pauto';
   }
   if (!empty($piano)) {
     $wheres[] = $piano;
     $condizioni[]='piano';
   }
   if (!empty($npiani)) {
     $wheres[] = $npiani;
$condizioni[]= 'npiani';    
   }
   if (!empty($online)) {
     $wheres[] = $online;
$condizioni[]='online';
   }
 
 
   //$query = "select * from dati where ";
   $query = implode(
     ' AND ',
     array_map(
       function($k) { return $k . '= ?'; },
       $condizioni


    }
 
ho aggiunto 
 
if (!empty($comune)) {
     $wheres[] = $comune;
     $condizioni[]='articoli.idLuogo';   //NB articoli.idLuogo
     }
 if (!empty($provincia)) {
     $wheres[] = $provincia;
     $condizioni[]='provincia';
   }
 
 
Enrico 
 


Quando il codice sembra un copia & incolla, e il tuo è parecchio ripetitivo, 
molto probabilmente è da ottimizzare.
Se non vuoi usare un reduce o un map usa un loop classico.
Mi sembra strano che tu non possa ottenere l'input in un array.

 Mi sembra strano che tu non possa ottenere l'input in un array.
 
e in effetti sto cercando di capire se riesco a far funzionare quello
che mi ha consigliato Alessandro.
 
quindi è un copia e incolla un po' riadattato, quindi sicuramente ho
fatto qualche cappella; però al codice di Alessandro avevo necessità di
mettere i valori LIMIT, poi "articoli.idLuogo"  ho dovuto metterlo se
non mi esce una disambiguità tra le tabelle INNER JOIN  e mi fa fallire
la query.
 
il codice che usavo io era bucabile, ho provato a modificarlo come vedi
nell'altro post. non so se sono riuscito a scrivere qualcosa di valido. 
 
dammi il tuo parere. 
 
a livello di loop  mi sembra semplice quello di "logica mente" a patto
di modificare un paio di cose, così dovrebbe funzionare ma devo
provare, temo che esca la disambiguita con idLuogo, almeno di non
mettere nella form di invio name="articoli.idLuogo", non so se
funziona. 
 
$all=$_GET['input'];
$conc = '';
$q = ' WHERE ';
foreach($all as $item) {
	if(isset($_GET[$item[1]])) {
		$q .= $conc . $item[0]. '= ?';
		$conc = ' AND ';
}
		$wheres []=$_GET[$item[1]];
 
	}
if('' == $conc) {
	// nessun valore
	}
 
$sqll =  $n2qdb->prepare('SELECT * FROM ((articoli  INNER JOIN
tipologie ON articoli.idTipologia=tipologie.idTipologia) INNER JOIN
luogo ON articoli.idLuogo=luogo.idLuogo)   INNER JOIN bookings_items ON
articoli.idArticoli=bookings_items.id_ref_external  '.$q.'


 funzionare funziona ci sono falle?
 
Vedi sopra. Falle non ce ne sono, ma usare ? al posto dei named 
placeholder ti costringe a tenere conto della posizione dei placeholder 
nell'array.
 
Bye.

 placeholder nell'array.
 
Mi metto subito a fare un paio di prove. 
 
Ancora grazie.
Enrico 
 
 

 la query.
 
Limit lo puoi mettere per ultimo, 'articoli.idLuogo' puoi creare un alias: 
SELECT articoli.idLuogo AS 'idluogo_articoli'

Come mai ci sono due subquery nidificate quando così a occhio non ne serve nemmeno una? Altra eredità? Fortunello!

$sqll->execute($wheres);
 
 
ho questo errore su execute :


 serve nemmeno una? Altra eredità? Fortunello!
 
Se ci sono tre tabelle da cui prendere i dati bisognerà che le unisca,
altrimenti devo rifare una query per ogni record che mi esce per avere
tutti i dati e ora che guardo meglio, mi manca una tabella per
l'italiano , per la seconda lingua almeno 3.
 
Enrico 
 
 


Quando si devono unire più tabelle in genere si fa così:
 
SELECT … FROM tab1
INNER JOIN tab2 ON 
tab1.id
 = 
tab2.id
 
INNER JOIN tab3 ON (
tab3.id
 = tab2.id_luogo AND tab3.tipo = 'boh')
WHERE …
 
Non servono subquery.
Se i nomi delle tabelle fossero lunghi puoi usare l'alias anche per loro:
 
… FROM tabella_dal_nome_incredibilmente_lungo_ma_impossibile_da_ridurre AS t
LEFT JOIN altra_tabella_dal_nome_lungo_indemoniato AS altra
LEFT JOIN …

 parameter was not defined in 
 
qui 
http://php.net/manual/en/pdostatement.execute.php
 
e qui
https://pt.stackoverflow.com/questions/82559/sqlstatehy093-invalid-parameter-number-parameter-was-not-defined
 
a quanto ho capito dice che se metti placeholder  e non ?
 
dentro execute  ci va qualcosa del genere:
execute(array(':calories' => $calories, ':colour' => $colour));
 
percui $wheres non va bene, ameno in php 5.x forse su 7.x  ma non lo
so .
 
ho provato in varie maniere , ma sempre lo stesso errore.
 
:(
 
dove sbaglio?
 
Enrico 

 > 
 
 
risolto .... maremmacciabirbona..
 
 
 $wheres['catergoria'] = $categoria;  // non va
 
 
 $wheres[':catergoria'] = $catergoria; // va ..
 
 
adesso il problema si presenta su tabelle unite nelle query disambigue
 
 
 $wheres[':idTipologia'] = $tipologia;   //nessun risultato 
 $wheres[':articoli.idTipologia'] = $tipologia; //nessun risultato 

 …
 
LEFT JOIN no mi funziona 
 
:(
 
Enrico 
 

 ha scritto:
 
Riassumo: partendo dallo script di Alessandro 
 
modificato così va, fino a quando non arrivo a una campo disambiguo di 
tabella JOIN
 
  if (!empty($online)) {
     $wheres[':online'] = $online;
$condizioni[]='online';
   }
 if (!empty($provincia)) {
     $wheres[':provincia'] = $provincia;
     $condizioni[]='provincia';
   }
 
   $query = implode(
     ' AND ',
     array_map(
       function($k) { return $k . '= :'.$k; },
       $condizioni
     )
   );
 
$sqll =  $ndb->prepare('SELECT * FROM ((articoli  INNER JOIN
tipologie ON articoli.idTipologia=tipologie.idTipologia) INNER JOIN
luogo ON articoli.idLuogo=luogo.idLuogo)   INNER JOIN bookings_items ON
articoli.idArticoli=bookings_items.id_ref_external WHERE '.$query.'
ORDER BY occasione DESC, priorita ASC  LIMIT '.$pa.', '.$pb.''); 
 
$sqll->execute($wheres);  
$rqll = $sqll->fetchAll();
 
-------------------
Cosi va sempre
 
 if (!empty($comune)) {
     $wheres[] = $comune;
     $condizioni[]='articoli.idLuogo';
   }
   if (!empty($occupato)) {
     $wheres[] = $occupato;
     $condizioni[]='occupato';
   }
   if (!empty($tipologia)) {
     $wheres[] = $tipologia;
     $condizioni[]='articoli.idTipologia';
   }
 
  if (!empty($online)) {
     $wheres[] = $online;
$condizioni[]='online';
   }
 if (!empty($provincia)) {
     $wheres[] = $provincia;
     $condizioni[]='provincia';
   }
 
   //$query = "select * from dati where ";
   $query = implode(
     ' AND ',
     array_map(
       function($k) { return $k . '= ?'; },
       $condizioni
     )
   );
 
 
$sqll =  $ndb->prepare('SELECT * FROM ((articoli  INNER JOIN
tipologie ON articoli.idTipologia=tipologie.idTipologia) INNER JOIN
luogo ON articoli.idLuogo=luogo.idLuogo)   INNER JOIN bookings_items ON
articoli.idArticoli=bookings_items.id_ref_external WHERE    '.$query.'
ORDER BY occasione DESC, priorita ASC  LIMIT '.$pa.', '.$pb.''); 
 
$sqll->execute($wheres);  
$rqll = $sqll->fetchAll();


 ha scritto:
 

sempre per studiare, perchè la soluzione casereccia ce l'ho, ho
provato come sotto, semplificando il codice, ma la query non da
risultati;  perchè la prova : perchè se implemento lo script con i
named $wheres[":localita"]=$comune; non mi funzionano con le tabelle
unite $wheres[":articoli.idLuogo"]=$comune;
 
cosa mi manca ?
 
    if (!empty($comune)) {
     $wheres[] = $comune;
     $condizioni[]='localita';  
// localita  invece di articoli.idLuogo  avendo messo nella SELECT
    articoli.idLuogo AS localita
 
}
 
 
$sqll =  $ndb->prepare('
SELECT
articoli.idArticoli,occasione,priorita,garage,terrazza,giardino,vani,bagni,classe,condizione,piscina,
 
articoli.idLuogo AS localita,
 
prezzo,
 
articoli.idTipologia AS idTipologie,
 
categoria,cod,pauto,piano,npiani,online, tipologia,
regione, provincia,nomeprovincia, comune, caratteristiche_it_generale,
caratteristiche_it_ariacondizionata, caratteristiche_it_tv,
caratteristiche_it_tv_sat, caratteristiche_it_internet,
caratteristiche_it_wifi, caratteristiche_it_lavatrice,
caratteristiche_it_forno, caratteristiche_it_microode,
caratteristiche_it_doccia, caratteristiche_it_vasca,
caratteristiche_it_divano,caratteristiche_it_lavastoviglie,caratteristiche_it_occupazione,caratteristiche_it_aggiuntivo,desc_it
FROM articoli  INNER JOIN tipologie ON
articoli.idTipologia=tipologie.idTipologia INNER JOIN luogo ON
articoli.idLuogo=luogo.idLuogo INNER JOIN caratteristiche_it ON
articoli.idArticoli=caratteristiche_it.idArticoli   INNER JOIN
bookings_items ON articoli.idArticoli=bookings_items.id_ref_external
WHERE    '.$query.'  ORDER BY occasione DESC, priorita ASC  LIMIT


 Mi sembra strano che tu non possa ottenere l'input in un array.
 
le automazione è quello che sto cercando di imparare, però poi alla
fine il codice compia e incolla ripetitivo, ti consente di fare cose
che altrimenti non potresti fare troppo semplicemente; esempio :
 
se hai da cambiare alcune query su alcuni campi :
 da [=]  a [>=] oppure[<=] oppure [!=]
 
sia sullo script di logicamente
 
 
----------
$all = array(
	array('provincia', 'prov'),
	array('camere', 'camere'),
	);
$conc = '';
$q = ' WHERE ';
foreach($all as $item) {
	if(isset($_GET[$item[1]])) {
		$q .= $conc . $item[0]. '=' . $_GET[$item[1]];
		$conc = ' AND ';
		}
	}
if('' == $conc) {
	// nessun valore
	}
--------
 
sia su quello di alessandro 
 
-----------------
$query .= implode(
     ' and ',
     array_map(
       function($k) { return $k . ' = :' .$k; },
       array_keys($wheres)
     )
   );
-------------
 
Come lo faresti?
 
Enrico 
 
 
 

 $sqll->execute($wheres);
 
caratteristiche_it_generale si trova in articoli?
L'it della tabella caratteristiche_it è la lingua?


Hai ragione, se ogni campo deve essere confrontato in modo diverso diventa più complesso.
Io metterei l'operatore in un array che può essere hardcoded o caricato da un file.
Magari crea una classe specializzata, così ti ritrovi il lavoro fatto per la prossima volta.

 L'it della tabella caratteristiche_it è la lingua?
 
no, c'è una tabella caratteristiche_it (italiano) _en c'è solo il nome
e la descrizione in inglese ma in questa fase non viene associata.
 
caratteristiche_it_generale= 1  significa che il record sono le
caratteristiche generali di quella casa o appartamento
 
caratteristiche_it_generali = 0 significa con NON sono "caratteristiche
generali" ma di un ambiente, per esempio una camera o un salotto. 
 
nella fase di ricerca mi serve sapere solo le caratteristiche generali
della casa o appartamento 
 
Enrico 
 

 specializzata, così ti ritrovi il lavoro fatto per la prossima volta.
 
:) vediamo se ci riesco .
 
Enrico 
 

 
con :articoli.idLuogo => $idLuogo  nell'execute
 
PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number:
parameter was not defined
in /archivio/html/
mare-immobiliare.com/case-vacanza-mare.php
 
 
con :articoli_idLuogo =>
 
tutto ok.
 
 
quello che è venuto  fuori, semplificato, è questo per adesso,  
 
 
 
 
    if (!empty($comune)) {
     $wheres[':articoli_idLuogo'] = $comune;
     $condizioni[]='articoli.idLuogo=:articoli_idLuogo';
   }
   if (!empty($occupato)) {
     $wheres[':occupato'] = $occupato;
     $condizioni[]='occupato=:occupato';
   }
   if (!empty($tipologia)) {
     $wheres[':articoli_idTipologia'] = $tipologia;
     $condizioni[]='articoli.idTipologia=:articoli_idTipologia';
   }
   if (!empty($categoria)) {
     $wheres[':categoria'] = $categoria;
     $condizioni[]='categoria=:categoria';
   }
    if (!empty($online)) {
     $wheres[':online'] = $online;
$condizioni[]='online=:online';
   }
 if (!empty($provincia)) {
     $wheres[':provincia'] = $provincia;
     $condizioni[]='provincia=:provincia';
   }
 if (!empty($caratteristiche_it_generale)) {
     $wheres[':generale'] = $caratteristiche_it_generale;
     $condizioni[]='caratteristiche_it_generale=:generale';
   }
   if (!empty($ariacondizionata)) {
     $wheres[':ariacondizionata'] = $ariacondizionata;
     $condizioni[]='caratteristiche_it_ariacondizionata=:ariacondizionata';
   }
      if (!empty($wifi)) {
     $wheres[':wifi'] = $wifi;
     $condizioni[]='caratteristiche_it_wifi=:wifi';
   }
 
     if (!empty($lavastoviglie)) {
     $wheres[':lavastoviglie'] = $lavastoviglie;
     $condizioni[]='caratteristiche_it_lavastoviglie=:lavastoviglie';
   }
 
   if (!empty($occupazione)) {
     $wheres[':occupazione'] = $occupazione;
     $condizioni[]='caratteristiche_it_occupazione>=:occupazione';  
//qui cambio la condizione da = a >=
     }
   if (!empty($aggiuntivo)) {
     $wheres[':aggiuntivo'] = $aggiuntivo;
     $condizioni[]='caratteristiche_it_aggiuntivo>=:aggiuntivo';
//qui cambio la condizione da = a >=
   }
 
 
   $query = implode(' AND ', $condizioni );
 
 
 
$sqll =  $n2qdb->prepare('SELECT * FROM articoli  INNER JOIN tipologie
