CreateInputText e problema apici

La discussione sul CMS Made Simple in italiano.

Moderator: magallo

Post Reply
nervino
Power Poster
Power Poster
Posts: 448
Joined: Sun Dec 28, 2008 12:15 pm
Location: Roma, Italy

CreateInputText e problema apici

Post 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


----------------------------------------------
Last edited by nervino on Fri Jun 25, 2010 10:33 am, edited 1 time in total.
User avatar
protempore
Power Poster
Power Poster
Posts: 599
Joined: Mon Jan 14, 2008 9:08 pm

Re: CreateInputText e problema apici

Post by protempore »

fare l'escape dell'apostrofo?

"L\'anatra"
An eye for an eye will make the whole world blind
Mahatma Gandhi (1869-1948)
nervino
Power Poster
Power Poster
Posts: 448
Joined: Sun Dec 28, 2008 12:15 pm
Location: Roma, Italy

Re: CreateInputText e problema apici

Post 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..
User avatar
protempore
Power Poster
Power Poster
Posts: 599
Joined: Mon Jan 14, 2008 9:08 pm

Re: CreateInputText e problema apici

Post 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
Last edited by protempore on Fri Jun 25, 2010 12:51 pm, edited 1 time in total.
An eye for an eye will make the whole world blind
Mahatma Gandhi (1869-1948)
nervino
Power Poster
Power Poster
Posts: 448
Joined: Sun Dec 28, 2008 12:15 pm
Location: Roma, Italy

Re: CreateInputText e problema apici

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

Re: CreateInputText e problema apici

Post 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
nervino
Power Poster
Power Poster
Posts: 448
Joined: Sun Dec 28, 2008 12:15 pm
Location: Roma, Italy

Re: CreateInputText e problema apici

Post 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));
alby

Re: CreateInputText e problema apici

Post 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
Post Reply

Return to “Italian - Italiano”