2011-11-21 4 views
5

caro tutti.utilizzo di intval e real_escape_string durante la sanificazione degli interi

Sto usando interi PK in alcune tabelle del database mysql. Prima dell'input dallo script PHP, sto facendo un po 'di sanitizzazione, che include intval ($ id) e $ mysqli-> real_escape_string().

Le query sono abbastanza semplici

insert into `tblproducts`(`supplier_id`,`description`) values('$supplier_id','$description') 

In questo esempio, $ descrizione passa attraverso real_escape_string(), mentre $ supplier_id solo essere intval() 'ed.

Sono curioso, se ci sono situazioni, quando devo applicare sia intval che real_escape_string all'intero sto inserendo in DB? Quindi, in pratica, devo davvero usare?

$supplier_id = intval($mysqli->real_escape_string($supplier_id)); 

Grazie.

+3

Tutto questo sforzo estraneo con la sanificazione e l'assicurazione dei tipi di dati sarebbe ridondante se si utilizzassero dichiarazioni preparate. Molto più facile. – mario

+0

Grazie per il tuo commento. Inizialmente le classi DB sono state sviluppate senza istruzioni di preparazione, pertanto ho bisogno di rifattorizzare le classi sottostanti e di non interrompere l'infrastruttura di lavoro allo stesso tempo. Quindi sto considerando di passare alle istruzioni di preparazione per i motivi che hai menzionato, ma non subito :) – paulus

+0

Inoltre, le istruzioni di preparazione, per quanto ne so, sono molto utili quando si tratta di query di massa, che in genere non è il caso in la mia situazione. Quindi, in pratica, il passaggio a istruzioni di preparazione aumenterà (e sicuramente non diminuirà) la quantità di codice => quindi la leggibilità e le prestazioni ridotte sono sotto interrogazione. Secondo me, sarà più veloce fare intvals occasionali e stringhe di real_escape che preparare statement => bind => execute.A meno che non svilupperò una sorta di super-meta-db-class che si prenderà cura di tutte le query, che nel mio caso significherebbe riscrivere il codice da zero. – paulus

risposta

9

intval più veloce di real_escape_string dal real_escape_string deve connettersi al database ed eseguire l'escape in base al set di caratteri/fascicolazione.

è anche possibile lanciare l'int come:

$val = (int)$val; 

conseguenza, non occorre raddoppiare igienizzare

1

Non è necessario usare $ mysqli-> real_escape_string dopo l'esecuzione intval su una variabile. intval() restituirà 0 se non è un numero intero e se è un numero intero restituirà il valore.

Example: 
$variable = '5'; 
$variable2 = 'c5b'; 
if(intval($variable)) echo 'It is a variable'; # intval will return 5 or true 
if(intval($variable2)) echo 'It is a variable'; # intval will return 0 or false since it has a letter 
Ci

è alcuni casi in cui intval restituirà il primo intero nella stringa se è impostato a '5 ter'

+1

intval ($ variabile2) restituirà 5 non 0 – Derek

+0

L'ho ricollegato e ho aggiornato la risposta e l'ho aggiunta in fondo perché ho avuto luogo occasionalmente restituire 0 e altre volte restituire 5 –

+0

ora hai ragione! – Derek

0

considerare qualcosa di simile:

$x = "50 O'Brien Family Members at a Bar"; 

Utilizzando intval() vi darà un valore "escape" di

50 

mentre la stringa in vero_costruzione darà ou

50 O\'Brien Family Members at a Bar 

real_escape_ STRING() è consentito solo quando davvero si desidera utilizzare un valore stringa in una query. Per tutto il resto, utilizzare uno strumento più appropriato.