Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > it.comp.www.php > #22552 > unrolled thread

operatore jolly mysql

Started byEnrico Maria Chellini <bitit@bitit.it>
First post2019-02-13 12:28 +0100
Last post2019-02-21 14:38 +0100
Articles 20 on this page of 43 — 4 participants

Back to article view | Back to it.comp.www.php


Contents

  operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-13 12:28 +0100
    Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-13 16:11 +0100
      Re: operatore jolly mysql fmigliori <fmigliori@gmail.com> - 2019-02-13 12:30 -0800
        Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-14 11:30 +0100
          Re: operatore jolly mysql Alessandro Pellizzari <shuriken@amiran.it> - 2019-02-14 10:42 +0000
            Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-14 11:48 +0100
              Re: operatore jolly mysql Alessandro Pellizzari <shuriken@amiran.it> - 2019-02-14 10:54 +0000
                Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-14 12:00 +0100
                  Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-14 16:23 +0100
                    Re: operatore jolly mysql logica mente <npaolini_no_spam_@ennepisoft.it> - 2019-02-14 16:57 +0100
                      Re: operatore jolly mysql Alessandro Pellizzari <shuriken@amiran.it> - 2019-02-14 16:11 +0000
                        Re: operatore jolly mysql logica mente <npaolini_no_spam_@ennepisoft.it> - 2019-02-14 18:41 +0100
                      Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-14 17:21 +0100
                        Re: operatore jolly mysql Alessandro Pellizzari <shuriken@amiran.it> - 2019-02-14 16:48 +0000
                    Re: operatore jolly mysql Alessandro Pellizzari <shuriken@amiran.it> - 2019-02-14 16:05 +0000
                      Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-14 17:41 +0100
                        Re: operatore jolly mysql Alessandro Pellizzari <shuriken@amiran.it> - 2019-02-14 17:08 +0000
                          Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-14 18:25 +0100
                            Re: operatore jolly mysql Alessandro Pellizzari <shuriken@amiran.it> - 2019-02-14 21:28 +0000
                              Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-15 11:01 +0100
                                Re: operatore jolly mysql Alessandro Pellizzari <shuriken@amiran.it> - 2019-02-15 16:56 +0000
                                  Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-15 18:47 +0100
                                  Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-15 19:41 +0100
                                    Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-16 13:01 +0100
                                      Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-16 15:35 +0100
                                        Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-16 16:18 +0100
                      Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-15 12:47 +0100
                        Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-15 14:07 +0100
                          Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-15 15:08 +0100
                            Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-15 15:41 +0100
                              Re: operatore jolly mysql fmigliori <fmigliori@gmail.com> - 2019-02-15 07:44 -0800
                                Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-15 17:28 +0100
                                  Re: operatore jolly mysql fmigliori <fmigliori@gmail.com> - 2019-02-15 10:27 -0800
                                    Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-15 20:15 +0100
                                      Re: operatore jolly mysql fmigliori <fmigliori@gmail.com> - 2019-02-15 11:37 -0800
                                        Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-16 16:02 +0100
                                          Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-21 12:21 +0100
                                            Re: operatore jolly mysql fmigliori <fmigliori@gmail.com> - 2019-02-21 04:33 -0800
                                              Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-21 14:37 +0100
                                                Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-21 16:27 +0100
                                Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-21 12:39 +0100
                                  Re: operatore jolly mysql fmigliori <fmigliori@gmail.com> - 2019-02-21 04:43 -0800
                                    Re: operatore jolly mysql Enrico Maria Chellini <bitit@bitit.it> - 2019-02-21 14:38 +0100

Page 2 of 3 — ← Prev page 1 [2] 3  Next page →


#22578

FromAlessandro Pellizzari <shuriken@amiran.it>
Date2019-02-15 16:56 +0000
Message-ID<gco99eF10bjU1@mid.individual.net>
In reply to#22571
On 15/02/2019 10:01, Enrico Maria Chellini wrote:

> in verità ho trovato in diversi toutorial addslashes ;

Lo so, purtroppo. Sono tutti sbagliati.
addslashes funzionicchia solo in certi casi particolari e solo con MySQL.

> htmlspecialchars in questo caso non serve ma per campi di testo mi leva
> tutti i vari % & $ è à etc.

