Pagina 1 di 1

Dato di ricerca parziale in un form

Inviato: 31/07/2012, 2:25
da Barrnet
Sto realizzando un semplice form di ricerca utenti utilizzabile solo dall'amministrazione per recuperare i dati sensibili degli utenti inseriti come campo personalizzato (settato in modo che sia visibile solo all'amministrazione e ai moderatori) in modo da poter avere tutti i mezzi per contattare l'utenza.
Immagine
Il form funziona alla perfezione per quello che mi serve: inserisco il dato da ricercare e seleziono mediante radiobox in quale "colonna ricercarlo", fin qui tutto bene, dov'è il problema?
A dire il vero sono 2:
  1. Non accetta alcun carattere Jolly: ad esempio il forum di ricerca accetta il carattere "*" come carattere Jolly, a me servirebbe una cosa simile: se scrivo A* vorrei che saltassero fuori tutti i membri che iniziano per A
  2. Il form è case sensitive, e questo è un impiccio: per trovarmi dovrei scrivere "Barrnet" al posto di "barrnet", nel mio caso non è un problema, ma ci sono nick molto complessi in cui vi è una alternanza di lettere maiuscole e minuscole.
È possibile modificare il form in qualche maniera o devo riscrivere il codice da zero?

Allego il codice del file .php e del template:

Codice: Seleziona tutto

<?php
        define('IN_PHPBB', true);
        $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
        $phpEx = substr(strrchr(__FILE__, '.'), 1);
        include($phpbb_root_path . 'common.' . $phpEx);

        // Start session management
        $user->session_begin();
        $auth->acl($user->data);
        $user->setup();
