Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

tempestwow

[Resolvido] Verificar data antiga...

Recommended Posts

Bom pessoal, sou meio leigo no assunto! más vou tentar explicar!

Quando um usuário cria uma conta, ele salva duas coisas em duas tables diferente más no mesmo banco de dados

Ou seja

Banco de dados AUTH, tables account e account_access

Quando o cara cria a conta os dados ficam em account

e as informações se ele é vip ou não é em account_access

O Script deveria fazer a seguinte função, assim que ele cria-se a conta iria salvar em account e account_access, que ele é VIP, salvando o ID da conta e o Gm level 1

Eu rodaria o script de vez em quando e todas as contas que foram criadas em determinada data passando 1 semana perderiam o dados que está 1 em gm level no account_access para 0

Ou seja o script meu é esse, porem ta errado várias coisas

 

Deem uma olhada e me ajude, se eu não fui claro pergunta ae oque não entendeu que eu explico!

<?php
$conexao = mysql_connect('localhost', 'root', 'senha');
mysql_select_db('auth', $conexao);
$query	= mysql_query('SELECT id, joindate FROM account');
while($rows = mysql_fetch_assoc($query))
{
if(date('Y-m-d', strtotime($rows['joindate']))>(date('Y-m-d')-7))
{
	echo $rows['id'];
	$query	= mysql_query('UPDATE account_access SET gmlevel =  \'0\' WHERE id=\''.$rows['id'].'\' AND gmlevel=\'1\'');
}
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

E éssa aqui...

-- MySQL dump 10.11
--
-- Host: localhost Database: realmd
-- ------------------------------------------------------
-- Server version 5.0.45-Debian_1ubuntu3.1-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

-- 
-- Table structure for table `account_access`
-- 

DROP TABLE IF EXISTS `account_access`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `account_access` (
 `id` int(11) unsigned NOT NULL,
 `gmlevel` tinyint(3) unsigned NOT NULL,
 `RealmID` int(11) NOT NULL default '-1',
 PRIMARY KEY (`id`,`RealmID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;

-- 
-- Dumping data for table `account_access`
-- 

LOCK TABLES `account_access` WRITE;
/*!40000 ALTER TABLE `account_access` DISABLE KEYS */;
/*!40000 ALTER TABLE `account_access` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `account`
--

DROP TABLE IF EXISTS `account`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `account` (
 `id` int(11) unsigned NOT NULL auto_increment COMMENT 'Identifier',
 `username` varchar(32) NOT NULL default '',
 `sha_pass_hash` varchar(40) NOT NULL default '',
 `sessionkey` longtext,
 `v` longtext,
 `s` longtext,
 `email` text,
 `joindate` timestamp NOT NULL default CURRENT_TIMESTAMP,
 `last_ip` varchar(30) NOT NULL default '127.0.0.1',
 `failed_logins` int(11) unsigned NOT NULL default '0',
 `locked` tinyint(3) unsigned NOT NULL default '0',
 `last_login` timestamp NOT NULL default '0000-00-00 00:00:00',
 `online` tinyint(4) NOT NULL default '0',
 `expansion` tinyint(3) unsigned NOT NULL default '2',
 `mutetime` bigint(40) unsigned NOT NULL default '0',
 `locale` tinyint(3) unsigned NOT NULL default '0',
 `recruiter` int(11) NOT NULL default '0',
 PRIMARY KEY (`id`),
 UNIQUE KEY `idx_username` (`username`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='Account System';
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `account`
--

LOCK TABLES `account` WRITE;
/*!40000 ALTER TABLE `account` DISABLE KEYS */;
/*!40000 ALTER TABLE `account` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `account_banned`
--

DROP TABLE IF EXISTS `account_banned`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `account_banned` (
 `id` int(11) NOT NULL default '0' COMMENT 'Account id',
 `bandate` bigint(40) NOT NULL default '0',
 `unbandate` bigint(40) NOT NULL default '0',
 `bannedby` varchar(50) NOT NULL,
 `banreason` varchar(255) NOT NULL,
 `active` tinyint(4) NOT NULL default '1',
 PRIMARY KEY (`id`,`bandate`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Ban List';
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `account_banned`
--

LOCK TABLES `account_banned` WRITE;
/*!40000 ALTER TABLE `account_banned` DISABLE KEYS */;
/*!40000 ALTER TABLE `account_banned` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `ip_banned`
--

DROP TABLE IF EXISTS `ip_banned`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `ip_banned` (
 `ip` varchar(32) NOT NULL default '127.0.0.1',
 `bandate` bigint(40) NOT NULL,
 `unbandate` bigint(40) NOT NULL,
 `bannedby` varchar(50) NOT NULL default '[Console]',
 `banreason` varchar(255) NOT NULL default 'no reason',
 PRIMARY KEY (`ip`,`bandate`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Banned IPs';
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `ip_banned`
--

LOCK TABLES `ip_banned` WRITE;
/*!40000 ALTER TABLE `ip_banned` DISABLE KEYS */;
/*!40000 ALTER TABLE `ip_banned` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `logs`
--

DROP TABLE IF EXISTS `logs`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `logs` (
 `time` int(14) NOT NULL,
 `realm` int(4) NOT NULL,
 `type` int(4) NOT NULL,
 `string` text
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `logs`
--

LOCK TABLES `logs` WRITE;
/*!40000 ALTER TABLE `logs` DISABLE KEYS */;
/*!40000 ALTER TABLE `logs` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `realmcharacters`
--

DROP TABLE IF EXISTS `realmcharacters`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `realmcharacters` (
 `realmid` int(11) unsigned NOT NULL default '0',
 `acctid` bigint(20) unsigned NOT NULL,
 `numchars` tinyint(3) unsigned NOT NULL default '0',
 PRIMARY KEY (`realmid`,`acctid`),
 KEY (acctid)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Realm Character Tracker';
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `realmcharacters`
--

LOCK TABLES `realmcharacters` WRITE;
/*!40000 ALTER TABLE `realmcharacters` DISABLE KEYS */;
/*!40000 ALTER TABLE `realmcharacters` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `realmlist`
--

DROP TABLE IF EXISTS `realmlist`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `realmlist` (
 `id` int(11) unsigned NOT NULL auto_increment,
 `name` varchar(32) NOT NULL default '',
 `address` varchar(32) NOT NULL default '127.0.0.1',
 `port` int(11) NOT NULL default '8085',
 `icon` tinyint(3) unsigned NOT NULL default '0',
 `color` tinyint(3) unsigned NOT NULL default '2',
 `timezone` tinyint(3) unsigned NOT NULL default '0',
 `allowedSecurityLevel` tinyint(3) unsigned NOT NULL default '0',
 `population` float unsigned NOT NULL default '0',
 `gamebuild` int(11) unsigned NOT NULL default '12340',
 PRIMARY KEY (`id`),
 UNIQUE KEY `idx_name` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Realm System';
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `realmlist`
--

LOCK TABLES `realmlist` WRITE;
/*!40000 ALTER TABLE `realmlist` DISABLE KEYS */;
INSERT INTO `realmlist` (`id`,`name`,`address`,`port`,`icon`,`color`,`timezone`,`allowedSecurityLevel`,`population`,`gamebuild`) VALUES
(1,'Trinity','127.0.0.1',8085,1,0,1,0,0,12340);
/*!40000 ALTER TABLE `realmlist` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `uptime`
--

DROP TABLE IF EXISTS `uptime`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `uptime` (
 `realmid` int(11) unsigned NOT NULL,
 `starttime` bigint(20) unsigned NOT NULL default '0',
 `startstring` varchar(64) NOT NULL default '',
 `uptime` bigint(20) unsigned NOT NULL default '0',
 `maxplayers` smallint(5) unsigned NOT NULL default '0',
 `revision` VARCHAR(255) NOT NULL DEFAULT 'Trinitycore',
 PRIMARY KEY (`realmid`,`starttime`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Uptime system';
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `uptime`
--

LOCK TABLES `uptime` WRITE;
/*!40000 ALTER TABLE `uptime` DISABLE KEYS */;
/*!40000 ALTER TABLE `uptime` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2008-01-10 11:37:06

-- Updated on 2010-01-29 23:21:45 GMT+1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, seria isso ?

mysql> select date_add( now(), interval 1 week );
+------------------------------------+
| date_add( now(), interval 1 week ) |
+------------------------------------+
| 2011-07-30 21:56:42                |
+------------------------------------+
1 row in set (0.00 sec)

mysql> UPDATE `account_access` SET `gmlevel` = 0 WHERE `id` = ( SELECT `id` FROM `account` WHERE `joindate` = DATE_ADD( now(), INT
ERVAL 1 WEEK ) );
Query OK, 0 rows affected (0.05 sec)

Vai alterar todos que a joindate seja '2011-07-30 21:56:42 '.

 

UPDATE `account_access` SET `gmlevel` = 0 WHERE `id` = ( SELECT `id` FROM `account` WHERE `joindate` = DATE_ADD( now(), INTERVAL 1 WEEK ) );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, testei aqui, só que o seguinte, tem uma conta no account_access, que ela já tem vip na conta à mas de 1 semana a data que ela foi criada 2011-07-08 15:12:53

Rodei o script na esperança de ter dado certo rsrs

Porém não deu certo!

fui em account_access e tava ela lá ID=17 Gmlevel=1 RealmdID=-1

O certo seria o ID=17 e o Gmlevel=0

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opz, erro de SQL, veja que no SELECT, eu estou selecionado por igualdade, você quer que seje igual o maior que uma semana, certo ?

UPDATE `account_access` SET `gmlevel` = 0 WHERE `id` = ( SELECT `id` FROM `account` WHERE `joindate` >= DATE_ADD( now(), INTERVAL 1 WEEK ) );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo tipo assim a conta é a seguinte

insert into `account` (`id`, `username`, `sha_pass_hash`, `sessionkey`, `v`, `s`, `email`, `joindate`, `last_ip`, `failed_logins`, `locked`, `last_login`, `online`, `expansion`, `mutetime`, `locale`, `recruiter`, `acp`, `staff_id`, `vp`, `dp`, `gmlevel`) values('17','supremo','77d0d494fe061fc4e803103aed87f9e8a3cbf076','BE47C7352A834E3E4F7E58B3F4E50C3285D441F45AD00CFE922A40EDBFC7B77B6D36085098BA833A','409B943F2E22024BE90A17F6EE265E5FB24D6A8D847C1E625779028127355839','C0F0C43177D3158D5C835B1CCE21D94015B5F8B56279DB61B66938EDA1EB5DD9','email@hotmail.com','2011-07-08 15:12:53','189.99.96.14','0','0','2011-07-23 20:23:15','0','2','0','0','0',NULL,NULL,NULL,NULL,'0');

Eu rodei o novo script feito por você, agora no account_access ta lá

ID = 17

GMLevel = 1

RealmdID = -1

No caso você pode ver a data ae 2011-07-08 15:12:53, a data dela comparada com a de hoje é maior que 1 semana!

Creio que se isto fosse em PHP me ajudaria bastante pois evitaria de executar no banco de dados, más se der certo na SQL tudo bem...

Oque não está havendo é do script alterar o GmLevel da conta!

 

Bom, estou ainda tentando, Caso alguem saiba como fazer isto, me ajude!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estranho, aqui funcionou diretinho:

C:\dev\mysql\bin>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.41 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use imasters;
Database changed

mysql> create table accounts(
   ->     aid int( 11 ) not null auto_increment,
   ->     login varchar( 16 ) not null,
   ->    joindate timestamp not null,
   ->  primary key( aid )
   -> )engine = myisam;
Query OK, 0 rows affected (0.06 sec)

mysql> create table access(
   ->     aid int( 11 ) not null,
   ->     level enum( '0', '1', '2' ) not null default '1'
   -> )engine = myisam;
Query OK, 0 rows affected (0.05 sec)

mysql> insert into accounts values( 1, '123', date_add( now(), interval 2 week ) );
Query OK, 1 row affected (0.02 sec)

mysql> insert into access values( 1, '1' );
Query OK, 1 row affected (0.00 sec)

mysql> select * from accounts where joindate >= date_add( now(), interval 1 week );
+-----+-------+---------------------+
| aid | login | joindate            |
+-----+-------+---------------------+
|   1 | 123   | 2011-08-07 12:47:44 |
+-----+-------+---------------------+
1 row in set (0.00 sec)

mysql> select * from access;
+-----+-------+
| aid | level |
+-----+-------+
|   1 | 1     |
+-----+-------+
1 row in set (0.00 sec)

mysql> update access set level = '0' where aid = ( select aid from accounts where joindate >= date_add( now(), interval 1 week ) )
;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from access;
+-----+-------+
| aid | level |
+-----+-------+
|   1 | 0     |
+-----+-------+
1 row in set (0.00 sec)

mysql>

 

Criei umas tabelas, apenas pra demonstrar o SQL, fica mais fácil de entender.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O estranho é isto, pois eu executo usando o programa SQLyog Ultimate!

E como eu tinha dito sobre a conta, a data em que ela foi criada 2011-07-08 15:12:53

A data atual 24/07/2011 13:28:46, portanto a conta possue más de 1 semana que está com VIP no account_access, era pra o script rodar e oque é GmLevel 1 se transformar em 0

Usando isto na tabela AUTH

UPDATE `account_access` SET `gmlevel` = 0 WHERE `id` = ( SELECT `id` FROM `account` WHERE `joindate` >= DATE_ADD( now(), INTERVAL 1 WEEK ) );

 

0 row(s) affected

Execution Time : 00:00:00:000
Transfer Time  : 00:00:00:000
Total Time     : 00:00:00:000
---------------------------------------------------

Não seria más facil um script em php, aperfeiçoando o meu, para exibir as contas que contém más de 1 semana criada e são vips no account_access, criando um botão para rodar o script e retirar somente das contas exibidas o script em SQL para Update o Gmlevel de 1 para 0? dos ID's listados no php! não sei se fui claro ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, tem umas coisitas erradas ae :P

 

A lógica:

- Se eu pego a data atual(now) e acresento + 1 semana(DATE_ADD) e ainda atribuo ela como >= nunca vai encontrar mesmo (24/07/11 + 1 semana), o sql deu certo no seu micro Andrey, pois você inverteu o dia/mes, colocou a data como 2011-08-07 (sendo o mes agosto) kkk :thumbsup:

 

O certo seria usar um DATA_SUB para subtrair 1 semana da data atual e então procurar registros menores ou iguais ao resultado:

 

 UPDATE `account_access` 
  SET `gmlevel` = 0 
 WHERE `id` = ( 
         SELECT `id` FROM `account` WHERE `joindate` <= DATE_SUB( NOW(), INTERVAL 1 WEEK ) 
 );

Compartilhar este post


Link para o post
Compartilhar em outros sites

André, vamos entender.

date_add( now(), interval 2 week )

 

Hoje é 24, então adicionei + 14 dias, 24 + 14 = 38, o Mês tem 31, então restam 7 = '2011-08-07'

Por que eu adicionei 2 semanas ? pra não colocar uma data muito próxima, ou seja, o script é pra pegar além de uma semana, Então, tinha que estar 31 lá na tabela, mas ia ficar muito em cima, então coloquei um período mais longo, pra ficar mais claro.

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

André, me apresentou o seguinte erro

Query : UPDATE `account_access`            SET `gmlevel` = 0    WHERE `id` = (            SELECT `id` FROM `account` WHERE `joindate` <=...

Error Code : 1242
Subquery returns more than 1 row

Execution Time : 00:00:00:000
Transfer Time  : 00:00:00:000
Total Time     : 00:00:00:000
---------------------------------------------------

Compartilhar este post


Link para o post
Compartilhar em outros sites

Essa subquery:

 

SELECT `id` FROM `account`...

Está retornando mais de um ID.

 

Talvez usar o IN() ajude. Só não tenho certeza se existe um meio direto pelo MySQL de juntar todos esses ID's rtornados por uma vírgula.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem lembrado Bruno, esqueci desse detalhe. Nesse caso o IN não iria funcionar, o Any se encaixaria perfeitamente.

mysql> insert into accounts values( 1, '123', date_add( now(), interval 2 week ) );
Query OK, 1 row affected (0.03 sec)

mysql> insert into access values( 1, '1' );
Query OK, 1 row affected (0.00 sec)

mysql> insert into accounts values( 2, '456', date_add( now(), interval 2 week ) );
Query OK, 1 row affected (0.00 sec)

mysql> insert into access values( 2, '1' );
Query OK, 1 row affected (0.00 sec)

mysql> update access set level = '0' where aid = any( select aid from accounts where joindate >= date_add( now(), interval 1 week
) );
Query OK, 2 rows affected (0.01 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from access;
+-----+-------+
| aid | level |
+-----+-------+
|   1 | 0     |
|   2 | 0     |
+-----+-------+
2 rows in set (0.00 sec)

mysql>

 

Ou então

mysql> update access set level = '1' where aid = some( select aid from accounts where joindate >= date_add( now(), interval 1 week ) );
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from access;
+-----+-------+
| aid | level |
+-----+-------+
|   1 | 1     |
|   2 | 1     |
+-----+-------+
2 rows in set (0.03 sec)

 

No caso de algum erro( não alterar ), foi por causa da data, pra ficar certo, mude o sinal para <=

 

Ou Então, de acordo com a sua tabela, e de acordo com o que você me falou via MP.

UPDATE account_access SET GMlevel = '0' WHERE id = SOME( 
 SELECT id FROM account WHERE joindate <= DATE_ADD( NOW(), INTERVAL 1 WEEK
) OR joindate >= DATE_SUB( NOW(), INTERVAL 1 WEEK ) ) AND `GMlevel` = 1;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera o Andrey deu umas mechidas no código, ficou assim

UPDATE account_access SET GMlevel = '0' WHERE id = SOME( SELECT id FROM account WHERE joindate <= DATE_ADD( NOW(), INTERVAL 1 WEEK
) OR joindate >= DATE_SUB( NOW(), INTERVAL 1 WEEK ) ) AND `GMlevel` = 1;

Portanto, pode fechar o tópico, resolvido!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.