web-dev-qa-db-ja.com

PHPでフォーム入力が数値であるかどうかを確認するにはどうすればよいですか?

PHPのフォーム入力が数値であるかどうかを確認できる必要があります。数値でない場合、Webサイトはリダイレクトする必要があります。is_numeric()を試しましたが、機能しないようです。

コード例はNiceになります。

数量の整数値を受け入れるショッピングカートを開発しています。私はこれを試しています:

if(!is_numeric($quantity)){
                //redirect($data['referurl']."/badinput");
                echo "is not numeric";
        }
10
Travis
if(!is_numeric($quantity == 0)){
                //redirect($data['referurl']."/badinput");
                echo "is not numeric";

ここにあるのは、2つのネストされた条件です。 $ quantityが1だとしましょう。

最初の条件は1 == 0と評価され、FALSEを返します。 2番目の条件は、FALSEが数値であるかどうかをチェックし、FALSEは数値ではないためFALSEを返します。

書くだけ:

if (!is_numeric($quantity))
{
    echo 'is not numeric';
}
14
markus

おそらく、「数値」の意味を説明する必要があります。積分、浮動小数点、指数表記などです。 is_numeric() はこれらすべてを受け入れます。

文字列に数字以外のものが含まれていないことを確認する場合は、正規表現を使用できます。

_/^\d+$/
_

実際の値を整数であるかのように使用する場合は、とにかくそれを通過させたいと思うでしょう intval() とにかく、_0_を返します値を解析できない場合-_0_が有効な値である場合は、おそらく値の下限を制限するなどして、何らかの方法でそれを処理する必要があります。

7
Rob

JavaScriptを使用して入力のクライアント側の検証を行うことも賢明かもしれません。

サーバーへの往復はタイプミスになる可能性があるため長いものであり、クライアントブラウザに事前に品質保証を少し行わせることで、サーバーのオーバーヘッドを削減できます。

2
infoxicated

is_int および is_numeric を確認してください。各リンクには例があります。さらにサポートが必要な場合は、問題のあるデータとコードサンプルを投稿します。

編集:

$quantity == 0

ブール値(1または0)を返すため、常に数値になります。それを行う正しいこと:

if ( is_numeric( $quantity ) ) {
...
}

または

if ( is_int( $quantity ) ) {
...
}
1
gpojd

別の選択肢は ctype_digit 。ドキュメントから:

Checks if all of the characters in the provided string, text, are numerical. Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise.

<?php
$strings = array('1820.20', '10002', 'wsl!12');
foreach ($strings as $testcase) {
    if (ctype_digit($testcase)) {
        echo "The string $testcase consists of all digits.\n";
    } else {
        echo "The string $testcase does not consist of all digits.\n";
    }
}
?>

上記の例は次のように出力します。
文字列1820.20はすべての数字で構成されているわけではありません。
文字列10002はすべての数字で構成されます。
文字列wsl!12はすべての数字で構成されているわけではありません。

<?php

$numeric_string = '42';
$integer        = 42;

ctype_digit($numeric_string);  // true
ctype_digit($integer);         // false (ASCII 42 is the * character)

is_numeric($numeric_string);   // true
is_numeric($integer);          // true
?>
1
John Conde

ロブが言ったことは、数字をチェックするための正規表現の代わりに、 ctype_digit を使用することです。

0
Tom Ritter

これを試して:

$numeric = "1"; //true default

$string = trim($_GET['string']);

$chkarray = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ",", ".");

for ($i=0; $i < strlen($string); $i++) { 
    if (!in_array(substr($string, $i, 1), $chkarray)) {
        $numeric = "0";
        break;
    }
}
0
fausto

タルクンはこれまでのところ最良の答えを持っています。このような質問をしているのなら、まだ正規表現をいじり始めたくないのではないかと思います。

あなたの論理を再考してください。 $ Quantity == 0が数値の結果であるかどうかを確認するのはなぜですか?数量に値が割り当てられていない可能性があると思われるb/cのエラーを回避しようとしている場合は、チェックが少し遅れています。これは、アプリケーションで非常に一般的な(そして悪意のある)セキュリティホールです。$ quantityにユーザー入力から派生した値がある場合は、実行のこのポイントに到達する前に、入力をサニタイズしてください。問題のごく一部として、以前に入力をサニタイズしたため、デフォルト値を割り当てる必要はありません(サニタイズは、「入力なし」の状況に対処する場所です)。

幸運を!

0
Travis Leleu

正規表現を使用します:/^\d+$/問題を解決する必要があります

0
Mad Scientist