phpBB Italia chiude!
phpBB Italia ringrazia tutti gli utenti che hanno dato fiducia al nostro progetto per ben 9 anni, e che, grazie al grande lavoro fatto da tutto lo Staff (rigorosamente a titolo gratuito), hanno portato il portale a diventare il principale punto di riferimento italiano alla piattaforma phpBB.

Purtroppo, causa motivi personali, non ho più modo di gestirlo e portarlo avanti. Il forum viene ora posto in uno stato di sola lettura, nonché un archivio storico per permettere a chiunque di fruire di tutte le discussioni trattate.

Il nuovo portale di assistenza per l'Italia di phpBB diventa phpBB-Store.it, cui ringrazio per aver deciso di portare avanti questo grande progetto.

Grazie ancora,
Carlo - Amministratore di phpBB Italia

Dato di ricerca parziale in un form

Area di discussione relativa al linguaggio di programmazione web più conosciuto. Il forum è dedicato anche a MySQL, la piattaforma di database più utilizzata con il PHP.
Rispondi
Avatar utente
Barrnet
Leader Moderatori
Leader Moderatori
Messaggi: 3124
Iscritto il: 04/07/2010, 23:31
Sesso: Maschio
Versione: 3.0.10
Server: UNIX/Linux
PHP: 5.3.10
Database: MySQL 5.1.61-community-log
Contatta:

Dato di ricerca parziale in un form

Messaggio da Barrnet » 31/07/2012, 2:25

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

Avatar utente
Micogian
Leader Programmatori
Leader Programmatori
Messaggi: 3704
Iscritto il: 07/01/2010, 8:51
Versione: 3.2.0
Server: UNIX/Linux
PHP: 5.4.36
Database: MySQL 5.1.70-log
Località: Udine
Contatta:

Re: Dato di ricerca parziale in un form

Messaggio da Micogian » 31/07/2012, 7:46

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.

Avatar utente
Barrnet
Leader Moderatori
Leader Moderatori
Messaggi: 3124
Iscritto il: 04/07/2010, 23:31
Sesso: Maschio
Versione: 3.0.10
Server: UNIX/Linux
PHP: 5.3.10
Database: MySQL 5.1.61-community-log
Contatta:

Re: Dato di ricerca parziale in un form

Messaggio da Barrnet » 31/07/2012, 8:29

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

Avatar utente
Micogian
Leader Programmatori
Leader Programmatori
Messaggi: 3704
Iscritto il: 07/01/2010, 8:51
Versione: 3.2.0
Server: UNIX/Linux
PHP: 5.4.36
Database: MySQL 5.1.70-log
Località: Udine
Contatta:

Re: Dato di ricerca parziale in un form

Messaggio da Micogian » 31/07/2012, 9:03

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.

Rispondi

Torna a “PHP - MySQL”

Chi c’è in linea

Visitano il forum: Nessuno e 56 ospiti