2010-01-09 12 views
6

Estoy tratando de crear una abstracción de base de datos muy simple, una parte de ella usando consultas preparadas.implementando una consulta preparada simple en PHP

Ahora, tengo una función toma una cadena de consulta y una serie de valores de la siguiente manera:

$query = "SELECT `first_name`, `last_name` FROM ::table_name WHERE `id` = :id" 
$values = array(
    'table_name' = $this->table_name, 
    'id' = $user_id, 
); 

Esto creará una consulta como esta:

SELECT `first_name`, `last_name` FROM `sometablename` WHERE `id` = '1234' 

mi problema es el siguiente:
Estoy usando preg_replace_callback para tomar los identificadores :: y: identificadores de la cadena de consulta, y luego enviarlo a una función de desinfección. El problema es que también necesito enviar la matriz de valores para que la función pueda tomar la coincidencia de la expresión regular, obtener el elemento en la matriz de valores con esa clave, escapar del valor, envolverlo en las comillas correctas y luego devolverlo .

Pero no puedo pasar información adicional a la devolución de llamada. Podría usar una variable estática privada, pero esto es muy hacky.

¿Cuál es otro enfoque para esto?

Respuesta

2

Una de las alternativas sugeridas por diversos comentarios en el manual es utilizar preg_replace() con el modificador 'e' como parte de la expresión regular:

preg_replace("/pattern/e","strtoupper('\\1')",$subject); 

código Esencialmente se especificará la va a evaluar. Creo this comment tiene un buen ejemplo, por el que se crea la función, y luego una pequeña cadena para evaluarla que le permite pasar parámetros adicionales:

preg_replace('/pattern/e',"your_function(\$array,\$foo,\$bar,\$etc)",$str); 
+0

¡esto es perfecto! Ojalá lo leyera antes de usar una gran clase para manejarlo ... supongo que lo cambiaré a esta versión más simple. ¡Gracias! –

+0

O podría usar http://php.net/manual/en/function.preg-replace-callback.php. No me gusta la idea de poner código en cuerdas. – mpen

+1

@Mark - Carson especifica que 'preg_replace_callback()' no funciona para él, porque no puede pasar parámetros adicionales a la función de devolución de llamada. Usar 'preg_replace()' con la opción 'e' es la solución alternativa. Tenga en cuenta también que 'preg_replace_callback()' utiliza el código evaluado, por lo que es solo la naturaleza de la situación. – zombat

1

¿No se ajusta vsprintf a sus necesidades?

+0

Yo no lo creo, no sin borrar todo lo que tengo ya –

2

también se puede consultar pdo, zend_db y mdb2. Lo bueno es que tienen parámetros y controladores con nombre que pueden crear declaraciones preparadas (o emular declaraciones preparadas) en muchos motores de almacenamiento.

por ejemplo, Zend_Db hará algunos análisis básico de SQL para manejar casos extremos, como cuando se dice una expresión regular incrustado en una consulta es una clase de caracteres con dos puntos ...

+0

Bien, no he decidido usar una biblioteca, porque quería resolver esto solo, teniendo en cuenta la pequeñez del proyecto (es realmente pequeño) –

Cuestiones relacionadas