Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Полезные советы и программы от пользователей нашего форума.

Модератор: Модераторы разделов

Stasroot1
Сообщения: 1030
ОС: Debian9

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение Stasroot1 »

sash-kan писал(а):
07.04.2012 17:15
QUOTE (Stasroot1 @ 7th April 2012 - в 14:33) *
так как мы быстрее 9,99 даже теоретически не перемещаемся
из спортсменов с вами не согласятся как минимум спринтеры, яхтсмены и велосипедисты·


Если предположить что система будет использоваться и другими спортсменами, бегунами, яхтсменами, велосепедистами, лыжниками, то да. Для всех из них может быть очень важен параметр высоты, мне например в гребле по понятным причинам его в БД хранить к примеру не надо. Однако если предположить что системой будут пользоваться и эти группы спортсменов тогда вместо 9,55 будет 99,55. разница в знак. Не очень представляю существенно или нет разница между 10958,155 и 99,99. это я к тому как считать скорость и вносить в БД или считать читая данные о расстоянии...

sash-kan писал(а):
07.04.2012 16:15
но есть дополнения:
1. в дальнейшем разработчику/пользователям может захотеться более одной «особости»
2. возможно, «особости» могут быть разными для разных пользователей одних и тех же данных (у спорстмена одна, у тренера — другая, у … гхм … ну, например, врача команды — третья)·
upd. а ещё тренеров может быть больше, чем один·


Все тут сказанное относится к реальной жизни и часто бывает, а как только будет предоставлен инструмент им скорее всего активно начнут пользоваться...
Но не смотря на это делать все сразу не стоит так как есть вероятность в попытках ускорить разработку намешать код в такую кучу, что потом другой программист посмотрев его скажет.... а не пошли бы вы лесом и скажет что лучше он с ноля все сделает сам... и будет прав. По этому делать из анализа тренировки программу по записи DVD болванок нет даже в мыслях. :-)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение drBatty »

Stasroot1 писал(а):
07.04.2012 19:21
Не очень представляю существенно или нет разница между 10958,155 и 99,99

несущественна.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Stasroot1
Сообщения: 1030
ОС: Debian9

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение Stasroot1 »

drBatty писал(а):
07.04.2012 16:09
Цитата(Stasroot1 @ 7th April 2012 - в 14:33) *
А групповую принадлежность формировать другими способами по той причине что тут кавардак... седня спортсмен у одного тренера завтра у другого после завтра тренер помер, снова новый тренер.... как то так

В любом случае, как я понимаю, в одной тренировке участвуют несколько спортсменов, и возможно, следует использовать отношение "многие ко многим". А может быть и нет. Всё зависит от того, является-ли "тренеровка с одним тренером и многими спортсменами" для вас единой и важной сущностью, или вас результаты по _тренировкам_ не интересуют, и важнее индивидуальный зачёт. Если последнее, то всё норм, и можно считать что одна тренировка являются для нас просто 10ю обособленными "тренировками", которые просто проводятся в одно время, в одном месте, и с одним тренером.

Думаю, что индивидуальный зачет будет пользоваться спросом намного чаще, а значит предложенная схема вполне подходит, ведь даже при такой схеме произвести сравнение разных тренировок будет, кстати, может и проще, так как запросы будут типа: выбрать данные соответствующие tid=100 and tid=258 and ... and tid=568 далее сравнить далее отрисовать. При этом tid может быть одного спортсмена или разных, одного дня/времени или сильно разных.

Спасибо сказали:
Stasroot1
Сообщения: 1030
ОС: Debian9

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение Stasroot1 »

На данный момент структура (добавлены второстепенные поля, индексы по некоторым) БД такая:


В графическом представлении выглядит так:


Данные для импорта в БД:


Теперь думаю можно строить табличку и закладывать туда данные из БД. Этим пожалуй теперь и займусь. Структура БД на данный момент по моему вполне подходит под текущие задачи. Если есть дополнения и поправки, буду очень благодарен.

Относительно "Особостей" ... тип BOOL пока поля с таким типом делать не буду по той причине что особости эи пока сильно не продуманы и на данный момент являются второстепенной задачей. Пока главное отрисовать график.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение sash-kan »

Stasroot1 писал(а):
10.04.2012 22:47
03_garmin2schema.sql.tar.gz
автоинкремент у первичного индекса таблицы devices забыли написать·

"decimal(10,0)" — почему fractional часть равна нулю?
ведь данные вида "192.9197235"·
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Stasroot1
Сообщения: 1030
ОС: Debian9

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение Stasroot1 »

sash-kan писал(а):
11.04.2012 13:30
03_garmin2schema.sql.tar.gz
автоинкремент у первичного индекса таблицы devices забыли написать·

исправлю в версии схемы №04. Схему выложу вечером. Сейчас на тренировку надо галопом...
sash-kan писал(а):
11.04.2012 13:30
"decimal(10,0)" — почему fractional часть равна нулю?
ведь данные вида "192.9197235"·

Спасибо за поправку, ошибка по невнимательности, хорошо что сейчас выявилась. Исправлю в 04 версии схемы. Так же в схему добавлю в таблицу trackpoints столбец Speed. Думаю все таки лучше один рас посчитать скорость и сохранить в БД.

На данный момент у меня получается вывести в табличном виде вот так:

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

Запрос SQL на данный момент:

Код: Выделить всё

SELECT users.uid, trainings.tid, laps.lid, laps.StartTime, laps.DistanceMeters, trackpoints.pid, trackpoints.DistanceMeters, trackpoints.time, trackpoints.Speed FROM users, trainings, laps, trackpoints WHERE users.uid = 1

В таблицу БД введены данные о начале первого круга с lid=1 и первого трекпоинта с tid=1 .. это позволяет увидить как повторяются и не отсеиваются повторяющиеся данные в полученной на данный момент таблице.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение sash-kan »

Stasroot1 писал(а):
11.04.2012 17:07
WHERE users.uid = 1
маловато будет·
а где же связь между таблицами? mysqld читать мысли не умеет·
надо ему помогать:
where users.uid = 1 and trainings.uid = users.uid and laps.tid = trainings.tid and trackpoints.lid = laps.lid
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Stasroot1
Сообщения: 1030
ОС: Debian9

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение Stasroot1 »

