Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > it.comp.www.php > #22552 > unrolled thread
| Started by | Enrico Maria Chellini <bitit@bitit.it> |
|---|---|
| First post | 2019-02-13 12:28 +0100 |
| Last post | 2019-02-21 14:38 +0100 |
| Articles | 20 on this page of 43 — 4 participants |
Back to article view | Back to it.comp.www.php
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 →
| From | Alessandro Pellizzari <shuriken@amiran.it> |
|---|---|
| Date | 2019-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]
| From | Enrico Maria Chellini <bitit@bitit.it> |
|---|---|
| Date | 2019-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]
| From | Enrico Maria Chellini <bitit@bitit.it> |
|---|---|
| Date | 2019-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]
| From | Enrico Maria Chellini <bitit@bitit.it> |
|---|---|
| Date | 2019-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]
| From | Enrico Maria Chellini <bitit@bitit.it> |
|---|---|
| Date | 2019-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]
| From | Enrico Maria Chellini <bitit@bitit.it> |
|---|---|
| Date | 2019-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]
| From | Enrico Maria Chellini <bitit@bitit.it> |
|---|---|
| Date | 2019-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]
| From | Enrico Maria Chellini <bitit@bitit.it> |
|---|---|
| Date | 2019-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]
| From | Enrico Maria Chellini <bitit@bitit.it> |
|---|---|
| Date | 2019-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]
| From | Enrico Maria Chellini <bitit@bitit.it> |
|---|---|
| Date | 2019-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]
| From | fmigliori <fmigliori@gmail.com> |
|---|---|
| Date | 2019-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]
| From | Enrico Maria Chellini <bitit@bitit.it> |
|---|---|
| Date | 2019-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]
| From | fmigliori <fmigliori@gmail.com> |
|---|---|
| Date | 2019-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]
| From | Enrico Maria Chellini <bitit@bitit.it> |
|---|---|
| Date | 2019-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]
| From | fmigliori <fmigliori@gmail.com> |
|---|---|
| Date | 2019-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]
| From | Enrico Maria Chellini <bitit@bitit.it> |
|---|---|
| Date | 2019-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]
| From | Enrico Maria Chellini <bitit@bitit.it> |
|---|---|
| Date | 2019-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]
| From | fmigliori <fmigliori@gmail.com> |
|---|---|
| Date | 2019-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]
| From | Enrico Maria Chellini <bitit@bitit.it> |
|---|---|
| Date | 2019-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]
| From | Enrico Maria Chellini <bitit@bitit.it> |
|---|---|
| Date | 2019-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