Ma ti maciulla i dati nel DB trasformandoli in HTML (da cui il nome 
della funzione).

Se un domani vuoi servirli, per esempio, via JSON a un'app Android ti 
trovi tutto il testo massacrato.

> ///// creo l'array $wheres
>    $wheres[]=$categoria;
>    $wheres[]=$online;

No. Così ti fai solo del male. :)

$wheres['catergoria'] = $categoria;

È importante che l'indice dell'array sia il nome della colonna sul DB, 
così questo:

>   $cond01=" AND provincia=?";

Lo puoi scrivere così:

$cond01 = " AND provincia = :provincia ";

Che è quello che facevo io nell'esempio con questo pezzo di codice:

$query .= implode(
     ' and ',
     array_map(
       function($k) { return $k . ' = :' .$k; },
       array_keys($wheres)
     )
   );

(c'era un bug: mancava array_keys)

Questo ti mette automaticamente l'AND tra una condizione e l'altra senza 
doverlo specificare a mano e senza dover controllare se ci sono altre 
condizioni prima o dopo, e quell'array_map trasforma gli indici 
dell'array ('privincia', 'categoria', ecc.) in placeholder per PDO 
('provincia = :provincia', 'categoria = :categoria', ecc.)

> //// aggiungo i limiti che vengono dato dal sorgente,  non dovrebbero
> creare falle, giusto?
> 
>   '.$pa.', '.$pb.'');

Se non vengono dal client, vai tranquillo. In generale, per stare 
davvero tranquillo, forzali in interi, così al massimo diventano 0 e 0 e 
non torna niente.

> 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.

[toc] | [prev] | [next] | [standalone]


#22579

FromEnrico Maria Chellini <bitit@bitit.it>
Date2019-02-15 18:47 +0100
Message-ID<20190215184728.04b306a3@nntp.aioe.org>
In reply to#22578
Il giorno Fri, 15 Feb 2019 16:56:14 +0000
Alessandro Pellizzari <shuriken@amiran.it> ha scritto:

Che dire?!! super Grazie!! con questo ci paio un paio di cappelle che
ho messo in rete.

> Lo so, purtroppo. Sono tutti sbagliati.
> addslashes funzionicchia solo in certi casi particolari e solo con
> MySQL.

e in effetti me lo tiro dietro da mysql e mysqli 

> Ma ti maciulla i dati nel DB trasformandoli in HTML (da cui il nome 
> della funzione).
> 
> Se un domani vuoi servirli, per esempio, via JSON a un'app Android ti 
> trovi tutto il testo massacrato.

lo tengo presente, anche se mi risolve spesso un bel po' di problemi di
charset.

> 
> $query .= implode(
>      ' and ',
>      array_map(
>        function($k) { return $k . ' = :' .$k; },
>        array_keys($wheres)
>      )
>    );
> 
> (c'era un bug: mancava array_keys)
>
> 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.

Mi metto subito a fare un paio di prove. 

Ancora grazie.
Enrico 

[toc] | [prev] | [next] | [standalone]


#22581

FromEnrico Maria Chellini <bitit@bitit.it>
Date2019-02-15 19:41 +0100
Message-ID<20190215194120.6f7512d3@nntp.aioe.org>
In reply to#22578
Il giorno Fri, 15 Feb 2019 16:56:14 +0000
Alessandro Pellizzari <shuriken@amiran.it> ha scritto:


> 
> $wheres['catergoria'] = $categoria;
> $wheres['online'] = $online;
> 
> 
>$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=:categoria AND online=:online   ORDER BY
>occasione DESC, priorita ASC LIMIT  '.$pa.', '.$pb.''); 
>$sqll->execute($wheres);


ho questo errore su execute :

Warning
: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number:
parameter was not defined in 

[toc] | [prev] | [next] | [standalone]


#22584

FromEnrico Maria Chellini <bitit@bitit.it>
Date2019-02-16 13:01 +0100
Message-ID<20190216130131.1476d5e3@nntp.aioe.org>
In reply to#22581
> >$sqll->execute($wheres);  
> 
> 
> ho questo errore su execute :
> 
> Warning
> : PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number:
> 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 

[toc] | [prev] | [next] | [standalone]


#22585

FromEnrico Maria Chellini <bitit@bitit.it>
Date2019-02-16 15:35 +0100
Message-ID<20190216153541.4de1053c@nntp.aioe.org>
In reply to#22584
Il giorno Sat, 16 Feb 2019 13:01:31 +0100
Enrico Maria Chellini <bitit@bitit.it> ha scritto:

> > >$sqll->execute($wheres);    
> > 


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 

[toc] | [prev] | [next] | [standalone]


#22587

FromEnrico Maria Chellini <bitit@bitit.it>
Date2019-02-16 16:18 +0100
Message-ID<20190216161806.4a108a95@nntp.aioe.org>
In reply to#22585
Il giorno Sat, 16 Feb 2019 15:35:41 +0100
Enrico Maria Chellini <bitit@bitit.it> 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();


$sqll->execute($wheres);  
$rqll = $sqll->fetchAll();

[toc] | [prev] | [next] | [standalone]


#22572

FromEnrico Maria Chellini <bitit@bitit.it>
Date2019-02-15 12:47 +0100
Message-ID<20190215124737.284e8c44@nntp.aioe.org>
In reply to#22562
Il giorno Thu, 14 Feb 2019 16:05:48 +0000
Alessandro Pellizzari <shuriken@amiran.it> ha scritto:

> On 14/02/2019 15:23, Enrico Maria Chellini wrote:
> 
> > 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?  
> 
> 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.
> 

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);  ""

[toc] | [prev] | [next] | [standalone]


#22573

FromEnrico Maria Chellini <bitit@bitit.it>
Date2019-02-15 14:07 +0100
Message-ID<20190215140716.4753b5d6@nntp.aioe.org>
In reply to#22572
> 
> 
>    //$query = "select * from dati where ";
>    $query = implode(
>      ' and ',
>      array_map(
>        function($k) { return $k . '= :' .$k; },
>        $wheres
>      )
>    );
> 


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

[toc] | [prev] | [next] | [standalone]


#22574

FromEnrico Maria Chellini <bitit@bitit.it>
Date2019-02-15 15:08 +0100
Message-ID<20190215150818.1aa17f8a@nntp.aioe.org>
In reply to#22573
Il giorno Fri, 15 Feb 2019 14:07:16 +0100
Enrico Maria Chellini <bitit@bitit.it> 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
     )
   );