$nome=$_POST['nome'];
$controllo=$_POST['controllorigoroso'];
if( $controllo == "1" ) {
switch ($_POST['azione']) {
    case "1":
	         $sql = "SELECT *  FROM ". USERS_TABLE . ",  ". PROFILE_FIELDS_DATA_TABLE . "
				WHERE ". USERS_TABLE . ".user_id = ". PROFILE_FIELDS_DATA_TABLE . ".user_id
				AND username = '%$nome%'
				";	
				break;
    case "2":
	         $sql = "SELECT *  FROM ". USERS_TABLE . ",  ". PROFILE_FIELDS_DATA_TABLE . "
				WHERE ". USERS_TABLE . ".user_id = ". PROFILE_FIELDS_DATA_TABLE . ".user_id
				AND user_from = '%$nome%'
				";	
				break;
    case "3":
	         $sql = "SELECT *  FROM ". USERS_TABLE . ",  ". PROFILE_FIELDS_DATA_TABLE . "
				WHERE ". USERS_TABLE . ".user_id = ". PROFILE_FIELDS_DATA_TABLE . ".user_id
				AND pf_skype = '%$nome%'
				";	
				break;
	case "4":
	           $sql = "SELECT *  FROM ". USERS_TABLE . ",  ". PROFILE_FIELDS_DATA_TABLE . "
				WHERE ". USERS_TABLE . ".user_id = ". PROFILE_FIELDS_DATA_TABLE . ".user_id
				AND user_email = '%$nome%'
				";	
				break;
	case "5":
	          $sql = "SELECT *  FROM ". USERS_TABLE . ",  ". PROFILE_FIELDS_DATA_TABLE . "
				WHERE ". USERS_TABLE . ".user_id = ". PROFILE_FIELDS_DATA_TABLE . ".user_id
				AND pf_facebook = '%$nome%'
				";	
				break;
    case "6":
				$sql = "SELECT *  FROM ". USERS_TABLE . ",  ". PROFILE_FIELDS_DATA_TABLE . "
				WHERE ". USERS_TABLE . ".user_id = ". PROFILE_FIELDS_DATA_TABLE . ".user_id
				AND pf_cell = '%$nome%'
				";	
				break;
    default:
				$sql = "SELECT *  FROM ". USERS_TABLE . ",  ". PROFILE_FIELDS_DATA_TABLE . "
				WHERE ". USERS_TABLE . ".user_id = ". PROFILE_FIELDS_DATA_TABLE . ".user_id
				AND user_type  NOT IN ('2')
				";	
				break;
}

} else {

switch ($_POST['azione']) {
    case "1":
	         $sql = "SELECT *  FROM ". USERS_TABLE . ",  ". PROFILE_FIELDS_DATA_TABLE . "
				WHERE ". USERS_TABLE . ".user_id = ". PROFILE_FIELDS_DATA_TABLE . ".user_id
				AND username LIKE '%$nome%'
				";	
				break;
    case "2":
	         $sql = "SELECT *  FROM ". USERS_TABLE . ",  ". PROFILE_FIELDS_DATA_TABLE . "
				WHERE ". USERS_TABLE . ".user_id = ". PROFILE_FIELDS_DATA_TABLE . ".user_id
				AND user_from LIKE '%$nome%'
				";	
				break;
    case "3":
	         $sql = "SELECT *  FROM ". USERS_TABLE . ",  ". PROFILE_FIELDS_DATA_TABLE . "
				WHERE ". USERS_TABLE . ".user_id = ". PROFILE_FIELDS_DATA_TABLE . ".user_id
				AND pf_skype LIKE '%$nome%'
				";	
				break;
	case "4":
	           $sql = "SELECT *  FROM ". USERS_TABLE . ",  ". PROFILE_FIELDS_DATA_TABLE . "
				WHERE ". USERS_TABLE . ".user_id = ". PROFILE_FIELDS_DATA_TABLE . ".user_id
				AND user_email LIKE '%$nome%'
				";	
				break;
	case "5":
	          $sql = "SELECT *  FROM ". USERS_TABLE . ",  ". PROFILE_FIELDS_DATA_TABLE . "
				WHERE ". USERS_TABLE . ".user_id = ". PROFILE_FIELDS_DATA_TABLE . ".user_id
				AND pf_facebook LIKE '%$nome%'
				";	
				break;
    case "6":
				$sql = "SELECT *  FROM ". USERS_TABLE . ",  ". PROFILE_FIELDS_DATA_TABLE . "
				WHERE ". USERS_TABLE . ".user_id = ". PROFILE_FIELDS_DATA_TABLE . ".user_id
				AND pf_cell LIKE '%$nome%'
				";	
				break;
    default:
				$sql = "SELECT *  FROM ". USERS_TABLE . ",  ". PROFILE_FIELDS_DATA_TABLE . "
				WHERE ". USERS_TABLE . ".user_id = ". PROFILE_FIELDS_DATA_TABLE . ".user_id
				AND user_type  NOT IN ('2')
				";	
				break;
}

}
    $result = $db->sql_query($sql);


             while ($row = $db->sql_fetchrow($result))
             {
           $template->assign_block_vars('risultati',array(
              'NOME'         =>  $row['username'],
			  'LOC'       =>  $row['user_from'], 
              'EMAIL'         =>  $row['user_email'],
			  'SKYPE'         =>  $row['pf_skype'],
			  'FACEBOOK'         =>  $row['pf_facebook'],
			  'CELL'         =>  $row['pf_cell']
              ));
        }
        page_header('Lista Utenti');

        $template->set_filenames(array(
           'body' => 'lista_body.html',
            ));   
        make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"));
        page_footer();
    ?>

Codice: Seleziona tutto

         <!-- INCLUDE overall_header.html -->
       <h2>Elenco contatti membri</h2>  
		<!-- IF U_ACP -->
<span><form method='post'>
Dato da Ricercare   <input size='16' name='nome' value=''>
<input type="radio" name="azione"  value="1" checked="checked">Nome Utente 
<input type="radio" name="azione" value="2" >Località
<input type="radio" name="azione" value="3">Skype
<input type="radio" name="azione" value="4">Email
 <input type="radio" name="azione" value="5">Facebook
 <input type="radio" name="azione" value="6"> Cell.
 <input type="radio" name="azione" value="0"> Resetta
 <input type="checkbox" name="controllorigoroso"  value="1">Controllo Rigoroso 
