2011-12-31 21 views
5

Tôi đang phát triển một ứng dụng web bằng cách sử dụng khung công tác zend. Đối với các câu lệnh chọn tôi đã sử dụng theo cách sau.mysql_real_escape_string với Zend

Ex:

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

này hoạt động tốt. Nhưng nếu tôi gửi tên khách hàng là: colvin's place, Truy vấn không thành công. Và tôi biết đó là vì một câu trích dẫn duy nhất.

Trước đó, tôi đã sử dụng hàm bổ sung PHP. Nhưng tôi thấy đó không phải là cách tốt để làm điều này. Lần này tôi đã sử dụng chức năng PHP mysql_real_escape_string.

Sự cố là cảnh báo sau đây.

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)

Điều này là do các mysql_real_escape_string chức năng cần có một kết nối đến cơ sở dữ liệu mở bởi mysql_connect. Câu hỏi của tôi là làm thế nào tôi có thể sử dụng điều này với các lớp * Zend_DB *. Tôi cần luôn sử dụng các truy vấn chọn tùy chỉnh. Đánh giá cao các đề xuất khác của bạn nếu có.

Cảm ơn bạn

+1

yo đã thử sử dụng [Zend_DB_Statement] (http://framework.zend.com/manual/ vi/zend.db.statement.html) –

+0

Cảm ơn Shiplu. Tôi sẽ kiểm tra. –

+1

Tôi sử dụng addslashes() và cho số nguyên Intval(). Nhưng việc sử dụng addlashes là một thực hành không tốt. – devOp

Trả lời

1

tôi đã cùng một vấn đề và giải pháp này hoạt động tốt đối với tôi. Hy vọng điều này có thể giúp cho bạn. bạn có thể làm một cái gì đó như thế này:

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

sau đó viết truy vấn của bạn theo cách này:

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

Làm cách nào để đảm bảo rằng không có nhân vật nào khác cần thoát? 'mysqli_real_escape_string()' biết tất cả chúng, và chúng phụ thuộc vào thiết lập mã hóa của kết nối cơ sở dữ liệu. – Sven

+0

Hơn nữa, bạn không phải lúc nào cũng muốn xóa dấu ngoặc kép (vì bạn đang thực hiện một cách hiệu quả). Giải pháp bạn trình bày không giải quyết được vấn đề, đó là một trợ giúp cho một phần của vấn đề. – TheMonarch

2

Bạn có thể sử dụng ràng buộc cũng tham số, sau đó phương pháp này sẽ trông giống như:

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

Sau đó, dữ liệu của bạn sẽ tự động được thoát ra

0

Tôi gặp sự cố này, tôi đã sử dụng cách này d đang làm việc một cách chính xác:

Bạn có thể sử dụng quote():

Phương pháp quote() chấp nhận một đối số duy nhất, một giá trị chuỗi vô hướng. Nó trả về giá trị với các ký tự đặc biệt được thoát theo cách phù hợp với RDBMS bạn đang sử dụng và được bao quanh bởi các dấu phân tách giá trị chuỗi. Dấu phân cách giá trị chuỗi SQL chuẩn là dấu nháy đơn (').

Nhưng quote trả về một chuỗi với 'string' (gửi lại bên trong ngoặc kép), ví dụ tôi nhận được một chuỗi từ người sử dụng từ một hộp nhập văn (hoặc URL trong phương thức 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 

Bây giờ chúng ta có thể sử dụng $string này, và nó cũng giống như những gì mysql_real_escape_string lợi nhuận

+0

tại sao không chỉ đơn giản là cắt ($ this-> db-> quote ($ string), '"\'"); –

Các vấn đề liên quan