$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();

[toc] | [prev] | [next] | [standalone]


#22575

FromEnrico Maria Chellini <bitit@bitit.it>
Date2019-02-15 15:41 +0100
Message-ID<20190215154159.56bff5b5@nntp.aioe.org>
In reply to#22574
>    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';
>    }

ho aggiunto 

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


Enrico 

[toc] | [prev] | [next] | [standalone]


#22576

Fromfmigliori <fmigliori@gmail.com>
Date2019-02-15 07:44 -0800
Message-ID<7ae9fa3a-b559-432d-ab56-90919eb39093@googlegroups.com>
In reply to#22575
Il giorno venerdì 15 febbraio 2019 15:42:01 UTC+1, Enrico Maria Chellini ha scritto:
> >    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';
> >    }
> 
> 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.

[toc] | [prev] | [next] | [standalone]


#22577

FromEnrico Maria Chellini <bitit@bitit.it>
Date2019-02-15 17:28 +0100
Message-ID<20190215172842.7be456d4@nntp.aioe.org>
In reply to#22576
> > 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

link da studiare?

> usa un loop classico.
> 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.'
ORDER BY occasione DESC, priorita ASC  LIMIT '.$pa.', '.$pb.''); 

$sqll->execute($wheres);  
$rqll = $sqll->fetchAll();

[toc] | [prev] | [next] | [standalone]


#22580

Fromfmigliori <fmigliori@gmail.com>
Date2019-02-15 10:27 -0800
Message-ID<73941141-e87e-47d3-b833-17695fb9273a@googlegroups.com>
In reply to#22577
Il giorno venerdì 15 febbraio 2019 17:28:43 UTC+1, Enrico Maria Chellini ha scritto:
> > > 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
> 
> link da studiare?