<input type='submit' name='Apply'></form> 
</span>
    <div class="forabg">
       <div class="inner"><span class="corners-top"><span></span></span>
          <ul class="topiclist">
             <li class="header">
                <dl class="icon">
                   <dd style="width: 15%">&nbsp; Nome Utente </dd>
				   <dd style="width: 15%">&nbsp; Località</dd>
                   <dd style="width: 15%">&nbsp; Contatto Skype</dd>
                   <dd style="width: 15%">&nbsp; Email</dd>
				   <dd style="width: 15%">&nbsp; Facebook</dd>
				   <dd style="width: 15%">&nbsp; Cell.</dd>
                </dl>
             </li>
          </ul>
          <ul class="topiclist forums">
             <!-- BEGIN risultati -->
             <li>
                <dl>
                   <dd style="width: 15%; padding: 3px; border-bottom: 1px solid #cdcdcd;">&nbsp;{risultati.NOME}</dd>
				   <dd style="width: 15%; padding: 3px 0; border-bottom: 1px solid #cdcdcd;">&nbsp;{risultati.LOC}</dd>
                   <dd style="width: 15%; padding: 3px 0; border-bottom: 1px solid #cdcdcd;">&nbsp;{risultati.SKYPE}</dd>
                   <dd style="width: 15%; padding: 3px 0; border-bottom: 1px solid #cdcdcd;">&nbsp;<a href="mailto:{risultati.EMAIL}">{risultati.EMAIL}</a></dd>
                   <dd style="width: 15%; padding: 3px 0; border-bottom: 1px solid #cdcdcd;">&nbsp;{risultati.FACEBOOK}</dd>
				   <dd style="width: 15%; padding: 3px 0; border-bottom: 1px solid #cdcdcd;">&nbsp;{risultati.CELL}</dd>
					</dl>
                 </li>
              <!-- END risultati -->
          </ul>
          <span class="corners-bottom"><span></span></span>
       </div>
    </div>
	<!-- ELSE -->
	<p>Spiacente, non hai i permessi per visualizzare questa pagina.</p>
	<!-- ENDIF -->
    <!-- INCLUDE overall_footer.html -->
Edit: ho risolto mettendo un checkbox abilitando il controllo rigoroso: se abilitato il sistema paragonerà la variabile $nome utilizzando l'uguaglianza, altrimenti adotterà il LIKE.
Ho aggiornato i codici di questa pagina con la versione che sto adoperando, magari servirà a qualcuno :D

Re: Dato di ricerca parziale in un form

Inviato: 31/07/2012, 7:46
da Micogian
Una piccola annotazione: quando fai una query su più tabelle puoi assegnare una sigla a ciascuna tabella. Questo evita di utilizzare nella query il nome completo della tabella.
Esempio:

Codice: Seleziona tutto

$sql = "SELECT *  FROM ". USERS_TABLE . " u,  ". PROFILE_FIELDS_DATA_TABLE . " p
            WHERE u.user_id = p.user_id
            AND u.username = '%$nome%'
            ";
Per quanto riguarda l'username, puoi usare "username_clean" che è minuscolo.

Re: Dato di ricerca parziale in un form

Inviato: 31/07/2012, 8:29
da Barrnet
Ecco, ieri sono impazzito 3 ore a ricordare come si utilizzasse il prefisso... alla fine ho dovuto selezionare tutte le colonne delle tabelle..
Riguardo all'utilizzare l'username_clean non risolverebbe il problema: quello che mi serviva era che l'username doveva essere ricercato sia che fosse scritto giusto, sia parziale o senza case sensitive.

In ogni caso ho migliorato un pò la lista, aggiungendo i colori dei gruppi al nickname e utilizzando delle frasi per segnalare se manca un dato, oltre che ad altre piccolezze.
http://area51.videogamezone.eu/phpBB3/lista.php
Il problema che ho ora è decisamente più complesso: come posso far ricavare una lista in base al group_name immesso? non riesco a farlo in nessun modo, mi devo accontentare di fargli fare una ricerca per group_id fornendogli l'elenco dei group_id...

Re: Dato di ricerca parziale in un form

Inviato: 31/07/2012, 9:03
da Micogian
Potresti usare un modulo SELECT che ti permette di aprire un menu con tutti i gruppi, ne selezioni uno che ti permette di aver il group_id.