sash-kan писал(а):
11.04.2012 21:04
QUOTE (Stasroot1 @ 11th April 2012 - в 17:07) *
WHERE users.uid = 1
маловато будет·
а где же связь между таблицами? mysqld читать мысли не умеет·
надо ему помогать:
where users.uid = 1 and trainings.uid = users.uid and laps.tid = trainings.tid and trackpoints.lid = laps.lid

Спасибо, на осознавании...

Стал перепроверять типы данных в столбцах таблиц... естественно исправил "decimal(10,0)"
ведь данные вида "192.9197235"· на более правильное... и вот дошло дело до вставки в стлбцы соответствующих данных.
Определил формат так: "decimal(13,7)" вставляю так: 5,85 в итоге в БД хранится вот это: 5,0000000 вместо 5,8500000 или 5,85 Как решать данную проблему? Ведь импортируемые данные из xml файла в некоторых устройствах 6 знаков после запятой, а в некоторых 7. Соответственно те что с 7 - ю знаками будет вноситься в БД нормально, А те что с 6-ю знаками будут вноситься некорректно так как в данном случае все что после запятой переписывается 7-ю нулями.
Это первый вопрос, все таки скорее всего не сюда бы его задавать... :-( Найти толкового описания почему так происходит не смог пока.

Второй вопрос: я так понял, что decimal это СТРОКОВЫЙ тип хранения данных, а нам думаю правильнее хранить не строки и потом заниматься их преобразованиями в числа а сразу хранить числа, а значит другой тип для этого нужен. Смотрел в сторону FLOAT(7) но пока по не понятным мне причинам поведение схожее только с той разницей, что после запятой 3-и ноля. Правда так же как и с decimal при вставке 5,580 оно так и записывается а при вставке 5,58 оно записывается как 5,000. Что порекомендуете? Или хранить в decimal так как в PHP типизация вроде как не очень строгая...? Только как заставить записываться 5,58 вместо 5,0000000?

В связи с обозначенными проблемами выкладывать 04 схему пока не буду. Надо разобраться в чем проблема.
Спасибо сказали:
Stasroot1
Сообщения: 1030
ОС: Debian9

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение Stasroot1 »

Запрос :

Код: Выделить всё

SELECT users.uid, trainings.tid, laps.lid, laps.StartTime, laps.DistanceMeters, trackpoints.pid, trackpoints.DistanceMeters, trackpoints.time, trackpoints.Speed
FROM users, trainings, laps, trackpoints
WHERE users.uid =1
AND trainings.uid = users.uid
AND laps.tid = trainings.tid
AND trackpoints.lid = laps.lid
GROUP BY trainings.tid, laps.lid ASC , trackpoints.pid


Возвращает пустой результат.
Буду разбираться почему.
Спасибо сказали:
Stasroot1
Сообщения: 1030
ОС: Debian9

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение Stasroot1 »

Stasroot1 писал(а):
11.04.2012 22:46
Буду разбираться почему.


Скорее всего не правилен набор данных который приложен к схеме БД 03.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение sash-kan »

Stasroot1 писал(а):
11.04.2012 22:46
Возвращает пустой результат.
а какой смысл кроется в "group by"?

Stasroot1 писал(а):
11.04.2012 22:21
вставляю так: 5,85
десятичная точка нужна, а не запятая
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Stasroot1
Сообщения: 1030
ОС: Debian9

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение Stasroot1 »

sash-kan писал(а):
12.04.2012 14:40
а какой смысл кроется в "group by"?

Остаток экспериментов. Пустой результат что с группировкой, что без нее. С другим набором данных все работает вроде.
sash-kan писал(а):
12.04.2012 14:40
десятичная точка нужна, а не запятая

Да забыл про это. Спасибо.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение drBatty »

sash-kan писал(а):
07.04.2012 15:22
кстати, у garmin-а это реализовано через веб-интерфейс?
наверно, на жабе, да?
я, честно говоря, не представляю, как это можно сделать жабаскриптом, врочем я и не настоящий сварщик·

на JS можно, и наверное даже лучше. Но я тоже не знаю как (: За то знаю, как реализовать облачко на стороне сервера.
1. рисуем график без облачка
2. передаём его клиенту, но не просто как <img src='картинка' />, а как <form ...><input type='image' src='картинка' name='grph' /></form>
3. юзер кликает на какое-то место в графике
4. сервер получает 2 переменные: grph_x и grph_y, которые сигнализируют о том, в какое именно место ткнул юзер.
5. теперь сервер пририсовывает к графику облачко в нужном месте, и с нужными цифрами.
6. сервер снова отдаёт клиенту график, но теперь уже с облачком.
7. GOTO 2
Что лучше, JS vs PHP - зависит ессно от задачи. ИМХО лучше на php, если конечно у сервера хватит на это ресурсов. Ему это на самом деле проще, ибо скорость вы таки решили хранить в БД, и в PHP она доступна. Для JS придётся либо передавать таблицу скоростей для каждой точки, либо считать это всё на JS. И то и то - ИМХО не лучшая идея...

ЗЫЖ в рамках моей задачи нужно было нарисовать максимум с десяток графиков в день, что совершенно не нагружает сервер. Тут это основная функция, потому возможно на JS это делать более разумно. На JS график тоже можно нарисовать, мало того, я так даже делал. Однако это было года 3 назад, потому подробностей не помню. Помню только, что подробности можно подсмотреть например в проекте www.amule.org там это реализовано в web-интерфейсе (это GNU OpenSource)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение drBatty »

Stasroot1 писал(а):
10.04.2012 22:47
На данный момент структура (добавлены второстепенные поля, индексы по некоторым) БД такая:
§ 03_garmin2schema.sql.tar.gz ( 1.7 килобайт ) Кол-во скачиваний: 1

Код: Выделить всё

FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
    Малое число с плавающей точкой обычной точности. Допустимые значения: от -3,402823466E+38 до -1,175494351E-38, 0, и от 1,175494351E-38 до 3,402823466E+38. Если указан атрибут UNSIGNED, отрицательные значения недопустимы. Атрибут M указывает количество выводимых пользователю знаков, а атрибут D - количество разрядов, следующих за десятичной точкой. Обозначение FLOAT без указания аргументов или запись вида FLOAT(X), где X <=24 справедливы для числа с плавающей точкой обычной точности.
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
    Число с плавающей точкой удвоенной точности нормального размера. Допустимые значения: от -1,7976931348623157E+308 до -2,2250738585072014E-308, 0, и от 2,2250738585072014E-308 до 1,7976931348623157E+308. Если указан атрибут UNSIGNED, отрицательные значения недопустимы. Атрибут M указывает количество выводимых пользователю знаков, а атрибут D - количество разрядов, следующих за десятичной точкой. Обозначение DOUBLE без указания аргументов или запись вида FLOAT(X), где 25 <= X <= 53 справедливы для числа с плавающей точкой двойной точности.
DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL]
REAL[(M,D)] [UNSIGNED] [ZEROFILL]
    Данные обозначения являются синонимами для DOUBLE.
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
    ``Неупакованное'' число с плавающей точкой. Ведет себя подобно столбцу CHAR, содержащему цифровое значение. Термин ``неупакованное'' означает, что число хранится в виде строки и при этом для каждого десятичного знака используется один символ. Разделительный знак десятичных разрядов, а также знак `-' для отрицательных чисел не учитываются в M (но место для них зарезервировано). Если атрибут D равен 0, величины будут представлены без десятичного знака, т.е. без дробной части. Максимальный интервал значений типа DECIMAL тот же, что и для типа DOUBLE, но действительный интервал для конкретного столбца DECIMAL может быть ограничен выбором значений атрибутов M и D. Если указан атрибут UNSIGNED, отрицательные значения недопустимы. Если атрибут D не указан, его значение по умолчанию равно 0. Если не указан M, его значение по умолчанию равно 10. В более ранних, чем MySQL 3.23, версиях аргумент M должен содержать в себе место для знака числа и десятичного знака.

http://www.mysql.ru/docs/man/Column_types.html
вот лично я совершенно НЕ понимаю, зачем вам понадобился тип DECIMAL??? Ну какие он нам плюсы-то даёт??? Сплошные минусы. У нас основная задача - получить выборку значений _каждой_ точки графика, а затем их _обработать_ _математически_. Не важно где они будут обрабатываться, важно, что нам по любому их придётся переводить во float, ибо в таком виде данные обрабатывались разве что калькуляторами из 80х годов прошлого века... Ну а тип FLOAT решает все ваши надуманные проблемы с точностью и диапазоном.
Stasroot1 писал(а):
11.04.2012 17:07
Запрос SQL на данный момент:
Код
SELECT users.uid, trainings.tid, laps.lid, laps.StartTime, laps.DistanceMeters, trackpoints.pid, trackpoints.DistanceMeters, trackpoints.time, trackpoints.Speed FROM users, trainings, laps, trackpoints WHERE users.uid = 1

OH SHI~
это-то ещё зачем? вам надо сделать выборку из 100500 точек, так зачем всё валить в одну кучу???

Код: Выделить всё

SELECT tid,did FROM `trainings` WHERE uid='$uid'

тут мы получаем список всех тренировок спортсмена, из которых этот спортсмен выбирает нужную ему. Получив выборку можно добавить удобочитаемые метки времени и т.д.
Когда тренировка выбрана, выбираем нужный круг и получаем данные о круге:

Код: Выделить всё

SELECT * FROM `trackpoints` WHERE lid='$lid' ORDER BY `time`

(кстати время лучше НЕ называть time, ибо это ключевое слово как в SQL, так и в PHP. Лучше назвать время point_time, что-бы движки не путались)
Я не очень понимаю, как спортсмен может задать все необходимые данные для вашего запроса за _один_ шаг. Очевидно это невозможно. Потому ваш километровый запрос не нужен.

К вопросу о стилях: поубивал-бы за такие километровые строчки. Работать с таким кодом очень тяжело, к тому-же, вы всегда можете оформить запрос несколькими короткими строчками, используя отступы для удобочитаемости.
Stasroot1 писал(а):
11.04.2012 22:46
GROUP BY trainings.tid, laps.lid ASC , trackpoints.pid


Возвращает пустой результат.
Буду разбираться почему.

очевидно потому, что GROUP BY не сортирует, а группирует результаты, что вам очевидно пока не нужно. Для сортировки нужно использовать ORDER BY, кроме того, не вижу никакого смысла сортировать/группировать это всё по trainings.tid, laps.lid, ведь они у нас уникальные для выборки.
Про сортировку по trackpoints.pid я уже говорил - pid это _искусственное_ значение, которое вводится на самом деле "от балды". Сортировать таки надо по времени, когда был снят данный замер. Бояться, что есть такое-же время на других кругах не нужно - мы-же делаем выборку по одному уникальному кругу. И даже если и не по одному, то нам и надо, что-бы точки в графике лежали одна под другой, с равной координатой на оси времени (если на одном графике мы захотим нарисовать два круга сразу).
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Stasroot1
Сообщения: 1030
ОС: Debian9

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение Stasroot1 »

drBatty писал(а):
13.04.2012 10:44
ЗЫЖ в рамках моей задачи нужно было нарисовать максимум с десяток графиков в день, что совершенно не нагружает сервер. Тут это основная функция, потому возможно на JS это делать более разумно. На JS график тоже можно нарисовать, мало того, я так даже делал. Однако это было года 3 назад, потому подробностей не помню. Помню только, что подробности можно подсмотреть например в проекте www.amule.org там это реализовано в web-интерфейсе (это GNU OpenSource)


Думаю что на php делать графики не очень правильно и отправлять картинку по двум причинам: порождает большой трафик, из за первого замедляется отрисовка облачка, грубо говоря облачко должно передвигаться и быстро показывать значение в точке, буквально за мышкой и без щелчков последней. Хотя облачко это грубо говоря - фича, которая может подождать. Ведь рисуя график мы можем и должны отрисовать шкалу по осям... а из нее уже понятно какая скорость/пульс и какое время/расстояние.

Относительно того, что вы написали далее отпишу свои мысли чуть позже, сейчас надо на обед идти. В них заметил много конструктива и интересного. Спасибо.
Спасибо сказали:
Stasroot1
Сообщения: 1030
ОС: Debian9

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение Stasroot1 »

drBatty писал(а):
13.04.2012 11:19
Цитата(Stasroot1 @ 10th April 2012 - в 22:47) *
На данный момент структура (добавлены второстепенные поля, индексы по некоторым) БД такая:
§ 03_garmin2schema.sql.tar.gz ( 1.7 килобайт ) Кол-во скачиваний: 1
Код
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
Малое число с плавающей точкой обычной точности. Допустимые значения: от -3,402823466E+38 до -1,175494351E-38, 0, и от 1,175494351E-38 до 3,402823466E+38. Если указан атрибут UNSIGNED, отрицательные значения недопустимы. Атрибут M указывает количество выводимых пользователю знаков, а атрибут D - количество разрядов, следующих за десятичной точкой. Обозначение FLOAT без указания аргументов или запись вида FLOAT(X), где X <=24 справедливы для числа с плавающей точкой обычной точности.
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
Число с плавающей точкой удвоенной точности нормального размера. Допустимые значения: от -1,7976931348623157E+308 до -2,2250738585072014E-308, 0, и от 2,2250738585072014E-308 до 1,7976931348623157E+308. Если указан атрибут UNSIGNED, отрицательные значения недопустимы. Атрибут M указывает количество выводимых пользователю знаков, а атрибут D - количество разрядов, следующих за десятичной точкой. Обозначение DOUBLE без указания аргументов или запись вида FLOAT(X), где 25 <= X <= 53 справедливы для числа с плавающей точкой двойной точности.
DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL]
REAL[(M,D)] [UNSIGNED] [ZEROFILL]
Данные обозначения являются синонимами для DOUBLE.
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
``Неупакованное'' число с плавающей точкой. Ведет себя подобно столбцу CHAR, содержащему цифровое значение. Термин ``неупакованное'' означает, что число хранится в виде строки и при этом для каждого десятичного знака используется один символ. Разделительный знак десятичных разрядов, а также знак `-' для отрицательных чисел не учитываются в M (но место для них зарезервировано). Если атрибут D равен 0, величины будут представлены без десятичного знака, т.е. без дробной части. Максимальный интервал значений типа DECIMAL тот же, что и для типа DOUBLE, но действительный интервал для конкретного столбца DECIMAL может быть ограничен выбором значений атрибутов M и D. Если указан атрибут UNSIGNED, отрицательные значения недопустимы. Если атрибут D не указан, его значение по умолчанию равно 0. Если не указан M, его значение по умолчанию равно 10. В более ранних, чем MySQL 3.23, версиях аргумент M должен содержать в себе место для знака числа и десятичного знака.

http://www.mysql.ru/docs/man/Column_types.html
вот лично я совершенно НЕ понимаю, зачем вам понадобился тип DECIMAL??? Ну какие он нам плюсы-то даёт??? Сплошные минусы. У нас основная задача - получить выборку значений _каждой_ точки графика, а затем их _обработать_ _математически_. Не важно где они будут обрабатываться, важно, что нам по любому их придётся переводить во float, ибо в таком виде данные обрабатывались разве что калькуляторами из 80х годов прошлого века... Ну а тип FLOAT решает все ваши надуманные проблемы с точностью и диапазоном.


Спасибо за уточнение, меня как рас это очень интересовало и этот интерес я выражал, как рас мне тоже стало представляться что decimal нам не подходит... вот тут я ставил этот вопрос:

Stasroot1 писал(а):
11.04.2012 22:21
Второй вопрос: я так понял, что decimal это СТРОКОВЫЙ тип хранения данных, а нам думаю правильнее хранить не строки и потом заниматься их преобразованиями в числа а сразу хранить числа, а значит другой тип для этого нужен. Смотрел в сторону FLOAT(7) но пока по не понятным мне причинам поведение схожее только с той разницей, что после запятой 3-и ноля. Правда так же как и с decimal при вставке 5,580 оно так и записывается а при вставке 5,58 оно записывается как 5,000. Что порекомендуете? Или хранить в decimal так как в PHP типизация вроде как не очень строгая...?

Т.е. по сути вы ответили на мой вопрос, Естесственно мой вопрос возник после внимательного прочтения документации по типам данных MySQL. Спасибо.
Как рас из за этого я и не выкладывал пока схему БД №04. Сегодня выложу.

drBatty писал(а):
13.04.2012 11:19
Цитата(Stasroot1 @ 11th April 2012 - в 17:07) *
Запрос SQL на данный момент:
Код
SELECT users.uid, trainings.tid, laps.lid, laps.StartTime, laps.DistanceMeters, trackpoints.pid, trackpoints.DistanceMeters, trackpoints.time, trackpoints.Speed FROM users, trainings, laps, trackpoints WHERE users.uid = 1

OH SHI~
это-то ещё зачем? вам надо сделать выборку из 100500 точек, так зачем всё валить в одну кучу???

Объясняю почему в кучу:

drBatty писал(а):
29.03.2012 21:46
1. начните с создания БД, забейте туда как-нибудь какие-нибудь цифры.
2. отразите числа из БД в виде таблицы
3. отразите таблицу в виде графика

Пункт первый почти выполнен, типы данных причешу... и выкладываю БД сюда. Также приложу дамп данных к ней, т.е. пункт первый будет реализован.
Пункт второй реализован пока так:
Stasroot1 писал(а):
11.04.2012 17:07
На данный момент у меня получается вывести в табличном виде вот так:
Уменьшено до 90%
Прикрепленное изображение
953 x 797 (43.06 килобайт)

Естественно таблица уже рисуется нормально после поправки sash-kan... Собственно для того чтобы отрисовать такую таблицу и сделан такой запрос к БД. Поскольку данных мало. Естественно в более готовом варианте будет разветвление на подпункты...

Пункт три пока даже не приступал. но спасибо за наводку.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение drBatty »

Stasroot1 писал(а):
13.04.2012 13:12
порождает большой трафик

ну ещё посчитать надо, что будет "большим трафиком": посылать на клиент картинку в несколько килобайт, или таблицу чисел на 100500 точек. ИМХО объёмы будут примерно сопоставимые. PNG это не просто картинка, это _сжатая_ картинка, причём это график, т.е. просто чёрный(белый) квадрат, который ничего не весит. Вот например мой график, на котором 6 разноцветных графиков + 2 шкалы + легенда на 1100х500 точек занимает 13.5 килобайт.
Stasroot1 писал(а):
13.04.2012 13:12
из за первого замедляется отрисовка облачка

тоже не факт - JS очень медленный. Во первых потому-что это скрипт, во вторых из-за драконовских ограничений безопасности. Равнять его с ассемблерной программой оптимизированной под конкретную архитектуру попросту невозможно. Что будет быстрее - сказать вот так на вскидку сложно...
Stasroot1 писал(а):
13.04.2012 13:12
грубо говоря облачко должно передвигаться и быстро показывать значение в точке, буквально за мышкой и без щелчков последней.

а вот такое конечно придётся реализовывать у клиента. Причём у меня такое подозрение, что JS на это уже не хватит. Хотя я тоже не сварщик (:
Но тут, ИМХО, придётся что-то такое на HTML5 изображать... Если честно - никогда такого не делал...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение drBatty »

Stasroot1 писал(а):
13.04.2012 14:11
Объясняю почему в кучу:
1. начните с создания БД, забейте туда как-нибудь какие-нибудь цифры.
2. отразите числа из БД в виде таблицы


ну да, но в любом случае, надо это всё поэтапно делать - т.е.
1. сначала спортсмен авторизируется, и после этого мы имеем дело только с _одним_ спортсменом, и ни о какой сортировке по спортсменам речи быть не может. uid у нас жёстко приколочен.
2. потом спортсмен выбирает тренировку, опять таки после этого тренировка жёстко задана, и не меняется.
3. и затем спортсмен выбирает нужный круг. Опять-таки, теперь у нас жёстко задан lid, и только он нам и нужен.
Это базовая схема, она конечно может быть изменена для каких-то дополнительных фич (ну типа тренер может смотреть график сразу нескольких спортсменов), но это уже потом. Сейчас у нас есть уникальный lid, который нам и нужен для выборки из таблицы trackpoints - у нас там есть _вся_ нужная информация для _каждой_ _уникальной_ точки. Брать все точки с заданным lid конечно не надо, потому условие надо заменить на WHERE lid='$lid' AND time>='$min_time' AND time<='max_time'
Заодно почитайте, как правильно сравнивать типы DATETIME: http://dev.mysql.com/doc/refman/5.1/en/com...perator_between
Лично я храню даты просто как INT(11) (число сек. с 01.01.1970), потому могу их сравнивать как обычные целые числа. Ну а раз вы решили задействовать тип DATETIME... Кстати тоже - зачем вам это надо? От него есть польза, правда обычно сомнительная: можно не задавать значение TIMESTAMP, тогда оно автоматом задаётся сервером (время выполнения запроса). Но вам оно не надо, т.ч. готовьтесь ещё и изучить php функцию date(), для перевода времени из вашего формата в секунды ;)
(хотя её так и так понадобится изучить - что-бы переводить секунды в дату)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Stasroot1
Сообщения: 1030
ОС: Debian9

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение Stasroot1 »

drBatty писал(а):
13.04.2012 15:18
ну да, но в любом случае, надо это всё поэтапно делать - т.е.
1. сначала спортсмен авторизируется, и после этого мы имеем дело только с _одним_ спортсменом, и ни о какой сортировке по спортсменам речи быть не может. uid у нас жёстко приколочен.

Да.
drBatty писал(а):
13.04.2012 15:18
2. потом спортсмен выбирает тренировку, опять таки после этого тренировка жёстко задана, и не меняется.

На данном этапе да. Но в последующем спортсмен должен иметь возможность выбора набора тренировок.
drBatty писал(а):
13.04.2012 15:18
3. и затем спортсмен выбирает нужный круг. Опять-таки, теперь у нас жёстко задан lid, и только он нам и нужен.

Нет. Так как ему надо посмотреть: график набора кругов, График по кругам в отдельности. Сравнить наложением одинаковые по сути (не по времени) круги, которые он сам выбирает для сравнения. (т.е. круги за тренировку нумеруются грубо 1, 2, 3, , ...,58. Из них 25 кругов в разное время но с одинаковой сутью, например пройти 100 метров. т.е. получется 25 кругов по 100 метров. Их надо иметь возможность сравнить. Но это на следующие этапы разработки.
drBatty писал(а):
13.04.2012 15:18
Сейчас у нас есть уникальный lid, который нам и нужен для выборки из таблицы trackpoints - у нас там есть _вся_ нужная информация для _каждой_ _уникальной_ точки. Брать все точки с заданным lid конечно не надо, потому условие надо заменить на WHERE lid='$lid' AND time>='$min_time' AND time<='max_time'

Только наверное не lid а все таки tid... состоящий из набора lid. Но по сути да. Привязку в сессию PHP наверное лучше закладывать...
drBatty писал(а):
13.04.2012 15:18
Заодно почитайте, как правильно сравнивать типы DATETIME: http://dev.mysql.com/doc/refman/5.1/en/com...perator_between
Лично я храню даты просто как INT(11) (число сек. с 01.01.1970), потому могу их сравнивать как обычные целые числа. Ну а раз вы решили задействовать тип DATETIME... Кстати тоже - зачем вам это надо? От него есть польза, правда обычно сомнительная: можно не задавать значение TIMESTAMP, тогда оно автоматом задаётся сервером (время выполнения запроса). Но вам оно не надо, т.ч. готовьтесь ещё и изучить php функцию date(), для перевода времени из вашего формата в секунды ;)

Тоже думал на эту тему. Спасибо за подсказку, наверное действительно проще хранить TIMESTAMP форматом. А в этот формат переводить время при импорте из XML файлов тренировок и потом писать его в point_time (в схеме поправлю спасибо за напоминание о ключевых словах).

Кстати, date() в PHP4 пользовался не рас, тут проблем не должно возникнуть. Там вроде все понятно. :-) (нашел чему радоваться :-( ) За ссылки спасибо, внимательно почитаю. Сейчас галопом на тренировку. :-)


