1

Тема: Дата для каждого входа

Здравствуйте,
Я не знаю как сделать, поэтому обращаюсь к вам. smile Есть много команд, в них вступают игроки. Мне нужно, чтобы когда игрок вступил в команду сохранялась дата входа в команду. Но проблема в том, что игрок может вступить в команды разных лиг. То есть 1х1 или 2х2 или 3х3 и т.д и должно быть не одно поле, а как это сделать?

2

Re: Дата для каждого входа

Setroler
Можно сделать отдельную таблицу для хранения таких данных, например, с полями:
id - просто идентификатор строки;
id_user - идентификатор пользователя;
league - Содержит название лиги, или идентификатор поля выбранной лиги.
date - Дата.

Таким образом можно выбрать всех пользователей определенной лиги, или отсортировать пользователей по дате вступления в лигу, или выбрать лиги в которые пользователь вступил. Так же удалить запись о вступлении в лигу по полю id.

3 (изменено: Setroler, 2010-06-25 13:48:45)

Re: Дата для каждого входа

Hanut сказал:

Setroler
Можно сделать отдельную таблицу для хранения таких данных, например, с полями:
id - просто идентификатор строки;
id_user - идентификатор пользователя;
league - Содержит название лиги, или идентификатор поля выбранной лиги.
date - Дата.

Таким образом можно выбрать всех пользователей определенной лиги, или отсортировать пользователей по дате вступления в лигу, или выбрать лиги в которые пользователь вступил. Так же удалить запись о вступлении в лигу по полю id.

Вы меня не совсем поняли, мне нужна не дата вступления в лигу, а дата вступления в команду, которая играет на лиге.

4

Re: Дата для каждого входа

Setroler
Тогда вместо лиги записывать идентификатор команды. В этом случае пользователь может состоять в нескольких командах одновременно.

5

Re: Дата для каждого входа

Hanut сказал:

Setroler
Тогда вместо лиги записывать идентификатор команды. В этом случае пользователь может состоять в нескольких командах одновременно.

А тогда будет дата вступления в одну команду.. А не всех

6

Re: Дата для каждого входа

Setroler
Не понимаю. Покажите структуры таблиц, которые надо объединить и что именно должно быть записано.

7

Re: Дата для каждого входа

Команды
http://img694.imageshack.us/img694/1235/43070931.png
Игрока
http://img36.imageshack.us/img36/1016/59884371.png

Должна быть записана дата вступления в команду, НО игрок может вступить в одну команду в одной лиге! НО он может играть на других лигах в других командах(и играть за первую)

8

Re: Дата для каждого входа

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

id - просто идентификатор строки;
id_user - идентификатор пользователя;
id_team - Содержит идентификатор команды.
date - Дата.

9

Re: Дата для каждого входа

Hanut сказал:

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

id - просто идентификатор строки;
id_user - идентификатор пользователя;
id_team - Содержит идентификатор команды.
date - Дата.

Простите, я не все изучил про php и mysql. Как сделать связанную таблицу?

10

Re: Дата для каждого входа

Setroler
Структура таблицы:

CREATE TABLE IF NOT EXISTS `table_linked` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `id_user` int(10) unsigned NOT NULL,
  `id_team` int(10) unsigned NOT NULL,
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Когда пользователь вступает в команду, делайте запись в этой таблице.

11

Re: Дата для каждого входа

А если один пользователь ушел из команды, а потом вернулся. Надо обновить запись, а он делает новую..

12

Re: Дата для каждого входа

Setroler
Это вы уже сами смотрите какая должна быть логика поведения. Можно при выходе пользователя из команды не удалять строку, а добавить в ней поле, где помечать, что пользователь ушел. При последующем подключении пользователя к команде делать выборку и если этот пользователь найден, то менять метку в поле на "активный"; если пользователь еще в команде не был, то создавать запись.

13

Re: Дата для каждого входа

Hanut сказал:

Setroler
Это вы уже сами смотрите какая должна быть логика поведения. Можно при выходе пользователя из команды не удалять строку, а добавить в ней поле, где помечать, что пользователь ушел. При последующем подключении пользователя к команде делать выборку и если этот пользователь найден, то менять метку в поле на "активный"; если пользователь еще в команде не был, то создавать запись.

