Như đã nêu trong câu hỏi, truy vấn
$query = 'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE "' . $searchText . '%"'
. 'OR SEARCHFIELD LIKE "% ' . $searchText . '%"'
hoạt động để đối sánh các bản ghi trong đó SEARCHFIELD
chứa một từ bắt đầu bằng (hoặc bằng) $searchText
Về hiệu suất, tôi đã thực hiện một bài kiểm tra trên máy phát triển của mình MBP 2,2 GHz i7 quad core
:
Tìm kiếm một từ trên 4.000 bản ghi mất khoảng 40 mili giây.
Các bản ghi thường được lập chỉ mục (không có văn bản đầy đủ).
Tôi có vài nghìn bản ghi và truy vấn không chạy thường xuyên nên đối với tôi là tốt.
Giải pháp có thể không phù hợp với các ngữ cảnh khác.
Để tạo một câu lệnh đã chuẩn bị sẵn với truy vấn trên, tôi đã sử dụng kỹ thuật được mô tả ở đây:
Mã kết quả như sau:
Hàmfunction like($s, $e)
{
return str_replace(array($e, '_', '%'), array($e . $e, $e . '_', $e . '%'), $s);
}
/* ... */
/* create a prepared statement */
$stmt = $mysqli->prepare(
'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE ? ESCAPE "=" OR SEARCHFIELD LIKE ? ESCAPE "="'
);
if( $stmt )
{
/* escape the text */
$escSearchText = like( $searchText, "=" );
/* 'like' parameters */
$like1 = $escSearchText . "%";
$like2 = "%" . $escSearchText . "%";
/* bind parameters for markers */
$stmt->bind_param( "ss", $like1, $like2 );
/* ... */