2011-12-31 15 views
5

Estoy desarrollando una aplicación web usando Zend Framework. Para las declaraciones seleccionadas que he usado de la siguiente manera.mysql_real_escape_string con Zend

Ex:

public function getData($name) 
{ 
    $sql = "SELECT * from customer where Customer_Name = '$name'"; 
    return $this->objDB->getAdapter()->fetchAll ($sql); 
} 

Esto funciona bien. Pero si envío el nombre del cliente como: colvin's place, La consulta falla. Y sé que es por la cita simple.

Anteriormente utilicé la función PHP de addslashes. Pero vi que no es una buena manera de hacer esto. Esta vez utilicé la función PHP mysql_real_escape_string.

El problema es que dice siguiente advertencia.

Warning</b>: mysql_real_escape_string() [<a href='function.mysql-real-escape-string'>function.mysql-real-escape-string</a>]: Access denied for user 'ODBC'@'localhost' (using password: NO)

Esto es debido a la función mysql_real_escape_string necesita una conexión a la base de datos abierta por mysql_connect. Mi pregunta es cómo puedo usar esto con las clases * Zend_DB *. Necesito usar consultas de selección personalizadas siempre. Aprecie sus otras sugerencias si están disponibles.

Gracias

+1

quiso yo trate de usar [Zend_Db_Statement] (http://framework.zend.com/manual/ es/zend.db.statement.html) –

+0

Gracias Shiplu. Voy a ver. –

+1

Utilizo addslashes() y para enteros Intval(). Pero usar addslashes es una mala práctica. – devOp

Respuesta

1

que tenían el mismo problema y esta solución funciona bien para mí. Espero que esto sea de ayuda. se puede hacer algo como esto:

$quote_removed_name = str_replace("'","''",$name); 

luego escriba su consulta de esta manera:

$sql = "SELECT * from customer where Customer_Name = '$quote_removed_name'"; 
+0

¿Cómo se asegura de que no haya otros caracteres que deban escapar? 'mysqli_real_escape_string()' los conoce a todos y dependen de la configuración de codificación de la conexión de la base de datos. – Sven

+0

Además, no siempre quiere eliminar las cotizaciones (como las suyas efectivamente están haciendo). La solución que presenta no resuelve el problema, es una curita para una parte del problema. – TheMonarch

2

Usted podría utilizar vinculante, así parámetro, entonces el método se verá así:

public function getData($name) 
{ 
    $sql = "SELECT * from customer where Customer_Name = :name"; 
    return $this->objDB->getAdapter()->fetchAll ($sql, ['name' => $name]); 
} 

Entonces sus datos se escapó automáticamente

0

Tuve este problema, utilicé de esta manera un d está funcionando correctamente:

Puede utilizar quote():

El método cita() acepta un solo argumento, un valor de cadena escalar. Devuelve el valor con caracteres especiales escapados de una manera apropiada para el RDBMS que está utilizando y rodeado por delimitadores de valores de cadena. El delimitador de valor de cadena SQL estándar es la comilla simple (').

Pero cotización devuelve una cadena con 'cadena' (devolverlo dentro de cotización), por ejemplo, me sale una cadena de usuario desde un cuadro de entrada de texto (o por URL en el método GET)

$string = $this->parameters['string']; // This is like $_POST or $_GET 
$string = $this->db->quote($string); 
$string = substr($string, 1, strlen($string)-2); 
//The above line will remove quotes from start and end of string, you can skip it 

Ahora podemos utilizar esta $string, y es parecido a lo que mysql_real_escape_string vuelve

+0

¿por qué no simplemente trim ($ this-> db-> quote ($ string), '"\'"); –

Cuestiones relacionadas