Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.09.2016, 12:17   #1
pserohin
Новичок
Джуниор
 
Регистрация: 12.09.2016
Сообщений: 3
По умолчанию Проблема с получение результа запроса из БД

Помогите разобраться с возникшей проблемкой
1. Получаю IP посетителя
if(isset($_SERVER['REMOTE_ADDR'])){
$qpid = $_SERVER['REMOTE_ADDR'];
$date = date('H:m:s');

2. Добавляю IP и время входа в БД
$query = "INSERT INTO qpid (qpIdNum, qpIdTime)
VALUES ('$qpid', '$date')";
$res = mysql_query($query);

3. Делаю вывод из БД
$query = "SELECT * FROM qpid
WHERE qpIdNum = '$qpid'";
$res = mysql_query($query);
$qpidNum = array();
$qpidNum = mysql_fetch_assoc($res);

echo $qpidNum['qpIdNum']; //из БД получаю вместо 46.42.4.164 только первую цифру 4
echo $qpidNum['qpIdTime']; // из БД получаю вместо 15:09:36 только первую цифру 1
}
Нужен полный результат запроса из БД (46.42.4.164)
Тип полей у qpIdNum и qpIdTime - varchar 255
Заранее спасибо за помощь.
pserohin вне форума Ответить с цитированием
Старый 12.09.2016, 13:35   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Особого криминала не вижу.

А посмотрите, что у Вас в БД в таблице qpid получается (через PMA, например).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.09.2016, 15:59   #3
predefined
Форумчанин
 
Регистрация: 01.08.2016
Сообщений: 182
По умолчанию

Строка
$qpidNum = array(); - лишняя

После строки
$qpidNum = mysql_fetch_assoc($res);
вставьте
print_r($qpidNum);
и посмотрите что реально присылает сервер в массиве, и какова реальная внутренняя структура этого массива.
Если там только первые цифры от IP - скорее всего тип полей у qpIdNum/qpIdTime не VARCHAR 255, а CHAR или VARCHAR(1).

И под хранение даты лучше использовать поля типа DATE, особенно если планируется выборка/сортировка по датам

Последний раз редактировалось predefined; 12.09.2016 в 16:07.
predefined вне форума Ответить с цитированием
Старый 12.09.2016, 16:14   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

predefined, готов подписаться под каждый словом.

хранить дату нужно только в datetime формате.
иначе потом проблем с ней не оберёшься!

И ещё добавлю, что для хранения IP 255 символов - сверхизбыточно.

это если не хранить IP в качестве числового значения (что удобнее и компактнее).
Вот что я вычитал по этому поводу в Сети:

Цитата:
В поле типа unsigned int. Функция преобразования inet_aton(). Обратное преобразование inet_ntoa().

Для общего развития....
Оптимально хранить ip-адреса не как строки (varchar), а как числа.
Для этого существует две функции mySQL — INET_ATON и INET_NTOA,
первая преобразует 4 байтную последовательность ip-адреса в число, вторая преобразует обратно.

1. Столбец, в котором будут хранится ip-адреса объявляется как `ip` INT UNSIGNED NOT NULL

2. При вставке:
Код:
INSERT INTO `ip_s` 
SET ip = INET_ATON('213.169.23.35')
3. При выборке (например > 255.255.0.0)
Код:
SELECT INET_NTOA(ip)  
FROM `ip_s` 
WHERE `ip_s`.ip > INET_ATON('255.255.0.0')
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.09.2016, 16:52   #5
pserohin
Новичок
Джуниор
 
Регистрация: 12.09.2016
Сообщений: 3
По умолчанию

Всем спасибо за помощь.
С выводом IP я разобрался, а временем не получается. Хочу чтобы по истечении 5 минут запись из БД удалялась.
В БД поле qpIdTime перевел в формат timestamp

if(isset($_SERVER['REMOTE_ADDR'])){
$qpid = $_SERVER['REMOTE_ADDR'];
$date = date('H:m:s');

$query = "SELECT qpIdNum, TIME(qpIdTime) FROM qpid
WHERE qpIdNum = '$qpid'";
$res = mysql_query($query);
$qpidNum = array();

if(mysql_num_rows($res) > 0){
$qpidNum = mysql_fetch_assoc($res);
if($date > $qpidNum['TIME(qpIdTime)'] + 30000){
$query = "DELETE FROM qpid
WHERE qpIdNum = $qpId";
$res = mysql_query($query);
}
}else{
$query = "INSERT INTO qpid (qpIdNum, qpIdTime)
VALUES ('$qpid', NOW())";
$res = mysql_query($query);
}
}
pserohin вне форума Ответить с цитированием
Старый 12.09.2016, 17:52   #6
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от pserohin Посмотреть сообщение
if($date > $qpidNum['TIME(qpIdTime)'] + 30000)
Выведи обе эти переменные на экран – чтоб понять, что и с чем ты пытаешься сравнить, и почему это не работает.
И что по-твоему будет, если к строковому значению '12:34:47' прибавить число 30000 ?

Последний раз редактировалось Andkorol; 12.09.2016 в 18:00.
Andkorol вне форума Ответить с цитированием
Старый 13.09.2016, 12:12   #7
pserohin
Новичок
Джуниор
 
Регистрация: 12.09.2016
Сообщений: 3
По умолчанию

Я во всем разобрался. Всем большое спасибо за подсказку.
pserohin вне форума Ответить с цитированием
Старый 13.09.2016, 14:46   #8
Fenex
Форумчанин
 
Аватар для Fenex
 
Регистрация: 15.02.2012
Сообщений: 823
По умолчанию

В дополнение ко всему сказанному лучше заменить в работе mysql на mysqli.
^-.-^ My GitHub

Последний раз редактировалось Fenex; 13.09.2016 в 14:48.
Fenex вне форума Ответить с цитированием
Старый 13.09.2016, 17:38   #9
predefined
Форумчанин
 
Регистрация: 01.08.2016
Сообщений: 182
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
И ещё добавлю, что для хранения IP 255 символов - сверхизбыточно.

это если не хранить IP в качестве числового значения (что удобнее и компактнее).
Да, я тоже стараюсь экономить каждый байт в БД
Плюс, поиск то текстовому полю и сравнение < IP > - будет тормозить.

И надо не забывать про IPv6...


У топикстартера - простая конкретная задача, надеюсь, он потом оптимизирует поля и правильно расставит индексы.
Он же быстро сообразил, что такое поле DATE и как удобно его использовать.


Цитата:
Сообщение от Fenex Посмотреть сообщение
В дополнение ко всему сказанному лучше заменить в работе mysql на mysqli.
PHP начиная с версии 5.5.0 должен уже ругаться что функция устарела/deprecated. И в любой момент может быть удалена из очередной версии PHP. Я не знаю, как ТС этого не заметил.

Вообще стараюсь для работы с БД "класс-обёртку" использовать. Чтобы, при необходимости, было проще мигрировать на mysqli/PDO или mariaDB.

Последний раз редактировалось predefined; 13.09.2016 в 17:45.
predefined вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с отображением результа выборки в DBGrid при использовании компонентов DOA Undel БД в Delphi 1 15.05.2013 09:48
Получение данных из запроса [MoNAMur] PHP 0 18.04.2012 12:26
получение данных из Post запроса ToDayGoodDay Работа с сетью в Delphi 1 30.07.2011 20:15
Получение Post запроса bulldog5293 Работа с сетью в Delphi 5 22.11.2010 12:51
Получение GET запроса приложением shkurkin Работа с сетью в Delphi 3 09.07.2009 08:24