http://php.net/manual/en/function.array-reduce.php
http://php.net/manual/en/function.array-map.php

> > usa un loop classico.
> > 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.

Limit lo puoi mettere per ultimo, 'articoli.idLuogo' puoi creare un alias: 
SELECT articoli.idLuogo AS 'idluogo_articoli'

> 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.'
> ORDER BY occasione DESC, priorita ASC  LIMIT '.$pa.', '.$pb.''); 
> 
> $sqll->execute($wheres);  
> $rqll = $sqll->fetchAll();

Come mai ci sono due subquery nidificate quando così a occhio non ne serve nemmeno una? Altra eredità? Fortunello!

[toc] | [prev] | [next] | [standalone]


#22582

FromEnrico Maria Chellini <bitit@bitit.it>
Date2019-02-15 20:15 +0100
Message-ID<20190215201548.18b49187@nntp.aioe.org>
In reply to#22580
> > link da studiare?  
> 
> http://php.net/manual/en/function.array-reduce.php
> http://php.net/manual/en/function.array-map.php
> 

ok grazie.
 
> Limit lo puoi mettere per ultimo, 'articoli.idLuogo' puoi creare un
> alias: SELECT articoli.idLuogo AS 'idluogo_articoli'

ci provo 

 
> > $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.' ORDER BY
> > occasione DESC, priorita ASC  LIMIT '.$pa.', '.$pb.''); 
> > 
> > $sqll->execute($wheres);  
> > $rqll = $sqll->fetchAll();  
> 
> Come mai ci sono due subquery nidificate quando così a occhio non ne
> 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 

[toc] | [prev] | [next] | [standalone]


#22583

Fromfmigliori <fmigliori@gmail.com>
Date2019-02-15 11:37 -0800
Message-ID<acbc9ebe-6bf8-4adf-815f-5cb002eecb8f@googlegroups.com>
In reply to#22582
Il giorno venerdì 15 febbraio 2019 20:16:52 UTC+1, Enrico Maria Chellini ha scritto:
> > > link da studiare?  
> > 
> > http://php.net/manual/en/function.array-reduce.php
> > http://php.net/manual/en/function.array-map.php
> > 
> 
> ok grazie.
>  
> > Limit lo puoi mettere per ultimo, 'articoli.idLuogo' puoi creare un
> > alias: SELECT articoli.idLuogo AS 'idluogo_articoli'
> 
> ci provo 
> 
>  
> > > $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.' ORDER BY
> > > occasione DESC, priorita ASC  LIMIT '.$pa.', '.$pb.''); 
> > > 
> > > $sqll->execute($wheres);  
> > > $rqll = $sqll->fetchAll();  
> > 
> > Come mai ci sono due subquery nidificate quando così a occhio non ne
> > 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 …

[toc] | [prev] | [next] | [standalone]


#22586

FromEnrico Maria Chellini <bitit@bitit.it>
Date2019-02-16 16:02 +0100
Message-ID<20190216160211.625495d6@nntp.aioe.org>
In reply to#22583
> > > Limit lo puoi mettere per ultimo, 'articoli.idLuogo' puoi creare
> > > un alias: SELECT articoli.idLuogo AS 'idluogo_articoli'  
> > 

non mi funziona
> 
> … FROM
> tabella_dal_nome_incredibilmente_lungo_ma_impossibile_da_ridurre AS t
> LEFT JOIN altra_tabella_dal_nome_lungo_indemoniato AS altra LEFT JOIN
> …

LEFT JOIN no mi funziona 

