0

次のように定義された主キーを持つMySQLのデータベーステーブルがあります。

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY (`id`)

私はすでにテーブルのモデルを作成しました。ORMなしでZendFrameworkv1を使用していますが、この質問はすべてのモデル実装に当てはまるはずです。

今、私は私がつかむことを可能にする関数を作成したいと思いますid

public static function getById ($id) {

    $id = intval($id);

    if ($id < 1) {
        throw new Exception('bad id');
    }

    // business logic and stuff

    return $stuff;
}

このアプローチの理由は2つあります。まず、数値を含むフォーム入力は、多くの場合、ビューから文字列として読み取られます。次に、無効な文字列(など'asdf')はキャスト後にゼロになり、例外が発生します。ただし、チェックをバイパスする可能性のある無効な文字列が多数あります。

echo intval('1asdf');

出力:

1

私が試した他のアプローチは次のとおりです。

if (intval($id) === 0)

if ($id == intval($id))

モデル内のIDを検証するための最良の方法は何ですか?0より大きい整数、および有効な正の整数である文字列を受け入れるようにします。

時間コストが非常に低いものがいいと思います。これが、検証に正規表現を使用していない理由です。これらの呼び出しはアプリケーションのあらゆる場所で使用されるため、オーバーヘッドを支払う余裕はありません。

4

1 に答える 1

1

入力を検証するためだけに、なぜそんなに苦労しているのか理解できません。PHP関数is_numeric()およびhtmlentities()を使用して、SQL ロジックに渡す前に入力をチェックするだけです。さらに、無効な数値 ID (データベースには存在しません) は、それに対する SQL が実行されるとnull出力を返しますが、これは問題になりません。

参考文献:

is_numeric()

htmlentites()

于 2013-01-31T01:23:29.970 に答える