0

C で記述された CGI スクリプトで SQL クエリを作成しようとしています。ユーザーはページをクエリするときに何らかのパラメーターを渡し、スクリプトは次のクエリを実行する必要があります。

SELECT `name`, `address`, `phone_number` FROM `restaurants` WHERE `name` LIKE '%{parameter}%'

エスケープとセキュリティの問題のため、{parameter} を %s に置き換えて sprintf を文字列に置き換えることは明らかにできません。

したがって、準備済みステートメントを作成しました。

const char * statement = "SELECT `name`, `address`, `phone_number` FROM `restaurants` WHERE `name` LIKE '%?%'";

結局、疑問符が解析されず、バインディングが失敗します。ステートメントの末尾を " nameLIKE ?" に変更すると、これは完全に機能しますが、用語を等しくするのではなく、その用語を含む結果が失われます。これは悪いことです。

これを回避し、文字列内に LIKE とパラメーターを使用して SQL ステートメントを適切かつ安全に構築することは可能ですか?

ありがとう!

4

3 に答える 3

1

LIKE ?クエリで使用してみて、パラメーター文字列を前に/追加してください%-うまくいくはずです(とにかく、フードの下で同じライブラリを使用する可能性のあるPHP APIを介して行います)。

PHP で同じ問題を参照してください: LIKE ステートメントを使用して PDO パラメーター化クエリを作成するにはどうすればよいですか?

于 2012-10-29T00:08:36.520 に答える
0

php と mysli を使用しても同じ問題が発生します。ハックはSQL関数concatを使用することです。たとえばLIKE CONCAT('%',?,'%')、Cでも動作する必要があります..

于 2012-10-29T00:01:41.457 に答える
-1

strcat 関数を使用して新しいクエリ文字列を作成してみませんか? http://home.fhtw-berlin.de/~junghans/cref/MAN/strcat.htm 問題が解決するはずです。

//編集: 例:

char *cmd = "SELECT `name`, `address`, `phone_number` FROM `restaurants` WHERE `name` LIKE '%":
char *cmdEnd = "%'";

// concat strings
strncat(cmd, parameter, strlen(parameter);
strncat(cmt,cmdEnd);
于 2012-10-29T00:02:36.103 に答える