2013-02-01 48 views
6

Vì vậy, tôi có một vấn đề thú vị mà tôi chưa bao giờ gặp phải và dường như không thể tìm thấy nhiều thông tin về việc khắc phục sự cố. Tôi có một cơ sở dữ liệu khổng lồ với một lượng lớn dữ liệu trong đó (10 năm đáng giá), và cố gắng tìm kiếm nó.Vấn đề Truy vấn Mysql sử dụng LIKE và apostrophe

Hiện công cụ tìm kiếm hoạt động tốt, nhưng gần đây, ai đó đã khiến tôi chú ý đến 'lỗi' nếu bạn muốn. Tôi đã cố gắng để bắn nó để có được kết quả mong đợi, nhưng vô ích.

Đây là vấn đề của tôi:

Khi ai đó sử dụng một dấu nháy đơn trong việc tìm kiếm, nó không phải là các lỗi tìm kiếm trên mạng, nhưng nó sẽ trả về không có kết quả. Vì vậy, ví dụ khi tìm kiếm Pete's truy vấn thực thi nhưng không trả về gì cả. Có, tôi đảm bảo truy vấn có mysql_real_escape_string() sao cho Pete's trở thành Pete\'s.

Ngay cả khi tôi cố gắng truy vấn nó bằng tính năng tìm kiếm của phpmysql, tôi nhận được kết quả lạ. Các truy vấn được dự định là như thế này:

SELECT * FROM `smd_article` WHERE `copy` LIKE '%Pete\'s%' 

Nhưng khi tôi sử dụng tính năng tìm kiếm trong phpmyadmin, nó mang lại cho tôi:

SELECT * FROM `smd_article` WHERE `copy` LIKE '%Pete''s%' 

Và khi tôi thực sự gõ ra các truy vấn trong tab sql, nó vẫn không trả về kết quả nào. Nhưng có một số 17K hồ sơ được trả lại khi tôi chỉ sử dụng Pete và một số hồ sơ 3k khi tôi làm chỉ Petes.

Vì vậy, tôi tò mò về những gì tôi đang làm sai, hoặc thiếu để làm cho nó để nó có thể cho phép các dấu nháy đơn trong một truy vấn bằng cách sử dụng câu lệnh LIKE. Suy nghĩ?

+5

tắt chủ đề, nhưng nó có giá trị biết rằng các truy vấn wildcard như thế này là cách chậm nhất có thể truy vấn Một cơ sở dữ liệu. Tôi có thể không sao cho một cái bàn nhỏ, nhưng nếu bạn có một cái bàn lớn vừa phải, nó thực sự có thể làm chậm mọi thứ. Được cảnh báo. – SDC

Trả lời

5

thử bởi mysql_real_escape_string

LIKE '%" . mysql_real_escape_string($find) . "%' 

hoặc

LIKE '%Pete%27s%' 

hoặc nếu bạn đang sử dụng PDO bạn có thể làm như

$search ='Pete\'s' 
$stmt = $db->prepare("SELECT * FROM `smd_article` WHERE `copy` LIKE ?"); 
$stmt->bindValue(1, "%$search%", PDO::PARAM_STR); 
$stmt->execute(); 
+0

Không hoạt động, vẫn không có kết quả – MrTechie

+1

vì vậy những gì được lưu trữ trong cơ sở dữ liệu? không phải là 'Pete \' s' hay Pete's?nếu nó 'Pete' có nghĩa là bạn đang cho phép ''' nói cách khác mã của bạn là vunerable để sql tiêm –

+1

Tôi thậm chí không bao giờ nghĩ rằng chỉ cần có một cái nhìn tại các dữ liệu thô. Và bây giờ tôi có, tôi thấy vấn đề. Tiêu đề có: Pete ' s và trong nội dung có Pete ’ s - eh. Tôi ghét cách biên tập viên của trang web này chỉ sao chép và dán nội dung – MrTechie

1

Vấn đề là không phải vì các dấu nháy đơn '. Bạn đã thoát nó một cách chính xác. (Tùy theo từng chức năng tìm kiếm trong phpmyadmin):

String: Pete

MySQL: 'Pete' của

Vì vậy, các truy vấn sau đây sẽ làm việc. (Tôi đã thử nghiệm nó)

SELECT * 
FROM `smd_article` 
WHERE copy 
LIKE '%Pete''s%' 

Bạn cũng có thể có một cái nhìn tại IN tuyên bố:

SELECT * 
FROM `smd_article` 
WHERE copy 
IN (
'Pete', 'Pete''s' 
) 
+0

sử dụng câu lệnh in không hoạt động – MrTechie

+0

@MrTechie Tôi đã thử nghiệm truy vấn với dữ liệu ví dụ và nó hoạt động. Việc thoát khỏi báo giá không phải là vấn đề. Phải là một vấn đề khác – hek2mgl

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