2009-04-12 23 views
11

Tôi có sql sau (một đơn giản hóa vấn đề thực sự):Làm cách nào để thoát khỏi sql phức tạp trong Zend Framework?

SELECT * 
FROM t 
WHERE myname LIKE '%{$input}%'; 

Làm thế nào để thoát khỏi $ đầu vào?
Tôi không thể sử dụng quoteInto (trừ khi tôi bỏ lỡ điều gì đó).
Như

$sql=$DB->quoteInto("SELECT * 
        FROM t 
        WHERE myname LIKE '%?%'",$input); 

Sẽ cung cấp cho tôi

SELECT * 
FROM t 
WHERE myname LIKE '%'my input'%'; 

$sql=$DB->quoteInto("SELECT * 
        FROM t 
        WHERE myname LIKE ?",'%'.$input.'%'); 

Sẽ cung cấp cho tôi một cái gì đó trên dòng:

SELECT * 
FROM t 
WHERE myname LIKE '\%my input\%'; 

Trả lời

15

Tùy chọn cuối cùng là hoạt động tốt cho tôi tôi đã không có kinh nghiệm nó thoát '%' Vì vậy, $db->quote('%'.$_GET['query'].'%') kết quả đầu ra %queryvalue%

+0

Đây là cách tốt nhất :) –

+3

FWIW, kết quả đầu ra '% queryvalue%' bao gồm cả dấu nháy đơn. –

2

Bạn có thể làm ghép nối đầu vào $ ở cấp SQL:

$sql=$DB->quoteInto("SELECT * FROM t WHERE myname LIKE '%'|| ? ||'%'",$input); 

Thật không may điều này không thể sử dụng khi bạn muốn $ đầu vào để có thể chứa ký tự ‘%’ hoặc ‘_’. Để có được vòng này, chỉ định một nhân vật NHƯ-ESCAPE rõ ràng và thoát khỏi chúng mình:.

$inputlike= '%'.preg_replace('[%_=]', '=$0', $input).'%'; 
$sql=$DB->quoteInto("SELECT * FROM t WHERE myname LIKE ? ESCAPE '='", $inputlike); 

(Nó có thể là bất kỳ ký tự, không nhất thiết phải '=' này cũng làm việc xung quanh một lỗi nơi ESCAPE mặc định là '\' khi không được chỉ định trong MySQL.)

Thật không may, SQL Server cũng lấy ký tự '[' là đặc biệt, để thực hiện nhóm ký tự giống như regexp. Vì vậy, nếu DB của bạn là SQL Server, bạn phải bao gồm ‘[’ trong nhóm ở preg_replace. Rất tiếc, đó không phải là ANSL SQL hợp lệ để thoát ‘[’ trên các DBMS khác mà không cần phải thoát.

+0

Và nối chuỗi là phụ thuộc vào DBMS, vì vậy hãy kiểm tra tài liệu DBMS của bạn. –

+0

Hmm, vâng ... + là SQL Server và || là ANSI/mọi người khác, IIRC. Gah, thật là một mớ hỗn độn. – bobince

+0

Một mớ hỗn độn thực sự. Sẽ thấy điều gì sẽ xảy ra nếu tôi mở một lỗi cho điều đó trong dự án ZF. –

-1

bạn chỉ có thể sử dụng hàm mà zf sử dụng trên chuỗi là addcslashes ($ value, "\ 000 \ n \ r \ '\" \ 032 "), sẽ thay thế chuỗi theo cùng cách mà zf sử dụng hoặc bạn có thể (trong trường hợp của mysql) sử dụng mysql_real_escape_string.

một trong hai cách bạn sẽ không sử dụng một trong các chức năng db quote

tôi tự hỏi, nếu có một phương pháp trong lớp db để làm điều này nhưng Tôi không biết một trong những nên có mặc dù

1

Nó rất đơn giản:

$sql=$DB->quoteInto("SELECT * 
        FROM t 
        WHERE myname LIKE ?",'%' . $input . '%'); 

//Will output: SELECT FROM t WHERE myname LIKE '%inputtedvalue%' 


$sql=$DB->quoteInto("SELECT * 
        FROM t 
        WHERE myname LIKE ?",'%' . $input); 

//Will output: SELECT FROM t WHERE myname LIKE '%inputtedvalue' 


$sql=$DB->quoteInto("SELECT * 
        FROM t 
        WHERE myname LIKE ?", $input . '%'); 

//Will output: SELECT FROM t WHERE myname LIKE 'inputtedvalue%' 


$sql=$DB->quoteInto("SELECT * 
        FROM t 
        WHERE myname LIKE ?", $input); 

//Will output: SELECT FROM t WHERE myname LIKE 'inputtedvalue' 

các prolem là gì?

:)

1

Vấn đề là, chúng tôi muốn thoát khỏi NHƯ ký tự đặc biệt thủ thay thế chúng sẽ là một chút bẩn, nhưng nếu không có giải pháp ...

1

Nó là đơn giản hơn:

$table->select()->where("myname LIKE ?", '%'.$input.'%'); 
3

Giải pháp thực sự đơn giản.Zend_Db có een Expression lớp giúp bạn làm việc arround nó.

$select = $this->select() 
->where('value LIKE("?")', new Zend_Db_Expr('%' . $value . '%')) 

$this->fetchAll($select); 
Các vấn đề liên quan