0

列「company_name」を持つテーブルがあります。現在、いくつかのサードパーティのアプリで、次のような短い文字列を受け取ります: Somebody has sent item to "stack-exchange"

string から stack-exchange company_name 列の行を検索したい。(言い換えれば、like operator が逆に動作するようにしたい)。これを行う方法?

編集: テーブル内の company_name の値のいずれかが、受け取った文字列の一部と一致するかどうかを確認するにはどうすればよいですか?

4

2 に答える 2

0

編集: 入力文字列のどの部分が会社名であるかを特定できないため、文字列に対してテーブル内の company_name の既存の値を確認する必要があります。たとえば、PHP では次のようになります。

$input = 'Somebody has sent item to "stack-exchange"';
$result = mysql_query('SELECT company_name FROM table');
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    if strpos($input, $row['company_name']) === False {
        print "Company name is not in this row!" /* Substitute whatever action you want here */
    } else {
        print "Company name is in this row!" /* Substitute whatever action you want here */
    }
}

ユーザー入力の処理

SQL クエリの一部として入力を含める前に、入力がサニタイズされていることを確認してください。そうしないと、コードがハッキングに対して脆弱になります。

残念ながら、受け取った文字列の一部はユーザーが入力したものであるため、データベースにあるものと一致するかどうかはわかりません. たとえば、、 、 など"stack-exchange"と合理的に表すことができます。そのため、データベースに会社名を保存する方法と一致するように入力を標準化する必要があります。たとえば、すべての文字を小文字にし、すべてのスペースまたは句読点をハイフンに置き換えることができます。これは、スペルが正しくない、またはスペルが異なるなどのエッジ ケースを除外するものではありませんが、それはこの質問の範囲を超えています。"Stack Exchange"stack exchangeStackExchange

受け取ったサードパーティの文字列に二重引用符で囲まれた会社名が確実に含まれている場合 (および二重引用符がそれらの文字列内の他のものを示すために使用されていない場合)、PHP を使用して会社名を取得できます。次に、SQLWHERE句を使用して関連する行を取得できます。

$input  = 'Somebody has sent item to "stack-exchange"';
$parts = explode('"', $input);
$company_name = $parts[1];
$sql_query = 'SELECT * FROM table WHERE company_name="' . $company_name . '"'

于 2013-03-02T14:56:29.900 に答える
0

私はこれを少なくとも 2 つの方法で解釈できるので、質問をよりよく説明する必要があると思います: i) メールで提供された文字列は、company-name という列のデータと部分的に一致しています: いずれかの方法で like 式を使用してください。必要に応じて % を追加します。たとえば、'%'+companyname+'%' のように emailstring [メールで提供された 'stack-exchange から 'stack-exchange company' を検索します]

ii) 複数の列があり、それぞれに会社名が付けられています... 例: id、company1、company2、stack-exchange-company、company4

データベースが動的 SQL をサポートしている場合 (たとえば、SQLServer のほとんどのフレーバー)、SQL を計算してから set @sqlexpr = 'select stack-exchange from mytable' exec(@sqlexp) を使用できます。

それ以外の場合は、データベースを呼び出す前に動的に SQL を作成する必要があります。

于 2013-03-02T15:09:04.240 に答える