正しくない数値が発生しました


120

私は2つの日付(開始と終了)をPHPスクリプトに渡し、それらをDBに追加するフォームを持っています。これの検証に問題があります。次のエラーが発生し続ける

正しくない数値が発生しました

これは私が次を使用するときです

date("d",$_GET['start_date']);

しかし、多くのサイトのアドバイスに従ってstrtotime()関数を使用すると、UNIXタイムスタンプの日付が1/1/1/1になります。正しい日付を取得する方法はありますか?


5
$_GET['start_date']が含まれているかを投稿する必要があります。
JohnP、2011年

1
私はあなた$_GET['start_date']が第二の引数として関数によって期待されるタイムスタンプではないと思いますdate
Nemoden

この場合は、DChaplinからの2番目の回答がより適切です
cw24

..私は上で参加していなかったテーブルから選択しようとしたとき、私はこれを得た
コナーリーチ

回答:


225

これは、日付関数の2番目の引数として文字列を渡すためです。これは整数でなければなりません。

文字列の日付(文字列$ format [、int $ timestamp = time()])

英語のテキストによる日時の説明をUnixタイムスタンプ(整数)に解析するstrtotimeを試してください。

date("d", strtotime($_GET['start_date']));

1
クラスのコンストラクターで同じエラーが発生しました。デバッグしていたのですが、そのコンストラクターの問題は、パラメーターと整数として受け取っていますpublic function __construct(int $someId....)
Marcos Di Paolo

PHPでのパラメーターの型指定がより「標準」になり、@ MarcosDiPaoloが言及した内容が間違いなくより頻繁に見られるようになります。デッドギブアウェイは、スタックトレースが誤って入力されているパラメーター宣言の行を指すことです。
パートタイムタートル

ここ@parttimeturtle
マルコスディパオロ

@MarcosDiPaoloそのコンストラクターに渡すパラメーターのタイプは、関数定義で示唆されているタイプと一致する必要があります。文字列で表される「4」は、整数で表される4とは異なります。だから、どちらかの関数の定義に準拠したり、あなたが本当に整数4に合体"似た価値観、例えば、文字列「4」に必要がある場合は、厳格な種類をオフに
parttimeturtle

9

単純に、strtotime()関数を使用してこの問題を解決できます。

date("d", strtotime($_GET['start_date']));

7

$_GET['start_date']is not numeric is my betですが、では日付形式はサポートされていませんstrtotime。あなたは、のために実行可能な形式に再フォーマットに日付が必要になりますのstrtotimeまたは使用組み合わせ爆発 / 関数mktime

あなたが現在受け取っているフォーマットを投稿するのに十分親切であるなら、私はあなたに例を加えることができます。


PHPはメソッドに渡されると自動的にキャストするため、キャストしても問題は解決しません。
JohnP、2011年

5

私はこれと同じ状況に遭遇し(私の場合、DrupalビューのカスタムPHPフィールドに日付値がある)、私にとってうまくいったのは、値を整数に変換するためにstrtotimeの代わりにintvalを使用することでした。ですが、整数ではなく文字列の形式です。言うまでもありませんが、試してみる価値はあります。


5

このエラーは、24kb、886abなど、数字と英数字を組み合わせた文字を使用する変数を使用して計算を実行すると発生します...

次の関数でエラーが発生しました

function get_config_bytes($val) {
    $val = trim($val);
    $last = strtolower($val[strlen($val)-1]);       
    switch($last) {
        case 'g':
            $val *= 1024;
        case 'm':
            $val *= 1024;
        case 'k':
            $val *= 1024;
    }
    return $this->fix_integer_overflow($val);
}

アプリケーションは画像をアップロードしましたが、機能しませんでした。次の警告が表示されました:

ここに画像の説明を入力してください

解決策:このintval()関数は、英数字データを含む変数の整数値を抽出し、同じ値を持つがintval()関数を使用して整数に変換された新しい変数を作成します。これがコードです:

function get_config_bytes($val) {
    $val = trim($val);
    $last = strtolower($val[strlen($val)-1]);
    $intval = intval(trim($val));
    switch($last) {
        case 'g':
            $intval *= 1024;
        case 'm':
            $intval *= 1024;
        case 'k':
            $intval *= 1024;
    }
    return $this->fix_integer_overflow($intval);
}


1

これは古い質問ですが、このメッセージが発生する可能性のある別の微妙な方法があります。これは、ドキュメントでかなりよく説明されています

このscenerioを想像してみてください。

try {
  // code that triggers a pdo exception
} catch (Exception $e) {
  throw new MyCustomExceptionHandler($e);
}

そしてMyCustomExceptionHandler大まかに定義されます:

class MyCustomExceptionHandler extends Exception {
  public function __construct($e) {
    parent::__construct($e->getMessage(), $e->getCode());
  }
}

これは、Exceptionクラスがコンストラクターの2番目のパラメーターに数値を期待しているため、実際にはカスタム例外ハンドラーで新しい例外をトリガーしPDOExceptionますが、戻り値の型を動的に変更した可能性があります$e->getCode()文字列にあります。

これを回避するには、次のようなカスタム例外ハンドラを定義します。

class MyCustomExceptionHandler extends Exception {
  public function __construct($e) {
    parent::__construct($e->getMessage());
    $this->code = $e->getCode();
  }
}

1

文字列に数字しか含まれていない場合、文字列を渡すことは必ずしも問題ではありません。

これが発生する可能性のあるもう1つの理由は、前後にスペースがある場合です。例:「1557399276」


0

計算時にエラーが発生した場合は、値にコンマ(、)が含まれていないことを再確認してください。値は整数/浮動小数点形式のみである必要があります。


0

date_default_timezone_set()を使用してタイムゾーンを設定する必要があります。


0

私の場合、それはsem_getのキーでした

sem_get ( int $key [, int $max_acquire = 1 [, int $perm = 0666 [,
          int $auto_release = 1 ]]] 
          ) : resource

$ keyはintである必要があります。そうでない場合、次のエラーが発生します。

PHPの通知:で正しくない数値が発生しました


0

$ _GET ['start_date']が文字列の場合は、それを整数またはdoubleに変換して数値で処理します。

$int = (int) $_GET['start_date']; //Integer
$double = (double) $_GET['start_date']; //It takes in floating value with 2 digits
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.