Joomla.it Forum

Componenti per Joomla! => Gestione Form => : johnny64 26 Nov 2010, 16:06:05

: [RISOLTO] Chronoconnectivity: lanciare ricerca su record contenente un campo N
: johnny64 26 Nov 2010, 16:06:05
Salve a tutti! Complimenti agli amministratori ed ai moderatori del forum per l'alto livello e nello stesso tempo per la semplicità dei suggerimenti che fornite a noi newbies.
Ho un problema per il quale non ho trovato risposta nel forum, spero che qualcuno possa darmi una mano.
Utilizzando Chronoconnectivity per ottenere dati da un data base, ho la necessità di lanciare una ricerca esclusivamente tra i record che contengono un determinato campo il cui valore è N.
Il codice inserito nel selettore WHERE SQL del Query Related Settings di Chonoconnectivity è il seguente:

<?php
 $session =& JFactory::getSession('ricerca');
 $search_array = array('Protocollo,'Data','Ufficio','Richiesta','Pratica_Chiusa');
 $cerca = array();
 foreach ( $search_array as $search ) {
 $value = JRequest::getVar($search, '' , 'post');
 if ( $value ) {
 $cerca[] = " `$search` LIKE '%$value%' ";
 }
 }
 
 if (empty($cerca) and (JRequest::getVar('submit','no','POST')=="Trova")) {
 $session->set('cerca','0','ricerca');
 JRequest::setVar('limitstart',0,'Get');
 }
 if ( !empty($cerca) ){
 echo " WHERE ".implode(' AND ', $cerca);
 $session->set('cerca',$cerca,'ricerca');         
 }
 elseif ((JRequest::getVar('submit','no','POST')<>"Trova") and  ($session->get('cerca',0,'ricerca')<>0)) {
 $cerca=$session->get('cerca',0,'ricerca');
 echo " WHERE ".implode(' AND ', $cerca);
 }
 else
 {
 echo "";
 }
?>

La mia necessità è filtrare tutti i record in cui il campo Pratica_Chiusa contiene il valore N.
Ho provato ad inserire una select all'inizio del codice php ma ottengo un errore nel frontend del form di ricerca.
Ringrazio per i Vostri cortesi suggerimenti.
: Re:Chronoconnectivity: lanciare ricerca su record contenente un campo N
: vales 28 Nov 2010, 08:53:10
Consiglio di usare i nomi dei campi con sole lettere minuscole per evitare possibili conflitti. Dovresti quindi modificare i nomi nelle tabelle del database e nei form.

La soluzione al tuo problema è inserire nella parte fissa della query che sarà generata il filtro che interessa nel seguente modo.

:
<?php
 $session 
=& JFactory::getSession('ricerca');
 
$search_array = array('protocollo,'data','ufficio','richiesta','pratica_chiusa');
 $cerca = array();
 foreach ( $search_array as $search ) {
 $value = JRequest::getVar($search, '' , '
post');
 $value = str_replace("'","
\'",$value);
 if ( $value ) {
 $cerca[] = " `$search` LIKE '
%$value%' ";
 }
 }
 
 if (empty($cerca) and (JRequest::getVar('
submit','no','POST')=="Trova")) {
 $session->set('
cerca','0','ricerca');
 JRequest::setVar('
limitstart',0,'Get');
 }
 if ( !empty($cerca) ){
 echo " WHERE `pratica_chiusa`='
N' AND ".implode(' AND ', $cerca);
 $session->set('
cerca',$cerca,'ricerca');          
 }
 elseif ((JRequest::getVar('
submit','no','POST')<>"Trova") and  ($session->get('cerca',0,'ricerca')<>0)) {
 $cerca=$session->get('
cerca',0,'ricerca');
 echo " WHERE `pratica_chiusa`='
N' AND ".implode(' AND ', $cerca);
 }
 else
 {
 echo " WHERE `pratica_chiusa`='
N' ";
 }
?>

Ho inserito un'ulteriore riga per ripulire eventuali singoli apici inseriti nella ricerca ed ho già messo le lettere minuscole nei campi.

Attenzione forse per un problema con il parser del forum la riga modificata non mostra la barra rovescia prima dell'apice nella seconda stringa della funzione il codice giusto è il seguente:

$value = str_replace("'","\'",$value);
: Re:Chronoconnectivity: lanciare ricerca su record contenente un campo N
: johnny64 01 Dec 2010, 17:16:59
 :) GRANDE VALES!
Complimenti per la tempestività e per la completezza della soluzione proposta.
Ho provato il codice che mi hai postato ed in un primo tempo, forse per la versione di mysql che utilizzo o per un refuso di copia incolla nel codice da te postato, veniva restituito un errore. Ho provato a togliere gli apici alla dichiarazione $search all'ottava riga ed ai  campi contenenti il valore condizionante la ricerca e tutto ha funzionato a meraviglia.

<?php
$session =& JFactory::getSession('ricerca');
$search_array = array('protocollo,'data','ufficio','richiesta','pratica_chiusa');
$cerca = array();
foreach ( $search_array as $search ) {
$value = JRequest::getVar($search, '' , 'post');
$value = str_replace("'","'",$value);
if ( $value ) { $cerca[] = " $search LIKE '%$value%' ";
}
}
if ( !empty($cerca) ){
echo " WHERE pratica_chiusa='N' AND ".implode(' AND ', $cerca);
$session->set('cerca',$cerca,'ricerca');
}
elseif ((JRequest::getVar('submit','no','POST')<>"Trova") and  ($session->get('cerca',0,'ricerca')<>0)) { $cerca=$session->get('cerca',0,'ricerca');
echo " WHERE pratica_chiusa='N' AND ".implode(' AND ', $cerca);
}
else
{
echo " WHERE pratica_chiusa='N ";
}
?>

Per i newbies come me voglio segnalare che la condizione WHERE suggerita da vales può essere arricchita con ulteriori condizioni. Ad esempio se foglio fare una ricerca nei record aventi campo pratica_chiusa='N' e richiesta diverso da 'Sopralluogo' le righe di codice preposte alla funzione devono essere modificate come di seguito indicato:

echo " WHERE pratica_chiusa='N' AND richiesta NOT LIKE 'Sopralluogo' AND ".implode(' AND ', $cerca);

echo " WHERE pratica_chiusa='N AND richiesta NOT LIKE 'Sopralluogo' ";

Ancora grazie vales per il tempo e le risorse che ci dedichi!

Ho qualche altro quesito da postare ma questo è stato brillantemente risolto!
Ciao.
: Re:[RISOLTO] Chronoconnectivity: lanciare ricerca su record contenente un campo N
: vales 01 Dec 2010, 17:27:55
Ciao Johnny64,

a volte quegli apici danno noia, ma la forma corretta è quella. Forse dipende dalla versione di Mysql.

Metti risolto sul primo post

: Re:[RISOLTO] Chronoconnectivity: lanciare ricerca su record contenente un campo N
: vales 01 Dec 2010, 18:10:34
Ho inserito un commento per nel post del codice perchè forse il parser del forum toglie la barra rovescia nella seconda stringa della seguente funzione

$value = str_replace("'","\'",$value);
: Re:[RISOLTO] Chronoconnectivity: lanciare ricerca su record contenente un campo N
: johnny64 01 Dec 2010, 21:07:09
Ciao vales,
grazie per la precisazione. Il codice che hai postato serve a sostituire il carattere ' con il carattere \ nella stringa $value? Come mai il codice mi funziona anche senza questa modifica?
Ciao
: Re:[RISOLTO] Chronoconnectivity: lanciare ricerca su record contenente un campo N
: vales 02 Dec 2010, 01:31:16
No, la barra rovescia serve a far intepretare il carattere ' come parte della stringa e non come l'inizio di una nuova stringa con conseguente errore.