2011-11-21 15 views
5

querida All.uso de intval & real_escape_string al desinfectar enteros

Estoy usando números enteros PK en algunas tablas de la base de datos mysql. Antes de la entrada del script PHP, estoy haciendo algo de desinfección, que incluye intval ($ id) y $ mysqli-> real_escape_string().

Las consultas son bastante simples

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

En este ejemplo, la descripción pasa por $ real_escape_string(), mientras que $ supplier_id de ser sólo intval ed() '.

Tengo curiosidad, si hay algunas situaciones, cuando necesito aplicar tanto intval como real_escape_string al entero que estoy insertando en DB? Entonces, básicamente, ¿realmente necesito usar?

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

Gracias.

+3

Todo ese esfuerzo extraño con desinfectar y garantizar los tipos de datos sería redundante si utilizara declaraciones preparadas. Mucho más fácil. – mario

+0

Gracias por su comentario. Originalmente, las clases de DB se desarrollaron sin declaraciones de preparación, por lo tanto, necesito refactorizar las clases subyacentes y no romper la infraestructura de trabajo al mismo tiempo. Así que estoy considerando cambiar a las declaraciones de preparación por las razones que mencionaste, pero no inmediatamente :) – paulus

+0

Además, las declaraciones de preparación, hasta donde yo sé, son más útiles cuando se trata de consultas masivas, que generalmente no es el caso en mi situación. Así que, básicamente, cambiar a las declaraciones preparatorias aumentará (definitivamente no disminuirá) la cantidad de código =>, por lo tanto, la legibilidad y el rendimiento reducidos también están bajo cuestionamiento. En mi opinión, será más rápido hacer intvals y real_escape_strings ocasionales que preparar statement => bind => execute.A menos que desarrolle algún tipo de super-meta-db-class que se encargue de todas las consultas, lo que en mi caso significaría volver a escribir el código desde cero. – paulus

Respuesta

9

intval manera más rápida que real_escape_string desde real_escape_string tiene que conectarse a la base de datos y escapar en función del conjunto de caracteres/colación.

También se puede convertir el int como:

$val = (int)$val; 

por lo tanto, no hay necesidad de duplicar desinfectar

1

Usted no tiene que utilizar $ mysqli-> real_escape_string después de ejecutar intval en una variable. intval() devolverá 0 si no es un entero y si es un entero devolverá el valor.

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 

Hay algunos casos en los que intval devolverá el primer entero en la cadena si está ajustado a '5b'

+1

intval ($ variable2) devolverá 5 no 0 – Derek

+0

Lo volví a tener en cuenta y actualicé la respuesta y la agregué en la parte inferior porque he tenido que ocasionalmente devolver 0 y otras veces devolver 5 –

+0

¡ahora tiene razón! – Derek

0

considerar algo como esto:

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

Usando intval() te dará un "escapado" valor de

50 

mientras que real_escape_string dará y ou

50 O\'Brien Family Members at a Bar 

real_escape_ CADENA() sólo debe utilizarse cuando usted realmente desea utilizar un valor de cadena en una consulta. Para todo lo demás, usa una herramienta más apropiada.

Cuestiones relacionadas