Ну предположим, но как тогда + к этому сделать апдейт майскл если найдена запись, должен быть селет -> апдейт -> если нету - запись
Пока у меня так
$query = "INSERT INTO cs_playerjoin (id_user, id_team, joindate) VALUES ('$uid', '$tid', '$date')";
mysql_query($query) OR die(mysql_error());

14

Re: Дата для каждого входа

Setroler
Все верно, сперва надо выбрать данные с помощью SELECT, затем INSERT, если ничего не найдено.

15

Re: Дата для каждого входа

Hanut сказал:

Setroler
Все верно, сперва надо выбрать данные с помощью SELECT, затем INSERT, если ничего не найдено.

А еще и апдейт, если найдена запись. А как это написать на php правильно? я понимаю, что через else, но как.. smile

16

Re: Дата для каждого входа

Не понял какие данные вы хотите обновить с помощью UPDATE.

<?php

// Возвращение строки данных в виде ассоциативного массива.
function P_mysql_row($sql) {
    $data = false;
    $result = mysql_query($sql);
    if (mysql_num_rows($result) > 0) {
        $data = mysql_fetch_assoc($result);
        mysql_free_result($result);
    }
    return $data;
}

$sql = 'SELECT * FROM `cs_playerjoin` WHERE `id_user` = ' . $uid;
if ($row = P_mysql_row($sql)) {
    // Здесь UPDATE, или что-то еще по первичному ключу таблицы cs_playerjoin. Массив данных в переменной $row, например $row['id_user'].
} else {
    // Если у поля даты с типом timestamp в БД стоит параметр CURRENT_TIMESTAMP, то можно дату не вводить, она будет добавлена автоматически.
    $sql = 'INSERT INTO `cs_playerjoin` (`id_user`, `id_team`) VALUES ("' .$uid . '", "' . $tid . '")';
    mysql_query($sql);
}

?>

17 (изменено: Setroler, 2010-06-28 00:13:58)

Re: Дата для каждого входа

Дата создания команды : 28-06-2010
Вступил : 26-06-2010   -- не обновил... хотя дату добавил. И апдейт сделал проще. Хотя почему то не работает smile

<?php

// Возвращение строки данных в виде ассоциативного массива.
function P_mysql_row($sql) {
    $data = false;
    $result = mysql_query($sql);
    if (mysql_num_rows($result) > 0) {
        $data = mysql_fetch_assoc($result);
        mysql_free_result($result);
    }
    return $data;
}

$sql = 'SELECT * FROM `cs_playerjoin` WHERE `id_user` = ' . $uid;
if ($row = P_mysql_row($sql)) {
    // Здесь UPDATE, или что-то еще по первичному ключу таблицы cs_playerjoin. Массив данных в переменной $row, например $row['id_user'].
    $sqldd = "UPDATE cs_playerjoin SET joindate = '$_POST[joindate]' WHERE id_user = '$uid'"; 
    mysql_query($sqldd);
} else {
    // Если у поля даты с типом timestamp в БД стоит параметр CURRENT_TIMESTAMP, то можно дату не вводить, она будет добавлена автоматически.
    $sql = 'INSERT INTO `cs_playerjoin` (`id_user`, `id_team`,`joindate`) VALUES ("' .$uid . '", "' . $tid . '","' .$date . '")';
    mysql_query($sql);
}

?>

p.s. if($_POST['add'])
p.p.s. Вписал joindate - потому, что мне нужна переменная date , а не TIMESTAMP (изменил)

18

Re: Дата для каждого входа

Setroler
У таблицы cs_playerjoin должно быть поле являющееся первичным ключом, в моем примере это id. По этому полю и надо делать UPDATE, иначе получится, что пользователь не может находится более, чем в одной команде.
$sqldd = 'UPDATE `cs_playerjoin` SET `joindate` = "' . $_POST['joindate'] . '" WHERE `id` = ' . $row['id'];

Если вы что-то поменяли, то покажите структуру, чтобы были ясны изменения.

19

Re: Дата для каждого входа

Hanut сказал:

$sqldd = 'UPDATE `cs_playerjoin` SET `joindate` = "' . $_POST['joindate'] . '" WHERE `id` = ' . $row['id'];

Нет, не хочет обновлять
Структура

  `id_user` int(10) unsigned NOT NULL,
  `id_team` int(10) unsigned NOT NULL,
  `joindate` date NOT NULL,

Сейчас код

<?php