:(

Enrico 

[toc] | [prev] | [next] | [standalone]


#22590

FromEnrico Maria Chellini <bitit@bitit.it>
Date2019-02-21 12:21 +0100
Message-ID<20190221122146.31ab66da@nntp.aioe.org>
In reply to#22586
Il giorno Sat, 16 Feb 2019 16:02:11 +0100
Enrico Maria Chellini <bitit@bitit.it> ha scritto:

> > > > Limit lo puoi mettere per ultimo, 'articoli.idLuogo' puoi creare
> > > > un alias: SELECT articoli.idLuogo AS 'idluogo_articoli'    
> > >   
> 
> non mi funziona
> > 
> > … FROM
> > tabella_dal_nome_incredibilmente_lungo_ma_impossibile_da_ridurre AS
> > t LEFT JOIN altra_tabella_dal_nome_lungo_indemoniato AS altra LEFT
> > JOIN …  
> 
> LEFT JOIN no mi funziona 
> 
> :(
> 
> Enrico 
> 

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
'.$pa.', '.$pb.''); 

$sqll->execute($wheres);  


[toc] | [prev] | [next] | [standalone]


#22592

Fromfmigliori <fmigliori@gmail.com>
Date2019-02-21 04:33 -0800
Message-ID<ca707d7b-f423-4e84-8dd6-7ff1017df8f9@googlegroups.com>
In reply to#22590
Il giorno giovedì 21 febbraio 2019 12:21:48 UTC+1, Enrico Maria Chellini 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;

Il segnaposto lo decidi te, potrebbe essere "articoli.idLuogo =  :idLuogo" e $wheres[":idLuogo"]=$comune
o se hai svariati idLuogo , usa :tabella_idLuogo.
Non so perché PDO:execute() non accetta il punto, ma potrebbe avere una buona ragione.

> 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
> '.$pa.', '.$pb.''); 
> 
> $sqll->execute($wheres);

caratteristiche_it_generale si trova in articoli?
L'it della tabella caratteristiche_it è la lingua?

[toc] | [prev] | [next] | [standalone]


#22594

FromEnrico Maria Chellini <bitit@bitit.it>
Date2019-02-21 14:37 +0100
Message-ID<20190221143707.58407449@nntp.aioe.org>
In reply to#22592
 
> 
> Il segnaposto lo decidi te, potrebbe essere "articoli.idLuogo
> =  :idLuogo" e $wheres[":idLuogo"]=$comune o se hai svariati
> idLuogo , usa :tabella_idLuogo.
idLuogo è dentro la tabella articoli campo idLuogo  e la tabella luogo 

ma dici senza senza rinomninare la query? [SELECT articoli.idLuogo AS
localita ] perchè di fatto l'ho rinominata e ho inserito nella query
localita = ?  con placeholder, ma non va.
ho pensato che forse dovrei inserire in SELECT anche luogo.idLuogo e
rinominarlo in localita, ma poi mi ritorna la disambiguità

> Non so perché PDO:execute() non
> accetta il punto, ma potrebbe avere una buona ragione.

per scrupolo dopo riprovo .

> > 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 '.$pa.',
> > '.$pb.''); 
> > 
> > $sqll->execute($wheres);  
> 
> caratteristiche_it_generale si trova in articoli?
> 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 

[toc] | [prev] | [next] | [standalone]


#22596

FromEnrico Maria Chellini <bitit@bitit.it>
Date2019-02-21 16:27 +0100
Message-ID<20190221162713.30fdc014@nntp.aioe.org>
In reply to#22594
Il giorno Thu, 21 Feb 2019 14:37:07 +0100
Enrico Maria Chellini <bitit@bitit.it> ha scritto:

>  
> > 
> > Il segnaposto lo decidi te, potrebbe essere "articoli.idLuogo
> > =  :idLuogo" e $wheres[":idLuogo"]=$comune o se hai svariati
> > idLuogo , usa :tabella_idLuogo.  
> idLuogo è dentro la tabella articoli campo idLuogo  e la tabella
> luogo 
> 
> ma dici senza senza rinomninare la query? [SELECT articoli.idLuogo AS
> localita ] perchè di fatto l'ho rinominata e ho inserito nella query
> localita = ?  con placeholder, ma non va.
> ho pensato che forse dovrei inserire in SELECT anche luogo.idLuogo e
> rinominarlo in localita, ma poi mi ritorna la disambiguità

ok senza rinominare


> > Non so perché PDO:execute() non
> > accetta il punto, ma potrebbe avere una buona ragione.  
> 
> per scrupolo dopo riprovo .
> 
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
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
'.$pa.', '.$pb.''); 

$sqll->execute($wheres);  

[toc] | [prev] | [next] | [standalone]


Page 2 of 3 — ← Prev page 1 [2] 3  Next page →

Back to top | Article view | it.comp.www.php


csiph-web