5

I am developing a web application using zend framework. For select statements I have used following way.

Ex:

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

This works fine. But If I send customer name as : colvin's place, The query fail. And I know it's because of the single quote.

Earlier I used addslashes PHP function. But I saw it is not a good way to do this. This time I used mysql_real_escape_string PHP function.

The issue is it says following warning.

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)

This is because of the mysql_real_escape_string function needs a connection to the database opened by mysql_connect. My question is how can I use this with *Zend_DB* classes. I need to use custom select queries always. Appreciate your other suggestions if available.

Thank you

Shiplu Mokaddim
  • 56,364
  • 17
  • 141
  • 187
Prasad Rajapaksha
  • 6,118
  • 10
  • 36
  • 52

4 Answers4

8

You can use the quote() function provided by Zend_Db:

http://framework.zend.com/manual/en/zend.db.adapter.html#zend.db.adapter.quoting.quote

leepowers
  • 37,828
  • 23
  • 98
  • 129
2

You could use parameter binding as well, then the method will look like:

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

Then your data will be escaped automatically

Kypros
  • 2,997
  • 5
  • 21
  • 27
A. Martyn
  • 85
  • 1
  • 9
2

I had this problem, I used this way and is working correctly:

You can use quote():

The quote() method accepts a single argument, a scalar string value. It returns the value with special characters escaped in a manner appropriate for the RDBMS you are using, and surrounded by string value delimiters. The standard SQL string value delimiter is the single-quote (').

But quote returns a string with 'string' (return it inside quotation), for example I get an string from user from a input-text box (or by URL in GET method)

$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

Now we can use this $string, and it is like what mysql_real_escape_string returns

Mohammad Kermani
  • 5,188
  • 7
  • 37
  • 61
1

I had the same problem and this solution works fine for me. I hope this will help. you can do something like this:

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

then write your query this way:

$sql = "SELECT * from customer where Customer_Name = '$quote_removed_name'";
Tisho
  • 8,320
  • 6
  • 44
  • 52
Uma
  • 21
  • 1
  • How do you ensure that there are no other characters that need escaping? `mysqli_real_escape_string()` knows them all, and they depend on the encoding setting of the database connection. – Sven Oct 11 '12 at 08:01
  • Furthermore, you don't always want to remove quotes (as yours is effectively doing). The solution you present isn't solving the problem, it's a band-aid for part of the problem. – TheMonarch Nov 14 '13 at 23:33