// Возвращение строки данных в виде ассоциативного массива.
function P_mysql_row($sql) {
    $data = false;
    $result = mysql_query($sql);
    if (mysql_num_rows($result) > 0) {
        $data = mysql_fetch_assoc($result);
        mysql_free_result($result);
    }
    return $data;
}

$sql = 'SELECT * FROM `cs_playerjoin` WHERE `id_user` = ' . $uid;
if ($row = P_mysql_row($sql)) {
    // Здесь UPDATE, или что-то еще по первичному ключу таблицы cs_playerjoin. Массив данных в переменной $row, например $row['id_user'].
    $sqldd = 'UPDATE `cs_playerjoin` SET `joindate` = "' . $_POST['joindate'] . '" WHERE `id` = ' . $row['id'];
    mysql_query($sqldd);
} else {
    // Если у поля даты с типом timestamp в БД стоит параметр CURRENT_TIMESTAMP, то можно дату не вводить, она будет добавлена автоматически.
    $sql = 'INSERT INTO `cs_playerjoin` (`id_user`, `id_team`,`joindate`) VALUES ("' .$uid . '", "' . $tid . '","' .$date . '")';
    mysql_query($sql);
}

?>

20

Re: Дата для каждого входа

Setroler
Конечно не будет работать, если в таблице cs_playerjoin нет поля id. Я выше давал структуру таблицы с первичным полем id, по которому и можно удалить.

Но если вернуться к предыдущему варианту, то он тоже должен работать, если скрипту правильно передана переменная $_POST['joindate'].

$sqldd = 'UPDATE cs_playerjoin SET joindate = "' . $_POST['joindate'] . '" WHERE id_user = "' . $uid . '"';

21

Re: Дата для каждого входа

Прошу прошения, id есть. я просто случайно не скопировал его smile
НО теперь селект видимо не делает, потому что пишет 00-00-0000 хотя в базе данные есть.
выводит на сайт таким образом

$joined = mysql_query("SELECT *, DATE_FORMAT(`joindate`, '%d-%m-%Y') AS `joindate_format` FROM cs_playerjoin WHERE id = '$id'");
while($join = mysql_fetch_array($joined)) {
$joindate = $join['joindate_format'];

22

Re: Дата для каждого входа

Setroler
Проверьте этот запрос в phpMyAdmin.

23 (изменено: Setroler, 2010-06-29 19:20:12)

Re: Дата для каждого входа

http://gyazo.com/9c416b4107d2a0cf4a0a272ab76556a6.png
Если добавить ID
http://gyazo.com/3078053d360030ba98c148228dd56bca.png
Понял, что надо подставить ID юзера туда(но почему то раньше все показывалось), у меня эта переменная обозначается $bid, но не помогло.. НА СКРИНШОТЕ ID ТАБЛИЦЫ, А НЕ ЮЗЕРА. ID юзера я еще тогда не сделал.
И как не странно, дату вступления пишет только администратору сайта.. и то не верно. Пишет первую дату вступления, в любую команду
Запрос должен выглядить наверное так:
$joined = mysql_query("SELECT *, DATE_FORMAT(`joindate`, '%d-%m-%Y') AS `joindate_format` FROM cs_playerjoin WHERE id_user = '$bid'");
while($join = mysql_fetch_array($joined)) {
$joindate = $join['joindate_format'];

24

Re: Дата для каждого входа

В поле id_user ноль стоит.

Здесь чему равна переменная $bid? Есть в таблице cs_playerjoin пользователь с идентификатором $bid?
$joined = mysql_query("SELECT *, DATE_FORMAT(`joindate`, '%d-%m-%Y') AS `joindate_format` FROM cs_playerjoin WHERE id_user = '$bid'");

25 (изменено: Setroler, 2010-06-29 23:36:27)

Re: Дата для каждого входа

Hanut сказал:

В поле id_user ноль стоит.

Здесь чему равна переменная $bid? Есть в таблице cs_playerjoin пользователь с идентификатором $bid?
$joined = mysql_query("SELECT *, DATE_FORMAT(`joindate`, '%d-%m-%Y') AS `joindate_format` FROM cs_playerjoin WHERE id_user = '$bid'");

1| Я же написал, что тогда id_user я еще не сделал, поэтому оно высвечивается 0, сейчас же оно сделано. Создавалась просто запись без id
2| $bid это переменная пользователя(его id) в таблице пользователей(cs_bio)