Page 1 of 1

CreateInputText e problema apici

Posted: Fri Jun 25, 2010 10:29 am
by nervino
Ciao a tutti,
mi sono incartato su un campo generato con CreateInputText (frontend).

Lo uso in un form, creato con CreateFrontEndFormStart, per eseguire una semplice ricerca con LIKE.

Il problema: se metto una parola con apice nel form, ad esempio "L'anatra":

1) la ricerca non trova niente nel Db anche se la parola esiste

2) nel campo di ricerca, dopo il submit, compare l'apice come entità (L'anatra)

C'è qualcosa che mi sfugge, ovviamente...

Qualche suggerimento?

Grazie


Il codice

- Nel file xxx.module.php ho registrato: $this->SetParameterType('inputsearch',CLEAN_STRING);

- Nella pagina action.default.php:

Code: Select all

if( isset( $params['inputsearch'] ) && !empty( $params['inputsearch'] ) ) {
	$search = trim($params['inputsearch']);
	//$inputsearch =  html_entity_decode(trim($params['inputsearch']));
	$inputsearch =  trim($params['inputsearch']);
	$search = explode(' ', $search);
	$search = "Titolo LIKE '%" . join("%' AND Titolo LIKE '%", $search) . "%'";
	$add_search =  " AND ($search)";
	$query .= $add_search;
	}

#### DEGUG ######
echo "Search = ". $search;
echo "<br>";
echo "inputsearch = ". $inputsearch;
##################

//Assegnazione a Smarty del campo testo:
$this->smarty->assign('inputsearch',
$this->CreateInputText($id, 'inputsearch', $inputsearch, 30, 250));

Gli echo del DEBUG stampano:
Search = Titolo LIKE '%L'anatra%'
inputsearch = L'anatra




Info Sistema e CMS

----------------------------------------------

Cms Version: 1.7.1

Installed Modules:

   * CMSMailer: 2.0
   * FileManager: 1.0.2
   * MenuManager: 1.6.3
   * ModuleManager: 1.3.3
   * News: 2.10.5
   * nuSOAP: 1.0.1
   * Printing: 1.0.4
   * Search: 1.6.3
   * ThemeManager: 1.1.1
   * TinyMCE: 2.7.0
   * GestioneFondiJA: 1.0


Config Information:

   * php_memory_limit:
   * process_whole_template: false
   * max_upload_size: 2000000
   * default_upload_permission: 664
   * assume_mod_rewrite: true
   * page_extension: .htm
   * internal_pretty_urls: false
   * use_hierarchy: true


Php Information:

   * phpversion: 5.3.2-0.dotdeb.1
   * md5_function: On (Vero)
   * gd_version: 2
   * tempnam_function: On (Vero)
   * magic_quotes_runtime: Off (Falso)
   * E_STRICT: 0
   * E_DEPRECATED: 0
   * memory_limit: 128M
   * max_execution_time: 30
   * safe_mode: Off (Falso)
   * session_save_path: /tmp (1777)
   * session_use_cookies: On (Vero)


Server Information:

   * Server Api: apache2handler
   * Server Db Type: MySQL (mysqli)
   * Server Db Version: 5.1.44


----------------------------------------------

Re: CreateInputText e problema apici

Posted: Fri Jun 25, 2010 10:35 am
by protempore
fare l'escape dell'apostrofo?

"L\'anatra"

Re: CreateInputText e problema apici

Posted: Fri Jun 25, 2010 11:15 am
by nervino
Ho provato ad usare mysqli_real_escape_string() ma non funziona.

Se non sbaglio, avevo letto una volta che registrando il parametro con SetParameterType, CMSMS provvedeva a sanitarizzare tutte le variabili. Pensavo quindi che non ci fosse bisogno di usare altre precauzioni..

Re: CreateInputText e problema apici

Posted: Fri Jun 25, 2010 12:49 pm
by protempore
devi usare la funzione addslashes()...

credo

se gli passi a MySql il parametro

Code: Select all

Titolo LIKE '%L'anatra%'
ovvio che il secondo apice manda in tilt la query

allora o trovi il modo di passarglielo così:

Code: Select all

'%'.addslashes("L'anatra").'%'
oppure provi semplicemente così:

Code: Select all

"%L'anatra%"
con gli apici doppi dovrebbe funzionare

Re: CreateInputText e problema apici

Posted: Fri Jun 25, 2010 3:28 pm
by nervino
Ho cambiato il codice così:

Code: Select all

	if( isset( $params['inputsearch'] ) && !empty( $params['inputsearch'] ) ) {
		$search = trim($params['inputsearch']);
		$search = addslashes(str_replace("'","'",$search));
		$inputsearch =  trim($params['inputsearch']);
		$inputsearch = html_entity_decode(str_replace("'","'",$inputsearch));
		$search = explode(' ', $search);

		$search = "Titolo LIKE '%" . join("%' AND Titolo LIKE '%", $search) . "%'";
		$add_search =  " AND ($search)";
		$query_opere .= $add_search;
	}
anche se mi fa schifo e non mi convince...

Re: CreateInputText e problema apici

Posted: Sat Jul 10, 2010 1:07 pm
by alby
Perchè non usi direttamente le api di adodb, in questo modo pensa già lui a pulirti il tutto (se la consideri come variabile) del tipo:

$query = "SELECT...... WHERE Titolo LIKE ?";
$dbresult = $db->Execute($query, array('%'.$myvar.'%'));

Alby

Re: CreateInputText e problema apici

Posted: Sat Jul 10, 2010 4:14 pm
by nervino
Ho provato a fare come dici, ma gli apici vengono passati sempre come entità.

Code: Select all

$search = trim($params['inputsearch']);

$xsearch = "Titolo LIKE ?";

$add_search =  " AND ($xsearch)";

$query_opere .= $add_search;
quindi

Code: Select all

$dbresult = $db->SelectLimit($query_opere,$pagelimit,$startelement,array('%'.$search.'%')
Dalla stampa della query fatta dal Debug:
... AND (Titolo LIKE '%l'anatra%') order by...

Inoltre, devo comunque filtrare l'altra variabile con cui, dopo il submit, ripasso il contenuto inserito dall'utente nel campo di input; altrimenti mi ritrovo le entità nel campo di ricerca.

Code: Select all

$inputsearch =  trim($params['inputsearch']);
$inputsearch = html_entity_decode(str_replace("'","'",$inputsearch));

Re: CreateInputText e problema apici

Posted: Sat Jul 10, 2010 7:26 pm
by alby
nervino wrote: Dalla stampa della query fatta dal Debug:
Non considerare la stampa del Debug (lui trasforma sempre), semmai fai stampare la query credo con $db->sql (ma non vorrei sbagliarmi con l'adodb full)

Alby