5

次のような MySQL リクエストを実行すると、次のようになることに気付きました。

SELECT 1 FROM myTable WHERE id = 'asdf'

次に、文字列 'asdf' が にキャストされ0ます。0これは、これが一致する id を持つレコードがあることを意味します。id フィールドのフォーマットはint(8).

続行するための最良の方法は何ですか:

  • 私の値が数値のみであることを (たとえば PHP で) チェックする必要がありますか?
  • それを行うMySQLの方法はありますか?
  • ID のレコードを削除する必要があり0ますか? (悪い)
4

3 に答える 3

4

テキストフィールドのように数値フィールドを使用しないようにクエリを記述してください。

idが数値フィールドの場合、句whereは決して役に立ちません。はい、MySQLが積極的に不満を言っていればいいのですが、基本的には、最初から悪いクエリを実行するコードを書くべきではありません。

そのクエリはどのようにシステムに入りましたか?'asdf'パーツは直接ユーザー入力ですか?代わりにパラメーター化されたSQLを使用できますか?

本当に数値フィールドを照会する場合は、最初に入力が数値であることを確認する必要があります。データベースではなく、呼び出し元のコードでテキストを整数に変換します。

于 2012-06-11T15:56:39.400 に答える
2

まず、PHP を介して入力をサニタイズする必要があります。

$id = 'asdf';
if(is_numeric($id)){
    $query("SELECT 1 FROM myTable WHERE id = $id");
}else{
    die("ID is not numeric");
}

または、次のことができます。

    SELECT 1 FROM myTable WHERE id = 'asdf' AND 'asdf' REGEXP '^-?[0-9]+$'

これにより、正規表現が = false になり、行が返されなくなります。

于 2012-06-11T15:58:48.063 に答える
1

正しいタイプでバインドするpdoプリペアドステートメントはエラーを発生させないため(mysql strictモードが有効になっている場合を除く)、php内の変数のタイプを確認および制御して、これらの言語の許容範囲を「修正」するしかありません。

[コメンテーターに感謝]

于 2012-06-11T15:58:11.340 に答える