[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: float + mysql
php-down
Как надо обработать флоат данные числа с плавующей точкой, чтобы в бд сохранить.
А то какая-то ошибка возникает. Видно из-за запятой в числах.



Спустя 1 минута, 34 секунды (29.02.2012 - 15:34) Winston написал(а):
Цитата (php-down @ 29.02.2012 - 14:32)
А то какая-то ошибка возникает

Какая?
Цитата (php-down @ 29.02.2012 - 14:32)
Видно из-за запятой в числах.

Скорее всего нужна точка вместо запятой. Или поставь тип поля в Mysql - Float Или же при записи в базу бери число в апострофы '3,14'

Спустя 6 минут, 48 секунд (29.02.2012 - 15:40) Guest написал(а):
Не помню какая ошибка
Но факт то что когда в апострафы начал втавлять то она пропала, но пи сохранялась равной 3
Тип поля float

Спустя 49 минут, 22 секунды (29.02.2012 - 16:30) Visman написал(а):
Разделитель целой и дробной части точка.
Используй тип
Цитата
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
``Неупакованное'' число с плавающей точкой. Ведет себя подобно столбцу CHAR, содержащему цифровое значение. Термин ``неупакованное'' означает, что число хранится в виде строки и при этом для каждого десятичного знака используется один символ. Разделительный знак десятичных разрядов, а также знак `-' для отрицательных чисел не учитываются в M (но место для них зарезервировано). Если атрибут D равен 0, величины будут представлены без десятичного знака, т.е. без дробной части. Максимальный интервал значений типа DECIMAL тот же, что и для типа DOUBLE, но действительный интервал для конкретного столбца DECIMAL может быть ограничен выбором значений атрибутов M и D. Если указан атрибут UNSIGNED, отрицательные значения недопустимы. Если атрибут D не указан, его значение по умолчанию равно 0. Если не указан M, его значение по умолчанию равно 10. В более ранних, чем MySQL 3.23, версиях аргумент M должен содержать в себе место для знака числа и десятичного знака.


Спустя 24 минуты, 13 секунд (29.02.2012 - 16:54) php-down написал(а):
$num=number_format($num, 6, '.', '');
Так чтоли?

Спустя 27 минут, 49 секунд (29.02.2012 - 17:22) Visman написал(а):
Цитата (Visman @ 29.02.2012 - 21:30)
Разделитель целой и дробной части точка.

Я это написал к тому, что в PHP и MySQL такое принято.
Откуда в числах запятые?

Спустя 47 минут, 15 секунд (29.02.2012 - 18:09) Guest написал(а):
Понятия не имею. После обработки я пихаю в мускул. И там гугаются.
$num=floatval($num);

Сейчас я сделал так
(float) $num
$num=number_format($num, 6, '.', '');
Может прокатит и без апострафов

Спустя 5 минут, 1 секунда (29.02.2012 - 18:14) Visman написал(а):
Код можно увидеть где идет принятие данных и их запись в базу.
А также текст ошибки.

UP
Хранение не целых чисел в MySQL
http://tarlyun.com/mysql/xranenie-ne-celyx-chisel-v-mysql/

Спустя 28 минут, 16 секунд (29.02.2012 - 18:42) Guest написал(а):
Вытягиваем из файла и суем в мускул.
В файле данные с точкой!
$context = array('http' => array ('header'=> 'Range: bytes=1024-', ),);
$xcontext = stream_context_create($context);
$data = file_get_contents($url, false, $xcontext); //read the file
$convert = explode("\n", $data, -1); //create array separate by new line
unset($convert[0]);

foreach ($convert as $k => $row)
{
list($ticker, $date, $open, $high, $low, $close, $volume, $waprice) = explode("\t", $row);
# $open=number_format($open, 6, '.', '');
# $high=number_format($high, 6, '.', '');
# $low=number_format($low, 6, '.', '');
# $close=number_format($close, 6, '.', '');
# $waprice=number_format($waprice, 6, '.', '');


if ($volume > 0)
$arr_val[$k] = "({$id}, {$comp_id}, '{$ticker}', '{$date}', {$open}, {$high}, {$low}, {$close}, {$waprice}, {$volume})";
}
$db->mysql_query("REPLACE INTO quotes (`id`, `comp_id`, `ticker`, `date`, `open`, `high`, `low`, `close`, `waprice`, `volume`) VALUES ".implode(', ', $arr_val).";");


Спустя 56 минут, 31 секунда (29.02.2012 - 19:39) Visman написал(а):
Ошибку какую пишет все-таки?

Для проверки перед запросом
$db->mysql_query("REPLACE INTO quotes (`id`, `comp_id`, `ticker`, `date`, `open`, `high`, `low`, `close`, `waprice`, `volume`) VALUES ".implode(', ', $arr_val).";");

сделай вывод самого запроса на экран, может сразу ясно будет что не так

die( "REPLACE INTO quotes (`id`, `comp_id`, `ticker`, `date`, `open`, `high`, `low`, `close`, `waprice`, `volume`) VALUES ".implode(', ', $arr_val).";");

Спустя 10 часов, 48 минут, 52 секунды (1.03.2012 - 06:28) Visman написал(а):
Забыл про безопасность напомнить и связанные с этим глюки wink.gif
Цитата
Не надо забывать, что переменные идущие в запрос должны обрабатываться на безопасность, если они пришли извне:
Строки через функцию mysql_real_escape_string($str)
Целые числа - (int)$number
Числа с плавающей точкой - (float)$number

Спустя 2 часа, 33 минуты, 10 секунд (1.03.2012 - 09:01) php-down написал(а):
Да в том-то и дело что когда я начинаю преобразование строки в флоат. Преобразует с запятой и при этом получается запрос с большим количеством запятых а это в свою очередь приводит к ошибке.
Сейчас делаю как на примере(без обработки) и вроде проканало.

Спустя 16 минут, 9 секунд (1.03.2012 - 09:17) Visman написал(а):
$num = '3.14';
$num = (float)$num;
echo $num;

->
3.14

и
$num = '3,14';
$num = (float)$num;
echo $num;

->
3


Все правильно работает.

Спустя 11 часов, 24 минуты, 48 секунд (1.03.2012 - 20:42) php-down написал(а):
Нет все же понять я не могу откуда там появляются эти запятые после преобразования (float)
  list($ticker, $date, $open, $high, $low, $close, $volume, $waprice) = explode("\t", $row);
# Обработка данных
$ticker=mysql_real_escape_string($ticker);
$date=mysql_real_escape_string($date);
$volume=(int)$volume;
$open=(float)$open;
$high=(float)$high;
$low=(float)$low;
$close=(float)$close;
$waprice=(float)$waprice;


REPLACE DELAYED INTO quotes (`id`, `comp_id`, `ticker`, `date`, `open`, `high`, `low`, `close`, `waprice`, `volume`) VALUES (44001, 44, '', '', 52,2, 53,49, 52,11, 52,8, 52,92, 840900), (44002, 44, '', '', 52,27, 52,86, 50,8, 51,2, 51,34, 1771300), (44003, 44, '', '', 51,05, 51,88, 50,26, 51,88, 50,89, 1323000), (44004, 44, '', '', 

Спустя 16 минут, 46 секунд (1.03.2012 - 20:59) Visman написал(а):
Это фантастика :blink:
Тогда извратимся
list($ticker, $date, $open, $high, $low, $close, $volume, $waprice) = explode("\t", $row);
# Обработка данных
$ticker=mysql_real_escape_string($ticker);
$date=mysql_real_escape_string($date);
$volume=(int)$volume;
$open=str_replace(',', '.', (float)$open);
$high=str_replace(',', '.', (float)$high);
$low=str_replace(',', '.', (float)$low);
$close=str_replace(',', '.', (float)$close);
$waprice=str_replace(',', '.', (float)$waprice);

Спустя 35 минут, 1 секунда (1.03.2012 - 21:34) php-down написал(а):
А апострофы в запросе нужны для числовых значений?

Спустя 7 часов, 47 минут, 42 секунды (2.03.2012 - 05:21) Visman написал(а):
Для чисел нет.
Апострофы только к именам полей/таблиц можно применять.
Для текста кавычки.

Спустя 4 часа, 49 минут, 30 секунд (2.03.2012 - 10:11) Winston написал(а):
Цитата (Visman @ 2.03.2012 - 04:21)
Апострофы только к именам полей/таблиц можно применять.

Не просто апострофы, а обратные апострофы (`) для имен.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.