drBatty писал(а):
13.04.2012 14:56
Цитата(Stasroot1 @ 13th April 2012 - в 13:12) *
грубо говоря облачко должно передвигаться и быстро показывать значение в точке, буквально за мышкой и без щелчков последней.

а вот такое конечно придётся реализовывать у клиента. Причём у меня такое подозрение, что JS на это уже не хватит. Хотя я тоже не сварщик (:
Но тут, ИМХО, придётся что-то такое на HTML5 изображать... Если честно - никогда такого не делал...


Я вообще думаю что может на HTML5 и сделать, но я сварочный аппарат видел у соседа в гараже. :-( Кстати HTML5 может и не панацея... я так понимаю формат еще не совсем обкатанный. Но вообще для начала надо просто получиь данные из БД и отрисовать график. Пусть пока на php.
Спасибо сказали:
Stasroot1
Сообщения: 1030
ОС: Debian9

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение Stasroot1 »

Вчера не выложил, выкладываю сегодня схему и импортируемые данные. И графическое представление БД.
Схема:


Данные:


Графическое представление:


Убежал на тренировку.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:
Stasroot1
Сообщения: 1030
ОС: Debian9

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение Stasroot1 »

Доброго времени суток! Не могу понять по какой причине вот такой код:

Код: Выделить всё

<?php
$sql = "SELECT tid FROM trainings WHERE uid = '$uid'";
$result = mysql_query($sql);

echo '<TABLE CELLSPACING=0 BORDER=0>
    <TBODY>
        <TR>
            <TD STYLE="border-top: 1px solid #000000; border-bottom: 0px solid #000000; border-left: 1px solid #000000; border-right: 0px solid #000000" COLSPAN=9 WIDTH=60 HEIGHT=17 ALIGN=CENTER VALIGN=MIDDLE><FONT SIZE=4>Идентификатор тренировки (tid)</FONT></TD>
            <TD STYLE="border-top: 1px solid #000000; border-bottom: 0px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000" COLSPAN=9 WIDTH=80 HEIGHT=17 ALIGN=CENTER VALIGN=MIDDLE><FONT SIZE=4>Дата и время тренировки</FONT></TD>
        </TR>
      ';
while ($row_tid = mysql_fetch_array($result, MYSQL_NUM)) {
echo '        <TR>
            <TD STYLE="border-top: 1px solid #000000; border-bottom: 0px solid #000000; border-left: 1px solid #000000; border-right: 0px solid #000000" COLSPAN=9 WIDTH=60 HEIGHT=17 ALIGN=CENTER VALIGN=MIDDLE><FONT SIZE=4>'.$row_tid[0].'</FONT></TD>
            <TD STYLE="border-top: 1px solid #000000; border-bottom: 0px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000" COLSPAN=9 WIDTH=80 HEIGHT=17 ALIGN=CENTER VALIGN=MIDDLE><FONT SIZE=4>(не реализовано)</FONT></TD>
        </TR>';
                                };
echo '        <TR>
            <TD STYLE="border-top: 1px solid #000000; border-bottom: 0px solid #000000; border-left: 0px solid #000000; border-right: 0px solid #000000" COLSPAN=9 WIDTH=60 HEIGHT=17 ALIGN=CENTER VALIGN=MIDDLE><FONT SIZE=4></FONT></TD>
            <TD STYLE="border-top: 1px solid #000000; border-bottom: 0px solid #000000; border-left: 0px solid #000000; border-right: 0px solid #000000" COLSPAN=9 WIDTH=80 HEIGHT=17 ALIGN=CENTER VALIGN=MIDDLE><FONT SIZE=4></FONT></TD>
        </TR>
    </TBODY>
</TABLE>
     ';
echo'
<form action="form_select_trainings.php" method="POST">
  <p><b>Пожалуйста выбирите одну тренирвку для ее дальнейшего просмотра.</b></p>';
while ($row_tid = mysql_fetch_array($result, MYSQL_NUM)) {
echo '<p><input type="radio" name="tid" value="'.$row_tid[0].'">'.$row_tid[0].'<Br></p>';
                        };
echo '<p><input type="submit" value="Смотреть"></p>
 </form>';

?>
Не работает так как я хочу, ясное дело что он не телепат, просто не могу понять почему он не работает. Не работает конкретно последний цикл while по 28 строке. Этот код выводит таблицу с номерами тренировок пренадлежащих конкретному пользователю (Это он делает) и должен выводить под таблицей форму с номерами тренировок (это он НЕ ДЕЛАЕТ)

Однако, вот такой код:

Код: Выделить всё

<?php
$sql = "SELECT tid FROM trainings WHERE uid = '$uid'";
$result = mysql_query($sql);

echo '<TABLE CELLSPACING=0 BORDER=0>
    <TBODY>
        <TR>
            <TD STYLE="border-top: 1px solid #000000; border-bottom: 0px solid #000000; border-left: 1px solid #000000; border-right: 0px solid #000000" COLSPAN=9 WIDTH=60 HEIGHT=17 ALIGN=CENTER VALIGN=MIDDLE><FONT SIZE=4>Идентификатор тренировки (tid)</FONT></TD>
            <TD STYLE="border-top: 1px solid #000000; border-bottom: 0px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000" COLSPAN=9 WIDTH=80 HEIGHT=17 ALIGN=CENTER VALIGN=MIDDLE><FONT SIZE=4>Дата и время тренировки</FONT></TD>
        </TR>
      ';
while ($row_tid = mysql_fetch_array($result, MYSQL_NUM)) {
echo '        <TR>
            <TD STYLE="border-top: 1px solid #000000; border-bottom: 0px solid #000000; border-left: 1px solid #000000; border-right: 0px solid #000000" COLSPAN=9 WIDTH=60 HEIGHT=17 ALIGN=CENTER VALIGN=MIDDLE><FONT SIZE=4>'.$row_tid[0].'</FONT></TD>
            <TD STYLE="border-top: 1px solid #000000; border-bottom: 0px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000" COLSPAN=9 WIDTH=80 HEIGHT=17 ALIGN=CENTER VALIGN=MIDDLE><FONT SIZE=4>(не реализовано)</FONT></TD>
        </TR>';
                                };
echo '        <TR>
            <TD STYLE="border-top: 1px solid #000000; border-bottom: 0px solid #000000; border-left: 0px solid #000000; border-right: 0px solid #000000" COLSPAN=9 WIDTH=60 HEIGHT=17 ALIGN=CENTER VALIGN=MIDDLE><FONT SIZE=4></FONT></TD>
            <TD STYLE="border-top: 1px solid #000000; border-bottom: 0px solid #000000; border-left: 0px solid #000000; border-right: 0px solid #000000" COLSPAN=9 WIDTH=80 HEIGHT=17 ALIGN=CENTER VALIGN=MIDDLE><FONT SIZE=4></FONT></TD>
        </TR>
    </TBODY>
</TABLE>
     ';

$sql = "SELECT tid FROM trainings WHERE uid = '$uid'";
$result = mysql_query($sql);
echo'
<form action="form_select_trainings.php" method="POST">
  <p><b>Пожалуйста выбирите одну тренирвку для ее дальнейшего просмотра.</b></p>';
while ($row_tid = mysql_fetch_array($result)) {
echo '<p><input type="radio" name="tid" value="'.$row_tid[0].'">'.$row_tid[0].'<Br></p>';
                        };
echo '<p><input type="submit" value="Смотреть"></p>
 </form>';

?>
Работает как надо, т.е. после таблицы выводит форму выбора тренировки с нужным tid... Разница только в Том, что перед последним циклом (цикл формирует элементы формы для выбора) вновь выполнен запрос к БД, получен результат и из него сделан mysql_fetch_array() в ходе цикла.

Так и должно быть? Мне кажется что есть какой то другой способ отрисовать циклом форму, так, чтобы не повторять один и тот же запрос к БД.
Пожалуйста подскажите как лучше сделать.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение drBatty »

Stasroot1 писал(а):
18.04.2012 09:56
Не работает так как я хочу, ясное дело что он не телепат, просто не могу понять почему он не работает. Не работает конкретно последний цикл while по 28 строке. Этот код выводит таблицу с номерами тренировок пренадлежащих конкретному пользователю (Это он делает) и должен выводить под таблицей форму с номерами тренировок (это он НЕ ДЕЛАЕТ)

очевидно потому, что вы УЖЕ прочитали всю выборку из СУБД, функция mysql_fetch_array() вернула вам FALSE (в первом цикле), и теперь ВСЕГДА будет возвращать FALSE. (во втором). Проще всего загрузить строчки в массив, а потом уже работать с этим массивом. Hint: используйте цикл foreach для работы с php-массивом.

И да, уберите пожалуйста ваш CSS в отдельный файл style.css, это я про STYLE="..."

Ну и пишите echo "<tag parametr='777' />"; Такие кавычки помогут вставить вместо 777 какую-нить php переменную.

ЗЫЖ по уму и HTML тоже лучше-бы убрать куда-нить...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Stasroot1
Сообщения: 1030
ОС: Debian9

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение Stasroot1 »

drBatty писал(а):
18.04.2012 10:19
очевидно потому, что вы УЖЕ прочитали всю выборку из СУБД, функция mysql_fetch_array() вернула вам FALSE (в первом цикле)

Т.е. эта функция циклом прочитала все указатели из выборки БД пока не получила пустое значение? А соответственно как получила так сразу FALSE и как следствие остановка цикла, так? И значение получается после обработки циклом пустое?
Я все правильно понимаю? Я как то так и чувствовал,что где то так может и происходить...

drBatty писал(а):
18.04.2012 10:19
Проще всего загрузить строчки в массив, а потом уже работать с этим массивом. Hint: используйте цикл foreach для работы с php-массивом.


Вот интуитивно что то такое и хотелось сделать, поместить в массив, за hint спасибо отдельное.
drBatty писал(а):
18.04.2012 10:19
И да, уберите пожалуйста ваш CSS в отдельный файл style.css, это я про STYLE="..."

Сделаю но позже.
drBatty писал(а):
18.04.2012 10:19
Ну и пишите echo "<tag parametr='777' />"; Такие кавычки помогут вставить вместо 777 какую-нить php переменную.

Код: Выделить всё

# А в чем принципиальная разница между:
$name = 'masha';
echo 'её имя - '.$name.' и это красивое имя!';
#и этим:
echo "её имя - $name и это красивое имя!";

Только в ненужности применять конкатенацию, меньше вероятность ошибки? Да?

HTML - отделить... пока не умею.

Спасибо за подсказки!
Спасибо сказали:
Stasroot1
Сообщения: 1030
ОС: Debian9

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение Stasroot1 »

hint вроде освоил. теперь работает так как мне надо.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение drBatty »

по поводу конкатенации: это тоже ОПЕРАЦИЯ, типа умножения или сложения. Вот только сложные выражения выглядят убого(надо быть богом, чтобы понять). В принципе - вопрос стиля, и уважения тех, кто это читает... про CSS - тоже.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Stasroot1
Сообщения: 1030
ОС: Debian9

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение Stasroot1 »

drBatty писал(а):
18.04.2012 18:57
по поводу конкатенации: это тоже ОПЕРАЦИЯ, типа умножения или сложения. Вот только сложные выражения выглядят убого(надо быть богом, чтобы понять). В принципе - вопрос стиля, и уважения тех, кто это читает... про CSS - тоже.


Да хорошо, я постараюсь исправить эти моменты, и привести код в более читаемый вид. И выведу стили в отдельный файл. По поводу конкатенации: если ' заменить на " то как рас стилевые элементы в строке получаются коментами так как там встречается знак #... Конкатенацию тоже постараюсь убрать по максимуму.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение drBatty »

Stasroot1 писал(а):
19.04.2012 08:40
По поводу конкатенации: если ' заменить на " то как рас стилевые элементы в строке получаются коментами так как там встречается знак #...

1. код "#" комментарием НЕ считается, т.к. # тут не просто так, а в кавычках.
2. эти # в стилях всё равно исчезнут, ибо вы их вынесете в отдельный файл.
3. _хороший_ текстовый редактор сам определит, что к чему. Например VIM код

Код: Выделить всё

#АА00АА

в контексте CSS считает непонятно чем, в отличие от

Этот код в контексте CSS VIM считает валидным числом.
(видите разницу? просто в первом коде "А" русская.)
Stasroot1 писал(а):
19.04.2012 08:40
Конкатенацию тоже постараюсь убрать по максимуму.

конкатенация приводит к появлению трудноуловимых и непонятных ошибок.
например вот такой пример:

Код: Выделить всё

echo "2+2=". 2+2 ."<br />\n";

на первый взгляд - ничего особенного, ну подумаешь, 2+2=4. Очевидно же!
Однако, если обратится к таблице приоритетов, мы узнаём, что приоритет операции "точка" равен приоритету сложения, а это означает, что данный код ВООБЩЕ НЕИЗВЕСТНО КАК будет работать. У меня например этот код даёт просто 4, а 2+2= проглатывает, и оно не выводится вовсе. Видимо потому, что php преобразует "2+2=" к эквивалентному ЧИСЛУ ноль, а потом считает выражение 02+2, получает 4, и добавляет к этому "<br />\n". Однако у вас может получится совсем иной результат. Мало того, в реальной жизни результат работы может быть разным даже при одинаковых входных данных!
Решение очевидно:

Код: Выделить всё

$x = 2 + 2;
echo "2+2=$x<br />\n"

вот тут всё просто и однозначно.
Вы наверное подумали, что просто не надо мешать сложение с точкой? Если-бы... Проблема в том, что == тоже ОПЕРАТОР, и его тоже нельзя просто так взять, и с чем-то смешать. Точнее можно, вот только получится почти на 100% совсем не то, что вы ожидаете. Просто "равно" (=) тоже оператор, а вовсе не конструкция языка, этот факт очевидно весьма радует уже не первое поколение быдлокодеров, которых так много среди php-программеров. Особенно радует то, что в отличие от C/C++, для php существуют ещё и _исключения_ из правил, вроде
Замечание:
Несмотря на то, что оператор = имеет низший приоритет, чем большинство остальных операторов, PHP все равно позволяет использовать следующую конструкцию: if (!$a = foo()), которая присваивает переменной $a результат выполнения функции foo().

Если честно - лично я об этом впервые слышу :(
Stasroot1 писал(а):
18.04.2012 14:29
Т.е. эта функция циклом прочитала все указатели из выборки БД пока не получила пустое значение? А соответственно как получила так сразу FALSE и как следствие остановка цикла, так? И значение получается после обработки циклом пустое?

1. сначала СУБД создаёт специальную область данных в памяти, в которой хранятся все выбранные строчки.
2. потом СУБД создаёт указатель, который указывает на первую строчку в области памяти из (1)
3. функция mysql_fetch_...() возвращает php-массив, в котором лежит указываемя указателем (2) строчка из (1).
4. И перемещает указатель на след. строку, если она есть. Иначе указатель (2) перемещается "в никуда", и след. функция mysql_fetch_...() вернёт FALSE.
Результат работы функции (3) записывается в переменную $row_tid.
После чего эта переменная преобразуется в TRUE/FALSE. Ну если получается FALSE от функции, то естественно получается FALSE и после преобразования. В противном случае получается от функции массив, и если этот массив не пустой, получается TRUE, а если массив пустой, получается FALSE, и цикл останавливается, хотя и не должен. Последний случай в данном конкретном случае невозможен, потому-то у нас всё работает. Правда, прочитать область памяти (1) можно только один раз...

PS: сложновато? Угу. php - это один из самых сложных, и запутанных языков программирования. :(
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение drBatty »

PPS: да, есть ещё в php операторы === и !==
их надо применять во всех сомнительных случаях. Например пустой массив равен (==) FALSE, но не эквивалентен (!==).
потому следует писать

Код: Выделить всё

while(($row_tid = mysql_fetch_array($result, MYSQL_NUM)) !== FALSE)

если вы не уверенны в том, что ваша функция не может вернуть что-то, что преобразуется в FALSE. В принципе - эта может. Зависит от таблицы, если в строке нет столбцов, то код работать не будет. Может такое быть, или нет - решайте сами...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Stasroot1
Сообщения: 1030
ОС: Debian9

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение Stasroot1 »

Спасибо за подробности и советы, я постараюсь их впитать и усвоить, в последствии применять где нужно.
Да сложновато. А я и не думал что просто будет.
Быдлокодером становиться не хочеться...
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Разбор tcx файла с Garmin навигатора для построения на основе данных графиков через WEB-интерфейс.

Сообщение drBatty »

Stasroot1 писал(а):
19.04.2012 14:34
Быдлокодером становиться не хочеться

это не сложно. не смотря на обилие граблей в php, в документации все эти грабли описаны. Только надо не лениться, и читать примечания (:

Я ещё забыл сказать про функцию http://ru2.php.net/manual/ru/function.mysql-data-seek.php
Она передвигает внутренний указатель в выборке на нужную позицию. Т.е. во втором примере вместо второй выборки

Код: Выделить всё

$sql = "SELECT tid FROM trainings WHERE uid = '$uid'";
$result = mysql_query($sql);

достаточно просто сдвинуть указатель:

Код: Выделить всё

mysql_data_seek($result, 0);

Вот только на практике обычно не получается - внутри цикла часто тоже нужны запросы к СУБД, и потому проще обычно загрузить выборку в массив.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: