├── README.md ├── init ├── insert_data.sql └── tables.sql ├── sql ├── index.sql ├── parte1.sql ├── parte2.sql ├── ri.sql └── star_scheme.sql └── web ├── config.php ├── index.php ├── login.php ├── logout.php ├── pagina.php ├── session.php ├── style.css ├── tipo.php └── transacoes ├── config.php ├── index.php ├── login.php ├── logout.php ├── pagina.php ├── session.php ├── style.css └── tipo.php /README.md: -------------------------------------------------------------------------------- 1 | 2 | # PHP + MySQL Website Example 3 | 4 | 5 | 6 | ## Config project 7 | 8 | * Edit `web/config.php` with your database details 9 | ```php 10 | $db_host = "localhost"; 11 | $db_user = "username"; 12 | $db_pass = "password"; 13 | $db_name = "database"; 14 | ``` 15 | 16 | * Place `web/` folder in your _apache_ server 17 | 18 | * Init database with `init/tables.sql` 19 | ```ssh 20 | $ mysql -h hostname -u username -ppassword 21 | mysql> use database; 22 | mysql> source tables.sql; 23 | ``` 24 | 25 | 26 | ## Run project 27 | 28 | * Insert example data in database (`init/insert_data.sql`) 29 | ```ssh 30 | $ mysql -h hostname -u username -ppassword 31 | mysql> use database; 32 | mysql> source insert_data.sql; 33 | ``` 34 | 35 | * Browse to `http://hostname/index.php` 36 | 37 | 38 | -------------------------------------------------------------------------------- /init/tables.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS utilizador ( 2 | userid INT NOT NULL AUTO_INCREMENT, 3 | email VARCHAR(255) NOT NULL, 4 | nome VARCHAR(255) NOT NULL, 5 | password VARCHAR(255) NOT NULL, 6 | questao1 VARCHAR(255) NOT NULL, 7 | resposta1 VARCHAR(255) NOT NULL, 8 | questao2 VARCHAR(255), 9 | resposta2 VARCHAR(255), 10 | pais VARCHAR(45) NOT NULL, 11 | categoria VARCHAR(45) NOT NULL, 12 | PRIMARY KEY (userid), 13 | UNIQUE INDEX email_UNIQUE (email) 14 | ); 15 | 16 | CREATE TABLE IF NOT EXISTS login ( 17 | contador_login INT NOT NULL AUTO_INCREMENT, 18 | userid INT NOT NULL, 19 | sucesso TINYINT(1) NOT NULL, 20 | moment TIMESTAMP NOT NULL, 21 | PRIMARY KEY (contador_login), 22 | FOREIGN KEY (userid) REFERENCES utilizador (userid) ON DELETE CASCADE 23 | ON UPDATE CASCADE 24 | ); 25 | 26 | CREATE TABLE IF NOT EXISTS sequencia ( 27 | contador_sequencia INT NOT NULL AUTO_INCREMENT, 28 | moment TIMESTAMP NOT NULL, 29 | userid INT NOT NULL, 30 | PRIMARY KEY (contador_sequencia), 31 | FOREIGN KEY (userid) REFERENCES utilizador (userid) ON DELETE CASCADE 32 | ON UPDATE CASCADE 33 | ); 34 | 35 | CREATE TABLE IF NOT EXISTS tipo_registo ( 36 | userid INT NOT NULL, 37 | typecnt INT NOT NULL, 38 | nome MEDIUMTEXT NOT NULL, 39 | ativo TINYINT(1) NOT NULL, 40 | idseq INT NULL, 41 | ptypecnt INT, 42 | PRIMARY KEY (userid, typecnt), 43 | FOREIGN KEY (userid) REFERENCES utilizador (userid) ON DELETE CASCADE 44 | ON UPDATE CASCADE, 45 | FOREIGN KEY (userid, ptypecnt) REFERENCES tipo_registo (userid, typecnt), 46 | FOREIGN KEY (idseq) REFERENCES sequencia (contador_sequencia) 47 | ); 48 | 49 | CREATE TABLE IF NOT EXISTS registo ( 50 | userid INT NOT NULL, 51 | typecounter INT NOT NULL, 52 | regcounter INT NOT NULL, 53 | nome VARCHAR(1024), 54 | ativo TINYINT(1), 55 | idseq INT NULL, 56 | pregcounter INT, 57 | PRIMARY KEY (userid, regcounter, typecounter), 58 | FOREIGN KEY (idseq) REFERENCES sequencia (contador_sequencia), 59 | FOREIGN KEY (userid , typecounter) REFERENCES tipo_registo (userid , typecnt), 60 | FOREIGN KEY (userid, pregcounter, typecounter) 61 | REFERENCES registo (userid, regcounter, typecounter) 62 | ); 63 | 64 | CREATE TABLE IF NOT EXISTS pagina ( 65 | userid INT NOT NULL, 66 | pagecounter INT NOT NULL, 67 | nome VARCHAR(1024) NOT NULL, 68 | idseq INT NOT NULL, 69 | ativa TINYINT(1) NOT NULL, 70 | ppagecounter INT NULL, 71 | PRIMARY KEY (userid, pagecounter) , 72 | FOREIGN KEY (userid) REFERENCES utilizador (userid) ON DELETE CASCADE ON UPDATE CASCADE, 73 | FOREIGN KEY (idseq) REFERENCES sequencia (contador_sequencia), 74 | FOREIGN KEY (userid, ppagecounter) REFERENCES pagina (userid, pagecounter) 75 | ); 76 | 77 | CREATE TABLE IF NOT EXISTS campo ( 78 | userid INT NOT NULL, 79 | typecnt INT NOT NULL, 80 | campocnt INT NOT NULL, 81 | idseq INT NOT NULL, 82 | ativo TINYINT(1) NOT NULL, 83 | nome VARCHAR(1024) NOT NULL, 84 | pcampocnt INT, 85 | PRIMARY KEY (userid, typecnt, campocnt) , 86 | FOREIGN KEY (userid , typecnt) REFERENCES tipo_registo (userid , typecnt) 87 | ON DELETE CASCADE ON UPDATE CASCADE, 88 | FOREIGN KEY (idseq) REFERENCES sequencia (contador_sequencia), 89 | FOREIGN KEY (userid, typecnt, pcampocnt) REFERENCES campo (userid, typecnt, campocnt) 90 | ); 91 | 92 | CREATE TABLE IF NOT EXISTS valor ( 93 | userid INT NOT NULL, 94 | typeid INT NOT NULL, 95 | regid INT NOT NULL, 96 | campoid INT NOT NULL, 97 | valor LONGTEXT NULL, 98 | idseq INT NOT NULL, 99 | ativo TINYINT(1) NOT NULL, 100 | pcampoid INT, 101 | PRIMARY KEY (userid, regid, typeid, campoid) , 102 | FOREIGN KEY (userid,typeid, campoid) REFERENCES campo (userid, typecnt , campocnt) 103 | ON DELETE CASCADE ON UPDATE CASCADE, 104 | FOREIGN KEY (userid, regid, typeid) REFERENCES registo (userid , regcounter,typecounter) 105 | ON DELETE CASCADE ON UPDATE CASCADE, 106 | FOREIGN KEY (idseq) REFERENCES sequencia (contador_sequencia), 107 | FOREIGN KEY (userid, regid, typeid, pcampoid) REFERENCES valor (userid, regid, typeid, campoid) 108 | ); 109 | 110 | CREATE TABLE IF NOT EXISTS reg_pag( 111 | idregpag INT NOT NULL AUTO_INCREMENT, 112 | userid INT NOT NULL, 113 | pageid INT NOT NULL, 114 | typeid INT NOT NULL, 115 | regid INT NOT NULL, 116 | idseq INT NOT NULL, 117 | ativa TINYINT(1) NOT NULL, 118 | pidregpag INT, 119 | PRIMARY KEY (idregpag), 120 | FOREIGN KEY (userid ,pageid) REFERENCES pagina (userid,pagecounter) 121 | ON DELETE CASCADE ON UPDATE CASCADE, 122 | FOREIGN KEY (userid, regid, typeid) REFERENCES registo (userid, regcounter, typecounter) 123 | ON DELETE CASCADE ON UPDATE CASCADE, 124 | FOREIGN KEY (idseq) REFERENCES sequencia (contador_sequencia), 125 | FOREIGN KEY (pidregpag) REFERENCES reg_pag (idregpag) 126 | ); 127 | 128 | 129 | 130 | 131 | 132 | -------------------------------------------------------------------------------- /sql/index.sql: -------------------------------------------------------------------------------- 1 | 2 | # query alinea a) 3 | 4 | SELECT AVG(quantos) q, userid FROM ( 5 | SELECT COUNT(X.regid) quantos, P.pagecounter, P.userid FROM 6 | (SELECT * FROM pagina P2 WHERE P2.ativa=1) P LEFT OUTER JOIN ( SELECT * FROM 7 | (SELECT typeid as rptypeid,pageid,regid,ativa as rpativa FROM reg_pag RP2 8 | WHERE RP2.ativa=1) RP, 9 | (SELECT regcounter,userid,ativo as rativo FROM registo R2 WHERE R2.ativo=1) R, 10 | (SELECT typecnt,ativo as tativo FROM tipo_registo T2 WHERE T2.ativo=1) T 11 | WHERE RP.regid=R.regcounter AND RP.rptypeid=T.typecnt 12 | ) X ON P.pagecounter=X.pageid 13 | GROUP BY P.pagecounter 14 | ) a GROUP BY userid; 15 | 16 | # indices 17 | 18 | CREATE INDEX RegIndex ON 19 | registo(regcounter,ativo) 20 | USING BTREE; 21 | 22 | CREATE INDEX RegPagIndex ON 23 | reg_pag(regid,pageid,ativa) 24 | USING BTREE; 25 | 26 | CREATE INDEX PagIndex ON 27 | pagina(pagecounter,ativa) 28 | USING BTREE; 29 | 30 | CREATE INDEX TipoIndex ON 31 | tipo_registo(typecnt,ativo) 32 | USING BTREE; 33 | 34 | 35 | 36 | 37 | 38 | 39 | # query alinea b) 40 | 41 | SELECT P.userid, P.nome AS pagina, R.nome AS registo FROM registo R, reg_pag RP, pagina P, tipo_registo T 42 | WHERE RP.pageid=P.pagecounter AND RP.userid=P.userid AND R.regcounter=RP.regid AND R.userid=RP.userid AND R.typecounter=T.typecnt AND R.userid=T.userid AND R.ativo=1 AND RP.ativa=1 AND T.ativo=1 AND P.ativa=1 43 | #AND P.userid= AND P.pagecounter=; 44 | GROUP BY P.userid, P.pagecounter; 45 | 46 | # indices 47 | 48 | CREATE INDEX RegIndex ON 49 | registo(regcounter,ativo) 50 | USING BTREE; 51 | 52 | CREATE INDEX RegNomeIndex ON 53 | registo(regcounter,nome) 54 | USING BTREE; 55 | 56 | CREATE INDEX RegTypeIndex ON 57 | registo(regcounter,typecounter) 58 | USING BTREE; 59 | 60 | CREATE INDEX RegPagIndex ON 61 | reg_pag(regid,pageid,ativa) 62 | USING BTREE; 63 | 64 | CREATE INDEX PagIndex ON 65 | pagina(pagecounter,ativa) 66 | USING BTREE; 67 | 68 | CREATE INDEX TipoIndex ON 69 | tipo_registo(typecnt,ativo) 70 | USING BTREE; 71 | -------------------------------------------------------------------------------- /sql/parte1.sql: -------------------------------------------------------------------------------- 1 | /* Pergunta 1 */ 2 | SELECT nome FROM Tipos WHERE email='Manuel@notebook.pt'; 3 | 4 | 5 | /* Pergunta 2 */ 6 | SELECT DISTINCT email FROM Historico WHERE accao='login_fail'; 7 | 8 | 9 | /* Pergunta 3 */ 10 | SELECT nascimento FROM Utilizadores WHERE email IN 11 | ( 12 | SELECT email FROM 13 | ( 14 | SELECT * FROM Registos WHERE nome="facebook" 15 | INTERSECT 16 | SELECT * FROM Paginas WHERE nome="facebook" 17 | ) 18 | ); -------------------------------------------------------------------------------- /sql/parte2.sql: -------------------------------------------------------------------------------- 1 | 2 | #SECCAO2 3 | 4 | #alinea a) 5 | SELECT userid FROM utilizador U WHERE 6 | (SELECT COUNT(*) FROM login WHERE sucesso=0 AND userid=U.userid) 7 | > 8 | (SELECT COUNT(*) FROM login WHERE sucesso=1 AND userid=U.userid) 9 | 10 | 11 | #alinea b) 12 | SELECT a.regid, a.userid FROM ( 13 | SELECT COUNT(P.pagecounter) rpaginas, P.userid, P.pagecounter, RP.regid 14 | FROM pagina P LEFT OUTER JOIN reg_pag RP ON P.userid=RP.userid AND P.pagecounter=RP.pageid 15 | WHERE P.ativa=1 AND RP.ativa=1 16 | GROUP BY RP.regid 17 | ) a, ( 18 | SELECT COUNT(P.pagecounter) as upaginas, P.userid 19 | FROM pagina P WHERE P.ativa=1 GROUP BY P.userid 20 | ) b, registo R, tipo_registo T 21 | WHERE a.userid=b.userid AND R.regcounter=a.regid AND R.typecounter=T.typecnt AND R.userid=T.userid 22 | AND rpaginas=upaginas AND R.ativo=1 AND T.ativo=1 23 | 24 | 25 | #alinea c) 26 | DROP TEMPORARY TABLE IF EXISTS media1,media2; 27 | CREATE TEMPORARY TABLE media1 AS ( 28 | SELECT AVG(quantos) q, userid FROM ( 29 | SELECT COUNT(X.regid) quantos, P.pagecounter, P.userid FROM 30 | (SELECT * FROM pagina P2 WHERE P2.ativa=1) P LEFT OUTER JOIN ( SELECT * FROM 31 | (SELECT typeid as rptypeid,pageid,regid,ativa as rpativa FROM reg_pag RP2 WHERE RP2.ativa=1) RP, 32 | (SELECT regcounter,userid,ativo as rativo FROM registo R2 WHERE R2.ativo=1) R, 33 | (SELECT typecnt,ativo as tativo FROM tipo_registo T2 WHERE T2.ativo=1) T 34 | WHERE RP.regid=R.regcounter AND RP.rptypeid=T.typecnt 35 | ) X ON P.pagecounter=X.pageid 36 | GROUP BY P.pagecounter 37 | ) a GROUP BY userid 38 | ); 39 | CREATE TEMPORARY TABLE media2 AS (SELECT * FROM media1); 40 | SELECT userid FROM media1 WHERE q=(SELECT max(q) FROM media2); 41 | 42 | 43 | #alinea d) 44 | SELECT userid FROM ( 45 | SELECT X.userid,X.regid,X.pageid, X.typeid FROM ( 46 | SELECT P.userid,RP.regid,RP.pageid, RP.typeid FROM pagina P LEFT OUTER JOIN reg_pag RP 47 | ON P.userid=RP.userid AND P.pagecounter=RP.pageid 48 | WHERE P.ativa=1 AND RP.ativa=1 49 | ) X, registo R, tipo_registo T WHERE X.userid=R.userid AND X.regid=R.regcounter AND X.userid=T.userid AND X.typeid=T.typecnt AND R.ativo=1 AND T.ativo=1 50 | GROUP BY X.pageid 51 | HAVING COUNT(DISTINCT X.typeid) =(SELECT COUNT(DISTINCT T.typecnt) FROM tipo_registo T WHERE T.userid=X.userid AND T.ativo=1) 52 | ) a 53 | GROUP BY a.userid 54 | HAVING COUNT(pageid)=(SELECT COUNT(pagecounter) FROM pagina PP WHERE PP.userid=a.userid AND PP.ativa=1) 55 | 56 | 57 | -------------------------------------------------------------------------------- /sql/ri.sql: -------------------------------------------------------------------------------- 1 | 2 | DROP TRIGGER IF EXISTS seqP; 3 | DROP TRIGGER IF EXISTS seqR; 4 | DROP TRIGGER IF EXISTS seqT; 5 | DROP TRIGGER IF EXISTS seqC; 6 | DROP TRIGGER IF EXISTS seqV; 7 | 8 | DROP TRIGGER IF EXISTS seqP2; 9 | DROP TRIGGER IF EXISTS seqR2; 10 | DROP TRIGGER IF EXISTS seqT2; 11 | DROP TRIGGER IF EXISTS seqC2; 12 | DROP TRIGGER IF EXISTS seqV2; 13 | 14 | DELIMITER // 15 | 16 | CREATE TRIGGER seqP BEFORE INSERT ON pagina 17 | FOR EACH ROW 18 | BEGIN 19 | INSERT INTO sequencia (moment,userid) 20 | VALUES (NOW(),NEW.userid); 21 | SET NEW.idseq=LAST_INSERT_ID(); 22 | END;// 23 | 24 | CREATE TRIGGER seqR BEFORE INSERT ON registo 25 | FOR EACH ROW 26 | BEGIN 27 | INSERT INTO sequencia (moment,userid) 28 | VALUES (NOW(),NEW.userid); 29 | SET NEW.idseq=LAST_INSERT_ID(); 30 | END;// 31 | 32 | CREATE TRIGGER seqT BEFORE INSERT ON tipo_registo 33 | FOR EACH ROW 34 | BEGIN 35 | INSERT INTO sequencia (moment,userid) 36 | VALUES (NOW(),NEW.userid); 37 | SET NEW.idseq=LAST_INSERT_ID(); 38 | END;// 39 | 40 | CREATE TRIGGER seqC BEFORE INSERT ON campo 41 | FOR EACH ROW 42 | BEGIN 43 | INSERT INTO sequencia (moment,userid) 44 | VALUES (NOW(),NEW.userid); 45 | SET NEW.idseq=LAST_INSERT_ID(); 46 | END;// 47 | 48 | CREATE TRIGGER seqV BEFORE INSERT ON valor 49 | FOR EACH ROW 50 | BEGIN 51 | INSERT INTO sequencia (moment,userid) 52 | VALUES (NOW(),NEW.userid); 53 | SET NEW.idseq=LAST_INSERT_ID(); 54 | END;// 55 | 56 | CREATE TRIGGER seqP2 BEFORE UPDATE ON pagina 57 | FOR EACH ROW 58 | BEGIN 59 | UPDATE sequencia SET moment=NOW() WHERE idseq=OLD.idseq; 60 | SET NEW.idseq=OLD.idseq; 61 | END;// 62 | 63 | CREATE TRIGGER seqR2 BEFORE UPDATE ON registo 64 | FOR EACH ROW 65 | BEGIN 66 | UPDATE sequencia SET moment=NOW() WHERE idseq=OLD.idseq; 67 | SET NEW.idseq=OLD.idseq; 68 | END;// 69 | 70 | CREATE TRIGGER seqT2 BEFORE UPDATE ON tipo_registo 71 | FOR EACH ROW 72 | BEGIN 73 | UPDATE sequencia SET moment=NOW() WHERE idseq=OLD.idseq; 74 | SET NEW.idseq=OLD.idseq; 75 | END;// 76 | 77 | CREATE TRIGGER seqC2 BEFORE UPDATE ON campo 78 | FOR EACH ROW 79 | BEGIN 80 | UPDATE sequencia SET moment=NOW() WHERE idseq=OLD.idseq; 81 | SET NEW.idseq=OLD.idseq; 82 | END;// 83 | 84 | CREATE TRIGGER seqV2 BEFORE UPDATE ON valor 85 | FOR EACH ROW 86 | BEGIN 87 | UPDATE sequencia SET moment=NOW() WHERE idseq=OLD.idseq; 88 | SET NEW.idseq=OLD.idseq; 89 | END;// 90 | 91 | DELIMITER ; 92 | 93 | 94 | 95 | # caso especial para a RP 96 | # =================================== 97 | DROP TRIGGER IF EXISTS seqRP; 98 | DROP TRIGGER IF EXISTS seqRP2; 99 | DELIMITER // 100 | CREATE TRIGGER seqRP BEFORE INSERT ON reg_pag 101 | FOR EACH ROW 102 | BEGIN 103 | INSERT INTO sequencia (moment,userid) 104 | VALUES (NOW(),NEW.userid); 105 | SET NEW.idseq=LAST_INSERT_ID(); 106 | END;// 107 | CREATE TRIGGER seqRP2 BEFORE UPDATE ON reg_pag 108 | FOR EACH ROW 109 | BEGIN 110 | INSERT INTO sequencia (moment,userid) 111 | VALUES (NOW(),NEW.userid); 112 | SET NEW.idseq=LAST_INSERT_ID(); 113 | END;// 114 | DELIMITER ; 115 | -------------------------------------------------------------------------------- /sql/star_scheme.sql: -------------------------------------------------------------------------------- 1 | # CREATE SCHEMA tentativas_login; 2 | DROP TABLE IF EXISTS d_utilizador; 3 | DROP TABLE IF EXISTS d_tempo; 4 | DROP TABLE IF EXISTS tentativas_login; 5 | 6 | CREATE TABLE d_utilizador ( 7 | email VARCHAR(255) NOT NULL, 8 | nome VARCHAR(255) NOT NULL, 9 | pais VARCHAR(45) NOT NULL, 10 | categoria VARCHAR(45) NOT NULL, 11 | PRIMARY KEY (email) 12 | ); 13 | 14 | CREATE TABLE d_tempo ( 15 | dia INT NOT NULL, 16 | mes INT NOT NULL, 17 | ano INT NOT NULL, 18 | PRIMARY KEY (dia,mes,ano) 19 | ); 20 | 21 | CREATE TABLE tentativas_login ( 22 | email VARCHAR(255) NOT NULL, 23 | dia INT NOT NULL, 24 | mes INT NOT NULL, 25 | ano INT NOT NULL, 26 | tentativas INT NOT NULL, 27 | PRIMARY KEY (email,dia,mes,ano), 28 | FOREIGN KEY (email) REFERENCES d_utilizador (email) 29 | ); 30 | 31 | 32 | 33 | # inserir dados na tabela d_tempo 34 | INSERT IGNORE INTO d_tempo (dia, mes, ano) 35 | SELECT DAY(L.moment), MONTH(L.moment), YEAR(L.moment) 36 | FROM login L; 37 | INSERT INTO d_tempo (NULL,NULL,NULL); 38 | 39 | # inserir dados na tabela d_utilizador 40 | INSERT INTO d_utilizador (email,nome,pais,categoria) 41 | SELECT U.email, U.nome, U.pais, U.categoria 42 | FROM utilizador U; 43 | 44 | # inserir dados na tabela tentativas_login 45 | INSERT INTO tentativas_login (tentativas,email,dia,mes,ano) 46 | SELECT COUNT(contador_login), U.email, DAY(L.moment), MONTH(L.moment), YEAR(L.moment) 47 | FROM utilizador U LEFT OUTER JOIN login L ON U.userid=L.userid 48 | GROUP BY U.userid, DAY(L.moment), MONTH(L.moment), YEAR(L.moment); 49 | 50 | 51 | 52 | 53 | # b) media de tentativas de login para todos os utilizadores de Portugal, em cada categoria, com rollup por ano e mes 54 | SELECT * FROM ( 55 | SELECT AVG(tentativas), T.email, T.ano, T.mes 56 | FROM tentativas_login T, d_utilizador U WHERE T.email=U.email 57 | AND U.pais="Portugal" 58 | GROUP BY U.categoria 59 | ) a 60 | GROUP BY ano,mes WITH ROLLUP; 61 | 62 | -------------------------------------------------------------------------------- /web/config.php: -------------------------------------------------------------------------------- 1 | set_charset("utf8"); 12 | 13 | ?> 14 | -------------------------------------------------------------------------------- /web/index.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Bloco de Notas 9 | 10 | 11 | 12 | 13 | 14 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 34 | 35 |
36 |
37 |

38 | 39 | 40 |
41 | 42 | O tipo de registo foi apagado com sucesso. 43 |
44 | query("UPDATE tipo_registo SET ativo=0 WHERE userid=$userid AND typecnt=$tipo_registo;"); 47 | } ?> 48 | 49 | 50 |
51 | 52 | A página foi apagada com sucesso. 53 |
54 | query("UPDATE pagina SET ativa=0 WHERE userid=$userid AND pagecounter=$page;"); 57 | } ?> 58 | 59 | 60 |
61 | 62 | A página "" foi criado com sucesso. 63 |
64 | query("INSERT INTO pagina (userid,pagecounter,nome,ativa) SELECT $userid,max(pagecounter)+1, '".$pageadd."',1 FROM pagina WHERE userid=$userid;"); 67 | } ?> 68 | 69 | 70 |
71 | 72 | O tipo de registo "" foi criado com sucesso. 73 |
74 | query("INSERT INTO tipo_registo (userid,typecnt,nome,ativo) SELECT $userid,max(typecnt)+1, '".$tipoadd."',1 FROM tipo_registo WHERE userid=$userid;"); 77 | } ?> 78 | 79 |
80 |
81 | 82 |
83 | 84 | 85 | query("SELECT pagecounter,nome FROM pagina WHERE userid=$userid AND ativa=1"); 87 | ?> 88 |
89 |
90 |
91 |
92 |
93 | 94 |
95 |
96 |
num_rows; ?>
97 |
Páginas
98 |
99 |
100 |
101 |
102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | num_rows > 0){ 113 | while($row = $paginas->fetch_assoc()) { 114 | ?> 115 | 116 | 117 | 118 | 138 | 139 | 140 | "; } ?> 141 | 142 |
#Nome
119 | Editar 120 | 121 | 137 |
(não há páginas)
143 |
144 | 145 | 150 | 151 | 172 |
173 |
174 | 175 | 176 | query("SELECT typecnt,nome FROM tipo_registo WHERE userid=$userid AND ativo=1"); 178 | ?> 179 |
180 |
181 |
182 |
183 |
184 | 185 |
186 |
187 |
num_rows; ?>
188 |
Tipos de registo
189 |
190 |
191 |
192 |
193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | num_rows > 0){ 204 | while($row = $tipos->fetch_assoc()) { 205 | ?> 206 | 207 | 208 | 209 | 229 | 230 | "; } ?> 231 | 232 |
#Nome
210 | Editar 211 | 212 | 228 |
(não há tipos de registo)
233 |
234 | 235 | 240 | 241 | 262 |
263 |
264 | 265 | 266 |
267 |
268 |
269 | 270 | 271 | 272 | 273 | 274 | close(); ?> 275 | 276 | 277 | 278 | -------------------------------------------------------------------------------- /web/login.php: -------------------------------------------------------------------------------- 1 | real_escape_string($_POST['email']); 9 | $password=$mysql->real_escape_string($_POST['password']); 10 | 11 | $login=$mysql->query("SELECT * FROM utilizador WHERE email='$email' AND password='$password'"); 12 | 13 | if($login->num_rows==1){ 14 | //session_register("userid"); 15 | $row = $login->fetch_assoc(); 16 | $_SESSION['userid']=$row['userid']; 17 | 18 | header("location: ./index.php"); 19 | exit; 20 | } 21 | else{ 22 | $error=1; 23 | } 24 | } 25 | 26 | ?> 27 | 28 | 29 | 30 | 31 | 32 | 33 | Bloco de Notas 34 | 35 | 36 | 37 | 38 | 39 | 43 | 44 | 45 | 46 |
47 | 48 |
49 | 50 |
51 |
52 | 53 | Email e/ou password errados! 54 |
55 | 56 | 57 | 58 |
59 |
60 |
61 | 85 |
86 |
87 |
88 | 89 | 90 | 91 | 92 | 93 | close(); ?> 94 | 95 | 96 | -------------------------------------------------------------------------------- /web/logout.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/pagina.php: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Bloco de Notas 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 38 | 39 |
40 | 41 | 42 |
43 |

44 | 45 | 46 | 47 | 48 |
49 | 50 | O registo foi adicionado com sucesso. 51 |
52 | query(" 57 | INSERT INTO registo (userid,typecounter, regcounter, nome,ativo) 58 | SELECT '".$userid."','".$typeid."', max(regcounter)+1, '".$nome_registo."','1' 59 | FROM registo WHERE userid='".$userid."'"); 60 | 61 | $reg = $mysql->query("SELECT max(regcounter) as regid FROM registo WHERE userid=$userid"); 62 | $regid = $reg->fetch_assoc(); 63 | $regid = $regid['regid']; 64 | 65 | 66 | $mysql->query(" 67 | INSERT INTO reg_pag (userid,pageid,typeid,regid,ativa) 68 | VALUES ('".$userid."','".$page."','".$typeid."','".$regid."','1') 69 | "); 70 | 71 | $campos = $mysql->query("SELECT C.campocnt, C.nome FROM tipo_registo T, campo C WHERE T.typecnt=C.typecnt AND C.ativo=1 AND T.typecnt=$typeid"); 72 | while($campo = $campos->fetch_assoc()) { 73 | $campo_id=$campo['campocnt']; 74 | $campo_valor=$_POST[$campo_id]; 75 | $mysql->query(" 76 | INSERT INTO valor (userid,typeid,regid,campoid,valor,ativo) 77 | SELECT $userid,$typeid,$regid,$campo_id,".'"'.$campo_valor.'"'.",1 78 | "); 79 | } 80 | 81 | } ?> 82 | 83 |
84 |
85 | 86 |
87 | 88 | 89 | query("SELECT pagecounter,nome FROM pagina WHERE userid=$userid AND pagecounter=$page AND ativa=1"); 91 | if($pagina->num_rows == 1){ 92 | $row = $pagina->fetch_assoc(); 93 | $pageid=$row['pagecounter']; 94 | ?> 95 |
96 |
97 |
98 |
99 |
100 | 101 |
102 |
103 |

104 | 105 |
106 |
107 |
108 | 109 | 131 | 132 | 133 |
134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | query(" 146 | SELECT A.regcounter, A.typecounter, A.campocnt, A.rnome, A.cnome, B.valor, B.idseq FROM ( 147 | SELECT R.regcounter, R.typecounter, C.campocnt, R.nome rnome, C.nome cnome 148 | FROM reg_pag RP, campo C, tipo_registo T, registo R 149 | WHERE RP.typeid=C.typecnt AND T.typecnt=RP.typeid AND RP.regid=R.regcounter 150 | AND RP.ativa=1 AND C.ativo=1 AND R.ativo=1 AND T.ativo=1 AND R.regcounter=RP.regid 151 | AND RP.pageid=$pageid 152 | ) A LEFT OUTER JOIN ( 153 | SELECT * FROM valor V WHERE V.ativo=1 154 | ) B ON A.regcounter=B.regid AND A.campocnt=B.campoid 155 | WHERE IF(B.valor IS NULL,1,B.idseq >= ALL( SELECT X.idseq FROM valor X WHERE X.regid=A.regcounter AND X.campoid=A.campocnt )) 156 | ORDER BY regcounter, campocnt 157 | "); 158 | if($registos->num_rows > 0){ 159 | $last=0; 160 | while($registo = $registos->fetch_assoc()) { 161 | $tipo_registo=$registo['typecounter']; 162 | if($registo['regcounter']!=$last){ 163 | if($last!=0){ ?>
#RegistosCampos
166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | "; } ?> 175 |
=
=
(não há registos associados)
176 | 177 | 178 |
179 | 180 | 185 | 186 | 260 |
261 |
262 | 263 | 264 | 265 |
266 |
267 |
268 | 269 | 270 | 271 | 272 | 273 | 278 | close(); ?> 279 | 280 | 281 | -------------------------------------------------------------------------------- /web/session.php: -------------------------------------------------------------------------------- 1 | real_escape_string($_SESSION['userid']); 7 | 8 | $login_query=$mysql->query("SELECT * FROM utilizador WHERE userid='$userid'"); 9 | 10 | if($login_query->num_rows != 1){ header("Location: ./login.php"); } 11 | 12 | $row = $login_query->fetch_assoc(); 13 | $userid = $row['userid']; 14 | 15 | ?> 16 | 17 | -------------------------------------------------------------------------------- /web/style.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - SB Admin 2 Bootstrap Admin Theme (http://startbootstrap.com) 3 | * Code licensed under the Apache License v2.0. 4 | * For details, see http://www.apache.org/licenses/LICENSE-2.0. 5 | */ 6 | 7 | body { 8 | background-color: #f8f8f8; 9 | } 10 | 11 | #wrapper { 12 | width: 100%; 13 | } 14 | 15 | #page-wrapper { 16 | padding: 0 15px; 17 | min-height: 568px; 18 | background-color: #fff; 19 | } 20 | 21 | @media(min-width:768px) { 22 | #page-wrapper { 23 | position: inherit; 24 | margin: 0 0 0 0px; 25 | padding: 0 30px; 26 | border-left: 1px solid #e7e7e7; 27 | } 28 | } 29 | 30 | .navbar-top-links { 31 | margin-right: 0; 32 | } 33 | 34 | .navbar-top-links li { 35 | display: inline-block; 36 | } 37 | 38 | .navbar-top-links li:last-child { 39 | margin-right: 15px; 40 | } 41 | 42 | .navbar-top-links li a { 43 | padding: 15px; 44 | min-height: 50px; 45 | } 46 | 47 | .navbar-top-links .dropdown-menu li { 48 | display: block; 49 | } 50 | 51 | .navbar-top-links .dropdown-menu li:last-child { 52 | margin-right: 0; 53 | } 54 | 55 | .navbar-top-links .dropdown-menu li a { 56 | padding: 3px 20px; 57 | min-height: 0; 58 | } 59 | 60 | .navbar-top-links .dropdown-menu li a div { 61 | white-space: normal; 62 | } 63 | 64 | .navbar-top-links .dropdown-messages, 65 | .navbar-top-links .dropdown-tasks, 66 | .navbar-top-links .dropdown-alerts { 67 | width: 310px; 68 | min-width: 0; 69 | } 70 | 71 | .navbar-top-links .dropdown-messages { 72 | margin-left: 5px; 73 | } 74 | 75 | .navbar-top-links .dropdown-tasks { 76 | margin-left: -59px; 77 | } 78 | 79 | .navbar-top-links .dropdown-alerts { 80 | margin-left: -123px; 81 | } 82 | 83 | .navbar-top-links .dropdown-user { 84 | right: 0; 85 | left: auto; 86 | } 87 | 88 | .sidebar .sidebar-nav.navbar-collapse { 89 | padding-right: 0; 90 | padding-left: 0; 91 | } 92 | 93 | .sidebar .sidebar-search { 94 | padding: 15px; 95 | } 96 | 97 | .sidebar ul li { 98 | border-bottom: 1px solid #e7e7e7; 99 | } 100 | 101 | .sidebar ul li a.active { 102 | background-color: #eee; 103 | } 104 | 105 | .sidebar .arrow { 106 | float: right; 107 | } 108 | 109 | .sidebar .fa.arrow:before { 110 | content: "\f104"; 111 | } 112 | 113 | .sidebar .active>a>.fa.arrow:before { 114 | content: "\f107"; 115 | } 116 | 117 | .sidebar .nav-second-level li, 118 | .sidebar .nav-third-level li { 119 | border-bottom: 0!important; 120 | } 121 | 122 | .sidebar .nav-second-level li a { 123 | padding-left: 37px; 124 | } 125 | 126 | .sidebar .nav-third-level li a { 127 | padding-left: 52px; 128 | } 129 | 130 | @media(min-width:768px) { 131 | .sidebar { 132 | z-index: 1; 133 | position: absolute; 134 | width: 250px; 135 | margin-top: 51px; 136 | } 137 | 138 | .navbar-top-links .dropdown-messages, 139 | .navbar-top-links .dropdown-tasks, 140 | .navbar-top-links .dropdown-alerts { 141 | margin-left: auto; 142 | } 143 | } 144 | 145 | .btn-outline { 146 | color: inherit; 147 | background-color: transparent; 148 | transition: all .5s; 149 | } 150 | 151 | .btn-primary.btn-outline { 152 | color: #428bca; 153 | } 154 | 155 | .btn-success.btn-outline { 156 | color: #5cb85c; 157 | } 158 | 159 | .btn-info.btn-outline { 160 | color: #5bc0de; 161 | } 162 | 163 | .btn-warning.btn-outline { 164 | color: #f0ad4e; 165 | } 166 | 167 | .btn-danger.btn-outline { 168 | color: #d9534f; 169 | } 170 | 171 | .btn-primary.btn-outline:hover, 172 | .btn-success.btn-outline:hover, 173 | .btn-info.btn-outline:hover, 174 | .btn-warning.btn-outline:hover, 175 | .btn-danger.btn-outline:hover { 176 | color: #fff; 177 | } 178 | 179 | .chat { 180 | margin: 0; 181 | padding: 0; 182 | list-style: none; 183 | } 184 | 185 | .chat li { 186 | margin-bottom: 10px; 187 | padding-bottom: 5px; 188 | border-bottom: 1px dotted #999; 189 | } 190 | 191 | .chat li.left .chat-body { 192 | margin-left: 60px; 193 | } 194 | 195 | .chat li.right .chat-body { 196 | margin-right: 60px; 197 | } 198 | 199 | .chat li .chat-body p { 200 | margin: 0; 201 | } 202 | 203 | .panel .slidedown .glyphicon, 204 | .chat .glyphicon { 205 | margin-right: 5px; 206 | } 207 | 208 | .chat-panel .panel-body { 209 | height: 350px; 210 | overflow-y: scroll; 211 | } 212 | 213 | .login-panel { 214 | margin-top: 25%; 215 | } 216 | 217 | .flot-chart { 218 | display: block; 219 | height: 400px; 220 | } 221 | 222 | .flot-chart-content { 223 | width: 100%; 224 | height: 100%; 225 | } 226 | 227 | .dataTables_wrapper { 228 | position: relative; 229 | clear: both; 230 | } 231 | 232 | table.dataTable thead .sorting, 233 | table.dataTable thead .sorting_asc, 234 | table.dataTable thead .sorting_desc, 235 | table.dataTable thead .sorting_asc_disabled, 236 | table.dataTable thead .sorting_desc_disabled { 237 | background: 0 0; 238 | } 239 | 240 | table.dataTable thead .sorting_asc:after { 241 | content: "\f0de"; 242 | float: right; 243 | font-family: fontawesome; 244 | } 245 | 246 | table.dataTable thead .sorting_desc:after { 247 | content: "\f0dd"; 248 | float: right; 249 | font-family: fontawesome; 250 | } 251 | 252 | table.dataTable thead .sorting:after { 253 | content: "\f0dc"; 254 | float: right; 255 | font-family: fontawesome; 256 | color: rgba(50,50,50,.5); 257 | } 258 | 259 | .btn-circle { 260 | width: 30px; 261 | height: 30px; 262 | padding: 6px 0; 263 | border-radius: 15px; 264 | text-align: center; 265 | font-size: 12px; 266 | line-height: 1.428571429; 267 | } 268 | 269 | .btn-circle.btn-lg { 270 | width: 50px; 271 | height: 50px; 272 | padding: 10px 16px; 273 | border-radius: 25px; 274 | font-size: 18px; 275 | line-height: 1.33; 276 | } 277 | 278 | .btn-circle.btn-xl { 279 | width: 70px; 280 | height: 70px; 281 | padding: 10px 16px; 282 | border-radius: 35px; 283 | font-size: 24px; 284 | line-height: 1.33; 285 | } 286 | 287 | .show-grid [class^=col-] { 288 | padding-top: 10px; 289 | padding-bottom: 10px; 290 | border: 1px solid #ddd; 291 | background-color: #eee!important; 292 | } 293 | 294 | .show-grid { 295 | margin: 15px 0; 296 | } 297 | 298 | .huge { 299 | font-size: 40px; 300 | } 301 | 302 | .panel-green { 303 | border-color: #5cb85c; 304 | } 305 | 306 | .panel-green .panel-heading { 307 | border-color: #5cb85c; 308 | color: #fff; 309 | background-color: #5cb85c; 310 | } 311 | 312 | .panel-green a { 313 | color: #5cb85c; 314 | } 315 | 316 | .panel-green a:hover { 317 | color: #3d8b3d; 318 | } 319 | 320 | .panel-red { 321 | border-color: #d9534f; 322 | } 323 | 324 | .panel-red .panel-heading { 325 | border-color: #d9534f; 326 | color: #fff; 327 | background-color: #d9534f; 328 | } 329 | 330 | .panel-red a { 331 | color: #d9534f; 332 | } 333 | 334 | .panel-red a:hover { 335 | color: #b52b27; 336 | } 337 | 338 | .panel-yellow { 339 | border-color: #f0ad4e; 340 | } 341 | 342 | .panel-yellow .panel-heading { 343 | border-color: #f0ad4e; 344 | color: #fff; 345 | background-color: #f0ad4e; 346 | } 347 | 348 | .panel-yellow a { 349 | color: #f0ad4e; 350 | } 351 | 352 | .panel-yellow a:hover { 353 | color: #df8a13; 354 | } 355 | 356 | 357 | 358 | 359 | /* N1Z */ 360 | .navbar-toggle { display:none;} 361 | .navbar{ margin-bottom: 0; } 362 | table tr td:last-child { text-align: right; } 363 | .modal{ text-align: left; } 364 | .modal a{ color:#fff;} 365 | .table a.btn{ color:#fff;} 366 | 367 | .navbar-header a{ float:left; } 368 | .navbar-header a.fa{ margin:19px 5px 0 20px;} 369 | td.campos{ padding:0 !important; width:40%;} 370 | .campos table.table{ background:none; margin: 0; text-align: left; } 371 | .campos table tr:first-child td{ border-top:none; } 372 | .campos table tr td:first-child{ width:50%; } 373 | .campos table tr td:nth-child(2){ width:10%; } 374 | .campos table tr td:last-child{ width:40%; } 375 | .panel .text-right a{ color:#fff;} -------------------------------------------------------------------------------- /web/tipo.php: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Bloco de Notas 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 37 | 38 |
39 | 40 | 41 |
42 |

43 | 44 | 45 |
46 | 47 | O campo foi apagado com sucesso. 48 |
49 | query("UPDATE campo SET ativo=0 WHERE userid=$userid AND campocnt=$campo_del;"); 52 | } ?> 53 | 54 | 55 | 56 |
57 | 58 | O campo foi adicionado com sucesso. 59 |
60 | query(" 64 | INSERT INTO campo (userid,nome,typecnt,campocnt,ativo) 65 | SELECT '".$userid."','".$nome_campo."','".$tipo."', max(typecnt)+1,'1' 66 | FROM campo WHERE userid='".$userid."' AND typecnt='".$tipo."' 67 | "); 68 | 69 | } ?> 70 | 71 |
72 |
73 | 74 |
75 | 76 | 77 | query("SELECT typecnt,nome FROM tipo_registo WHERE userid=$userid AND typecnt=$tipo AND ativo=1"); 79 | if($tipo->num_rows == 1){ 80 | $row = $tipo->fetch_assoc(); 81 | $tipoid=$row['typecnt']; 82 | ?> 83 |
84 |
85 |
86 |
87 |
88 | 89 |
90 |
91 |

92 | 93 |
94 |
95 |
96 | 97 | 119 | 120 | 121 |
122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | query(" 133 | SELECT campocnt,nome FROM campo WHERE userid=$userid AND typecnt=$tipoid AND ativo=1 134 | "); 135 | if($campos->num_rows > 0){ 136 | while($campo = $campos->fetch_assoc()) { 137 | ?> 138 | 139 | 140 | 141 | 161 | 162 | "; } ?> 163 | 164 |
#Campos
142 | 143 | 159 | 160 |
(Não há campos para este tipo de registo)
165 |
166 | 167 | 168 | 173 | 174 | 196 |
197 |
198 | 199 | 200 | 201 |
202 |
203 |
204 | 205 | 206 | 207 | 208 | 209 | close(); ?> 210 | 211 | 212 | -------------------------------------------------------------------------------- /web/transacoes/config.php: -------------------------------------------------------------------------------- 1 | set_charset("utf8"); 12 | 13 | ?> 14 | -------------------------------------------------------------------------------- /web/transacoes/index.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Bloco de Notas 9 | 10 | 11 | 12 | 13 | 14 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 34 | 35 |
36 |
37 |

38 | 39 | 40 |
41 | 42 | O tipo de registo foi apagado com sucesso. 43 |
44 | query("UPDATE tipo_registo SET ativo=0 WHERE userid=$userid AND typecnt=$tipo_registo;"); 47 | } ?> 48 | 49 | 50 |
51 | 52 | A página foi apagada com sucesso. 53 |
54 | query("UPDATE pagina SET ativa=0 WHERE userid=$userid AND pagecounter=$page;"); 57 | } ?> 58 | 59 | 60 |
61 | 62 | A página "" foi criado com sucesso. 63 |
64 | query("INSERT INTO pagina (userid,pagecounter,nome,ativa) SELECT $userid,max(pagecounter)+1, '".$pageadd."',1 FROM pagina WHERE userid=$userid;"); 67 | } ?> 68 | 69 | 70 |
71 | 72 | O tipo de registo "" foi criado com sucesso. 73 |
74 | query("INSERT INTO tipo_registo (userid,typecnt,nome,ativo) SELECT $userid,max(typecnt)+1, '".$tipoadd."',1 FROM tipo_registo WHERE userid=$userid;"); 77 | } ?> 78 | 79 |
80 |
81 | 82 |
83 | 84 | 85 | query("SELECT pagecounter,nome FROM pagina WHERE userid=$userid AND ativa=1"); 87 | ?> 88 |
89 |
90 |
91 |
92 |
93 | 94 |
95 |
96 |
num_rows; ?>
97 |
Páginas
98 |
99 |
100 |
101 |
102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | num_rows > 0){ 113 | while($row = $paginas->fetch_assoc()) { 114 | ?> 115 | 116 | 117 | 118 | 138 | 139 | 140 | "; } ?> 141 | 142 |
#Nome
119 | Editar 120 | 121 | 137 |
(não há páginas)
143 |
144 | 145 | 150 | 151 | 172 |
173 |
174 | 175 | 176 | query("SELECT typecnt,nome FROM tipo_registo WHERE userid=$userid AND ativo=1"); 178 | ?> 179 |
180 |
181 |
182 |
183 |
184 | 185 |
186 |
187 |
num_rows; ?>
188 |
Tipos de registo
189 |
190 |
191 |
192 |
193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | num_rows > 0){ 204 | while($row = $tipos->fetch_assoc()) { 205 | ?> 206 | 207 | 208 | 209 | 229 | 230 | "; } ?> 231 | 232 |
#Nome
210 | Editar 211 | 212 | 228 |
(não há tipos de registo)
233 |
234 | 235 | 240 | 241 | 262 |
263 |
264 | 265 | 266 |
267 |
268 |
269 | 270 | 271 | 272 | 273 | 274 | close(); ?> 275 | 276 | 277 | 278 | -------------------------------------------------------------------------------- /web/transacoes/login.php: -------------------------------------------------------------------------------- 1 | real_escape_string($_POST['email']); 9 | $password=$mysql->real_escape_string($_POST['password']); 10 | 11 | $login=$mysql->query("SELECT * FROM utilizador WHERE email='$email' AND password='$password'"); 12 | 13 | if($login->num_rows==1){ 14 | //session_register("userid"); 15 | $row = $login->fetch_assoc(); 16 | $_SESSION['userid']=$row['userid']; 17 | 18 | header("location: ./index.php"); 19 | exit; 20 | } 21 | else{ 22 | $error=1; 23 | } 24 | } 25 | 26 | ?> 27 | 28 | 29 | 30 | 31 | 32 | 33 | Bloco de Notas 34 | 35 | 36 | 37 | 38 | 39 | 43 | 44 | 45 | 46 |
47 | 48 |
49 | 50 |
51 |
52 | 53 | Email e/ou password errados! 54 |
55 | 56 | 57 | 58 |
59 |
60 |
61 | 85 |
86 |
87 |
88 | 89 | 90 | 91 | 92 | 93 | close(); ?> 94 | 95 | 96 | -------------------------------------------------------------------------------- /web/transacoes/logout.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/transacoes/pagina.php: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Bloco de Notas 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 38 | 39 |
40 | 41 | 42 |
43 |

44 | 45 | begin_transaction(MYSQLI_TRANS_START_READ_WRITE); 51 | 52 | $mysql->query(" 53 | INSERT INTO registo (userid,typecounter, regcounter, nome,ativo) 54 | SELECT '".$userid."','".$typeid."', max(regcounter)+1, '".$nome_registo."','1' 55 | FROM registo WHERE userid='".$userid."'"); 56 | 57 | $reg = $mysql->query("SELECT max(regcounter) as regid FROM registo WHERE userid=$userid"); 58 | $regid = $reg->fetch_assoc(); 59 | $regid = $regid['regid']; 60 | 61 | 62 | $mysql->query(" 63 | INSERT INTO reg_pag (userid,pageid,typeid,regid,ativa) 64 | VALUES ('".$userid."','".$page."','".$typeid."','".$regid."','1') 65 | "); 66 | 67 | $campos = $mysql->query("SELECT C.campocnt, C.nome FROM tipo_registo T, campo C WHERE T.typecnt=C.typecnt AND C.ativo=1 AND T.typecnt=$typeid"); 68 | while($campo = $campos->fetch_assoc()) { 69 | $campo_id=$campo['campocnt']; 70 | $campo_valor=$_POST[$campo_id]; 71 | $mysql->query(" 72 | INSERT INTO valor (userid,typeid,regid,campoid,valor,ativo) 73 | SELECT $userid,$typeid,$regid,$campo_id,".'"'.$campo_valor.'"'.",1 74 | "); 75 | } 76 | $mysql->commit(); 77 | ?> 78 |
79 | 80 | O registo foi adicionado com sucesso. 81 |
82 | rollback(); 85 | ?> 86 | 87 |
88 | 89 | Erro ao adicionar o registo . 90 |
91 | 92 | 94 | 95 |
96 |
97 | 98 |
99 | 100 | 101 | query("SELECT pagecounter,nome FROM pagina WHERE userid=$userid AND pagecounter=$page AND ativa=1"); 103 | if($pagina->num_rows == 1){ 104 | $row = $pagina->fetch_assoc(); 105 | $pageid=$row['pagecounter']; 106 | ?> 107 |
108 |
109 |
110 |
111 |
112 | 113 |
114 |
115 |

116 | 117 |
118 |
119 |
120 | 121 | 143 | 144 | 145 |
146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | query(" 158 | SELECT A.regcounter, A.typecounter, A.campocnt, A.rnome, A.cnome, B.valor, B.idseq FROM ( 159 | SELECT R.regcounter, R.typecounter, C.campocnt, R.nome rnome, C.nome cnome 160 | FROM reg_pag RP, campo C, tipo_registo T, registo R 161 | WHERE RP.typeid=C.typecnt AND T.typecnt=RP.typeid AND RP.regid=R.regcounter 162 | AND RP.ativa=1 AND C.ativo=1 AND R.ativo=1 AND T.ativo=1 AND R.regcounter=RP.regid 163 | AND RP.pageid=$pageid 164 | ) A LEFT OUTER JOIN ( 165 | SELECT * FROM valor V WHERE V.ativo=1 166 | ) B ON A.regcounter=B.regid AND A.campocnt=B.campoid 167 | WHERE IF(B.valor IS NULL,1,B.idseq >= ALL( SELECT X.idseq FROM valor X WHERE X.regid=A.regcounter AND X.campoid=A.campocnt )) 168 | ORDER BY regcounter, campocnt 169 | "); 170 | if($registos->num_rows > 0){ 171 | $last=0; 172 | while($registo = $registos->fetch_assoc()) { 173 | $tipo_registo=$registo['typecounter']; 174 | if($registo['regcounter']!=$last){ 175 | if($last!=0){ ?>
#RegistosCampos
178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | "; } ?> 187 |
=
=
(não há registos associados)
188 | 189 | 190 |
191 | 192 | 197 | 198 | 272 |
273 |
274 | 275 | 276 | 277 |
278 |
279 |
280 | 281 | 282 | 283 | 284 | 285 | 290 | close(); ?> 291 | 292 | 293 | -------------------------------------------------------------------------------- /web/transacoes/session.php: -------------------------------------------------------------------------------- 1 | real_escape_string($_SESSION['userid']); 7 | 8 | $login_query=$mysql->query("SELECT * FROM utilizador WHERE userid='$userid'"); 9 | 10 | if($login_query->num_rows != 1){ header("Location: ./login.php"); } 11 | 12 | $row = $login_query->fetch_assoc(); 13 | $userid = $row['userid']; 14 | 15 | ?> 16 | 17 | -------------------------------------------------------------------------------- /web/transacoes/style.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - SB Admin 2 Bootstrap Admin Theme (http://startbootstrap.com) 3 | * Code licensed under the Apache License v2.0. 4 | * For details, see http://www.apache.org/licenses/LICENSE-2.0. 5 | */ 6 | 7 | body { 8 | background-color: #f8f8f8; 9 | } 10 | 11 | #wrapper { 12 | width: 100%; 13 | } 14 | 15 | #page-wrapper { 16 | padding: 0 15px; 17 | min-height: 568px; 18 | background-color: #fff; 19 | } 20 | 21 | @media(min-width:768px) { 22 | #page-wrapper { 23 | position: inherit; 24 | margin: 0 0 0 0px; 25 | padding: 0 30px; 26 | border-left: 1px solid #e7e7e7; 27 | } 28 | } 29 | 30 | .navbar-top-links { 31 | margin-right: 0; 32 | } 33 | 34 | .navbar-top-links li { 35 | display: inline-block; 36 | } 37 | 38 | .navbar-top-links li:last-child { 39 | margin-right: 15px; 40 | } 41 | 42 | .navbar-top-links li a { 43 | padding: 15px; 44 | min-height: 50px; 45 | } 46 | 47 | .navbar-top-links .dropdown-menu li { 48 | display: block; 49 | } 50 | 51 | .navbar-top-links .dropdown-menu li:last-child { 52 | margin-right: 0; 53 | } 54 | 55 | .navbar-top-links .dropdown-menu li a { 56 | padding: 3px 20px; 57 | min-height: 0; 58 | } 59 | 60 | .navbar-top-links .dropdown-menu li a div { 61 | white-space: normal; 62 | } 63 | 64 | .navbar-top-links .dropdown-messages, 65 | .navbar-top-links .dropdown-tasks, 66 | .navbar-top-links .dropdown-alerts { 67 | width: 310px; 68 | min-width: 0; 69 | } 70 | 71 | .navbar-top-links .dropdown-messages { 72 | margin-left: 5px; 73 | } 74 | 75 | .navbar-top-links .dropdown-tasks { 76 | margin-left: -59px; 77 | } 78 | 79 | .navbar-top-links .dropdown-alerts { 80 | margin-left: -123px; 81 | } 82 | 83 | .navbar-top-links .dropdown-user { 84 | right: 0; 85 | left: auto; 86 | } 87 | 88 | .sidebar .sidebar-nav.navbar-collapse { 89 | padding-right: 0; 90 | padding-left: 0; 91 | } 92 | 93 | .sidebar .sidebar-search { 94 | padding: 15px; 95 | } 96 | 97 | .sidebar ul li { 98 | border-bottom: 1px solid #e7e7e7; 99 | } 100 | 101 | .sidebar ul li a.active { 102 | background-color: #eee; 103 | } 104 | 105 | .sidebar .arrow { 106 | float: right; 107 | } 108 | 109 | .sidebar .fa.arrow:before { 110 | content: "\f104"; 111 | } 112 | 113 | .sidebar .active>a>.fa.arrow:before { 114 | content: "\f107"; 115 | } 116 | 117 | .sidebar .nav-second-level li, 118 | .sidebar .nav-third-level li { 119 | border-bottom: 0!important; 120 | } 121 | 122 | .sidebar .nav-second-level li a { 123 | padding-left: 37px; 124 | } 125 | 126 | .sidebar .nav-third-level li a { 127 | padding-left: 52px; 128 | } 129 | 130 | @media(min-width:768px) { 131 | .sidebar { 132 | z-index: 1; 133 | position: absolute; 134 | width: 250px; 135 | margin-top: 51px; 136 | } 137 | 138 | .navbar-top-links .dropdown-messages, 139 | .navbar-top-links .dropdown-tasks, 140 | .navbar-top-links .dropdown-alerts { 141 | margin-left: auto; 142 | } 143 | } 144 | 145 | .btn-outline { 146 | color: inherit; 147 | background-color: transparent; 148 | transition: all .5s; 149 | } 150 | 151 | .btn-primary.btn-outline { 152 | color: #428bca; 153 | } 154 | 155 | .btn-success.btn-outline { 156 | color: #5cb85c; 157 | } 158 | 159 | .btn-info.btn-outline { 160 | color: #5bc0de; 161 | } 162 | 163 | .btn-warning.btn-outline { 164 | color: #f0ad4e; 165 | } 166 | 167 | .btn-danger.btn-outline { 168 | color: #d9534f; 169 | } 170 | 171 | .btn-primary.btn-outline:hover, 172 | .btn-success.btn-outline:hover, 173 | .btn-info.btn-outline:hover, 174 | .btn-warning.btn-outline:hover, 175 | .btn-danger.btn-outline:hover { 176 | color: #fff; 177 | } 178 | 179 | .chat { 180 | margin: 0; 181 | padding: 0; 182 | list-style: none; 183 | } 184 | 185 | .chat li { 186 | margin-bottom: 10px; 187 | padding-bottom: 5px; 188 | border-bottom: 1px dotted #999; 189 | } 190 | 191 | .chat li.left .chat-body { 192 | margin-left: 60px; 193 | } 194 | 195 | .chat li.right .chat-body { 196 | margin-right: 60px; 197 | } 198 | 199 | .chat li .chat-body p { 200 | margin: 0; 201 | } 202 | 203 | .panel .slidedown .glyphicon, 204 | .chat .glyphicon { 205 | margin-right: 5px; 206 | } 207 | 208 | .chat-panel .panel-body { 209 | height: 350px; 210 | overflow-y: scroll; 211 | } 212 | 213 | .login-panel { 214 | margin-top: 25%; 215 | } 216 | 217 | .flot-chart { 218 | display: block; 219 | height: 400px; 220 | } 221 | 222 | .flot-chart-content { 223 | width: 100%; 224 | height: 100%; 225 | } 226 | 227 | .dataTables_wrapper { 228 | position: relative; 229 | clear: both; 230 | } 231 | 232 | table.dataTable thead .sorting, 233 | table.dataTable thead .sorting_asc, 234 | table.dataTable thead .sorting_desc, 235 | table.dataTable thead .sorting_asc_disabled, 236 | table.dataTable thead .sorting_desc_disabled { 237 | background: 0 0; 238 | } 239 | 240 | table.dataTable thead .sorting_asc:after { 241 | content: "\f0de"; 242 | float: right; 243 | font-family: fontawesome; 244 | } 245 | 246 | table.dataTable thead .sorting_desc:after { 247 | content: "\f0dd"; 248 | float: right; 249 | font-family: fontawesome; 250 | } 251 | 252 | table.dataTable thead .sorting:after { 253 | content: "\f0dc"; 254 | float: right; 255 | font-family: fontawesome; 256 | color: rgba(50,50,50,.5); 257 | } 258 | 259 | .btn-circle { 260 | width: 30px; 261 | height: 30px; 262 | padding: 6px 0; 263 | border-radius: 15px; 264 | text-align: center; 265 | font-size: 12px; 266 | line-height: 1.428571429; 267 | } 268 | 269 | .btn-circle.btn-lg { 270 | width: 50px; 271 | height: 50px; 272 | padding: 10px 16px; 273 | border-radius: 25px; 274 | font-size: 18px; 275 | line-height: 1.33; 276 | } 277 | 278 | .btn-circle.btn-xl { 279 | width: 70px; 280 | height: 70px; 281 | padding: 10px 16px; 282 | border-radius: 35px; 283 | font-size: 24px; 284 | line-height: 1.33; 285 | } 286 | 287 | .show-grid [class^=col-] { 288 | padding-top: 10px; 289 | padding-bottom: 10px; 290 | border: 1px solid #ddd; 291 | background-color: #eee!important; 292 | } 293 | 294 | .show-grid { 295 | margin: 15px 0; 296 | } 297 | 298 | .huge { 299 | font-size: 40px; 300 | } 301 | 302 | .panel-green { 303 | border-color: #5cb85c; 304 | } 305 | 306 | .panel-green .panel-heading { 307 | border-color: #5cb85c; 308 | color: #fff; 309 | background-color: #5cb85c; 310 | } 311 | 312 | .panel-green a { 313 | color: #5cb85c; 314 | } 315 | 316 | .panel-green a:hover { 317 | color: #3d8b3d; 318 | } 319 | 320 | .panel-red { 321 | border-color: #d9534f; 322 | } 323 | 324 | .panel-red .panel-heading { 325 | border-color: #d9534f; 326 | color: #fff; 327 | background-color: #d9534f; 328 | } 329 | 330 | .panel-red a { 331 | color: #d9534f; 332 | } 333 | 334 | .panel-red a:hover { 335 | color: #b52b27; 336 | } 337 | 338 | .panel-yellow { 339 | border-color: #f0ad4e; 340 | } 341 | 342 | .panel-yellow .panel-heading { 343 | border-color: #f0ad4e; 344 | color: #fff; 345 | background-color: #f0ad4e; 346 | } 347 | 348 | .panel-yellow a { 349 | color: #f0ad4e; 350 | } 351 | 352 | .panel-yellow a:hover { 353 | color: #df8a13; 354 | } 355 | 356 | 357 | 358 | 359 | /* N1Z */ 360 | .navbar-toggle { display:none;} 361 | .navbar{ margin-bottom: 0; } 362 | table tr td:last-child { text-align: right; } 363 | .modal{ text-align: left; } 364 | .modal a{ color:#fff;} 365 | .table a.btn{ color:#fff;} 366 | 367 | .navbar-header a{ float:left; } 368 | .navbar-header a.fa{ margin:19px 5px 0 20px;} 369 | td.campos{ padding:0 !important; width:40%;} 370 | .campos table.table{ background:none; margin: 0; text-align: left; } 371 | .campos table tr:first-child td{ border-top:none; } 372 | .campos table tr td:first-child{ width:50%; } 373 | .campos table tr td:nth-child(2){ width:10%; } 374 | .campos table tr td:last-child{ width:40%; } 375 | .panel .text-right a{ color:#fff;} -------------------------------------------------------------------------------- /web/transacoes/tipo.php: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Bloco de Notas 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 37 | 38 |
39 | 40 | 41 |
42 |

43 | 44 | 45 |
46 | 47 | O campo foi apagado com sucesso. 48 |
49 | query("UPDATE campo SET ativo=0 WHERE userid=$userid AND campocnt=$campo_del;"); 52 | } ?> 53 | 54 | 55 | 56 |
57 | 58 | O campo foi adicionado com sucesso. 59 |
60 | query(" 64 | INSERT INTO campo (userid,nome,typecnt,campocnt,ativo) 65 | SELECT '".$userid."','".$nome_campo."','".$tipo."', max(typecnt)+1,'1' 66 | FROM campo WHERE userid='".$userid."' AND typecnt='".$tipo."' 67 | "); 68 | 69 | } ?> 70 | 71 |
72 |
73 | 74 |
75 | 76 | 77 | query("SELECT typecnt,nome FROM tipo_registo WHERE userid=$userid AND typecnt=$tipo AND ativo=1"); 79 | if($tipo->num_rows == 1){ 80 | $row = $tipo->fetch_assoc(); 81 | $tipoid=$row['typecnt']; 82 | ?> 83 |
84 |
85 |
86 |
87 |
88 | 89 |
90 |
91 |

92 | 93 |
94 |
95 |
96 | 97 | 119 | 120 | 121 |
122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | query(" 133 | SELECT campocnt,nome FROM campo WHERE userid=$userid AND typecnt=$tipoid AND ativo=1 134 | "); 135 | if($campos->num_rows > 0){ 136 | while($campo = $campos->fetch_assoc()) { 137 | ?> 138 | 139 | 140 | 141 | 161 | 162 | "; } ?> 163 | 164 |
#Campos
142 | 143 | 159 | 160 |
(Não há campos para este tipo de registo)
165 |
166 | 167 | 168 | 173 | 174 | 196 |
197 |
198 | 199 | 200 | 201 |
202 |
203 |
204 | 205 | 206 | 207 | 208 | 209 | close(); ?> 210 | 211 | 212 | --------------------------------------------------------------------------------