Зустрічається не добре сформоване числове значення


120

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

Зустрічається не добре сформоване числове значення

Це коли я використовую наступне

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

Але коли я використовую функцію strtotime (), як радить багато сайтів, я отримую дату часової позначки unix 1.01.1970. Будь-які ідеї, як я можу отримати правильну дату?


5
Вам потрібно розмістити те, що $_GET['start_date']містить.
JohnP

1
Я припускаю, що $_GET['start_date']це не часоваdate
марка,

Друга відповідь від DChaplin є більш доречною у цьому випадку
cw24

Це я зрозумів, намагаючись вибрати з таблиці, до якої я не приєднався ..
Коннор Ліч

Відповіді:


225

Тому що ви передаєте рядок як другий аргумент функції дати, яка має бути цілим числом.

дата рядка (рядок $ формат [, int $ timestamp = час ()])

Спробуйте 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

Якщо помилка виявляється під час будь-якого обчислення, двічі перевірте, чи не містить значення жодна кома (,). Значення повинні бути лише у форматі integer / float.


0

Потрібно встановити часовий пояс, використовуючи date_default_timezone_set ().


0

У моєму випадку це був ключ до sem_get

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

$ ключ повинен бути цілим, інакше ви отримаєте таку помилку:

Примітка 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.