1

データベースを検索するコードを書きましたが、特定のキーワードを検索すると、関連のない他のリンクが表示される理由がわかりません。これがコードと結果です。

Page.Title = "Catalog Search";
var db = Database.Open("Shopping");
var searchWords = Request["searchTerm"].Split(' ');
IEnumerable<dynamic> result = Enumerable.Empty<string>();
var sqlSelect = "SELECT ProductId, ProductTitle FROM Products WHERE " +
"ProductTitle LIKE @0";
foreach(var word in searchWords)
{
result = result.Concat(db.Query(sqlSelect, "%" + word + "%").ToList());
}

そこで「Samsung LCD」で検索した結果がこちら。

Samsung - 15" Series 9 Ultrabook Laptop
Samsung - Galaxy Tab 2 7.0
Samsung - 32" Class - LCD
Samsung - 32" Class - LCD 

まさに私が欲しいものであるphpコードを見てきましたが、残念ながらそれを変換する方法がわかりません。これがphpコードです。

$searchTerms = explode(' ', $bucketsearch);
$searchTermBits = array();
foreach ($searchTerms as $term) {
    $term = trim($term);
    if (!empty($term)) {
        $searchTermBits[] = "bucketname LIKE '%$term%'";
    }
}

...

$result = mysql_query("SELECT * FROM buckets WHERE ".implode(' AND ', $searchTermBits).");

そしてphp検索コードの結果。

SELECT * FROM buckets WHERE bucketname LIKE '%apple%' AND bucketname LIKE '%and%' AND bucketname LIKE '%pear%'
4

1 に答える 1

0

いくつかの null チェックなどを自由に追加しましたが、C# のコードは次のようになります。

// make sure search terms are passed in, and remove blank entries
var searchTerms = Request["searchTerms"] == null ? 
                    new string[] {} : 
                    Request["searchTerms"].Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);

// build the list of query items using parameterization
var searchTermBits = new List<string>();
for (var i=0; i<searchTerms.Length; i++) {
    searchTermBits.Add("bucketname LIKE @" + i);
}

// create your sql command using a join over the array
var query = "SELECT * FROM buckets";
if (searchTerms.Length > 0) {
  query += " WHERE " + string.Join(" AND ", searchTermBits);  
} 

// ask the database using a lambda to add the %
var db = Database.Open("StarterSite");
var results = db.Query(query, searchTerms.Select(x => "%" + x + "%").ToArray());

// enjoy!
Response.Write(results.Count());

さらに問題が発生した場合はお知らせください。

于 2012-08-11T09:13:32.427 に答える