Обнаружено некорректное числовое значение


120

У меня есть форма, которая передает две даты (начало и конец) в сценарий PHP, который добавит их в БД. У меня проблемы с подтверждением этого. Я получаю следующие ошибки

Обнаружено некорректное числовое значение

Это когда я использую следующие

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

Но когда я использую функцию strtotime (), как рекомендуют многие сайты, я получаю дату метки времени unix 1/1/1970. Есть идеи, как я могу получить правильную дату?


5
Вы должны разместить то, что $_GET['start_date']содержит.
JohnP

1
Я предполагаю, что $_GET['start_date']это не метка времени, которую ожидает dateфункция в качестве второго аргумента
Nemoden

Второй ответ DChaplin в данном случае более уместен
cw24 09

Я получил это при попытке выбрать из таблицы, к которой я не присоединился ..
Коннор Лич

Ответы:


225

Потому что вы передаете строку в качестве второго аргумента функции даты, которая должна быть целым числом.

строка даты (строка $ format [, int $ timestamp = time ()])

Попробуйте strtotime, который проанализирует любое текстовое описание даты и времени на английском языке в метку времени Unix (целое число):

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

1
Я получаю ту же ошибку в конструкторе класса, я выполнял отладку, и проблема в этом конструкторе заключается в том, что я получаю как параметр и целое числоpublic function __construct(int $someId....)
Маркос Ди Паоло,

Поскольку набор параметров в PHP становится все более «нормой», то, что упомянул @MarcosDiPaolo, определенно будет встречаться чаще. Мертвая распродажа - трассировка стека будет указывать на строку объявления параметра, которая вводится неправильно.
parttimeturtle

Я до сих пор не понимаю, как здесь действовать @parttimeturtle
Маркос Ди Паоло

@MarcosDiPaolo Типы параметров, которые вы передаете этому конструктору, должны соответствовать Типам, которые указаны в определении функции. «4», представленное строкой, отличается от 4, представленного целым числом. Так что либо соответствуйте определению функции, либо отключите строгие типы, если вам действительно нужно объединить «похожие» значения, например, строку «4» в целое число 4.
parttimeturtle

9

Просто вы можете решить эту проблему с помощью strtotime()функции.

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

7

$_GET['start_date']Моя ставка не является числовым, но формат даты не поддерживается strtotime. Вам необходимо переформатировать дату работоспособную формат StrToTime или использование комбинации взрываются / указываете ей .

Я мог бы добавить вам пример, если бы вы были достаточно любезны, чтобы опубликовать формат, который вы сейчас получаете.


Приведение не решит проблему, поскольку PHP автоматически применяет его при передаче в метод.
JohnP

5

Я столкнулся с той же ситуацией (в моем случае со значением даты в настраиваемом поле PHP в представлении Drupal), и что сработало для меня, так это использование intval вместо strtotime, чтобы превратить значение в целое число - потому что это в основном была метка времени , но в виде строки, а не целого числа. Очевидно, что это подойдет не всем, но, возможно, стоит попробовать.


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

Это старый вопрос, но есть еще один тонкий способ, которым может появиться это сообщение. Это довольно хорошо объяснено здесь, в документации .

Представьте себе этот сценарий:

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класс ожидает число для второго параметра в своем конструкторе, но PDOExceptionмог динамически изменить тип возвращаемого значения$e->getCode() на строку.

Обходной путь для этого - определить собственный обработчик исключений, например:

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

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 должен быть целым числом, иначе вы получите следующую ошибку:

Уведомление PHP: неверно сформированное числовое значение, обнаруженное в


0

если $ _GET ['start_date'] является строкой, тогда преобразуйте ее в целое число или двойное число для обработки числовых значений.

$int = (int) $_GET['start_date']; //Integer
$double = (double) $_GET['start_date']; //It takes in floating value with 2 digits
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.