2011-12-31 13 views
5

Sto sviluppando un'applicazione Web utilizzando zend framework. Per le affermazioni selezionate ho usato il modo seguente.mysql_real_escape_string con Zend

Es:

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

Questo funziona bene. Ma se invio il nome del cliente come: colvin's place, La query non riesce. E so che è a causa della singola citazione.

In precedenza ho utilizzato la funzione PHP di addslashes. Ma ho visto che non è un buon modo per farlo. Questa volta ho usato la funzione PHP mysql_real_escape_string.

Il problema si dice dopo un avviso.

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)

Questo è a causa della funzione mysql_real_escape_string ha bisogno di una connessione al database aperto da mysql_connect. La mia domanda è come posso usare questo con le classi * Zend_DB *. Devo usare sempre le query di selezione personalizzate. Apprezzo i tuoi altri suggerimenti se disponibili.

Grazie

+1

Did yo provare a utilizzare [Zend_DB_Statement] (http://framework.zend.com/manual/ it/zend.db.statement.html) –

+0

Grazie Shiplu. Controllerò. –

+1

Uso addslashes() e per interi Intval(). Ma usare addslashes è una cattiva pratica. – devOp

risposta

1

Ho avuto lo stesso problema e questa soluzione funziona bene per me. Spero che questo ti possa aiutare. si può fare qualcosa di simile:

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

quindi scrivere la domanda in questo modo:

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

Come ci si assicura che non ci siano altri caratteri che devono essere salvati? 'mysqli_real_escape_string()' li conosce tutti e dipendono dalle impostazioni di codifica della connessione al database. – Sven

+0

Inoltre, non sempre si desidera rimuovere le virgolette (come si sta facendo effettivamente). La soluzione che presenti non risolve il problema, è un cerotto per parte del problema. – TheMonarch

2

Si potrebbe utilizzare vincolante come pure dei parametri, allora il metodo sarà simile:

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

Quindi i tuoi dati saranno sfuggiti automaticamente

0

Ho avuto questo problema, ho usato in questo modo un d funziona correttamente:

È possibile utilizzare quote():

Il metodo citazione() accetta un singolo argomento, un valore stringa scalare. Restituisce il valore con caratteri speciali sfuggiti in un modo appropriato per l'RDBMS che si sta utilizzando e circondato da delimitatori di valori stringa. Il delimitatore del valore di stringa SQL standard è la citazione singola (').

Ma citazione restituisce una stringa con 'stringa' (ritorno all'interno citazione), per esempio io ottenere una stringa da utente da una casella di testo (o URL nel metodo 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 

Ora possiamo usare questo $string, ed è simile a quello che mysql_real_escape_string rendimenti

+0

perché non semplicemente tagliare ($ this-> db-> quote ($ string), '"\'"); –

Problemi correlati