├── 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 |
25 |
28 |
33 |
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 | Nome
107 |
108 |
109 |
110 |
111 | num_rows > 0){
113 | while($row = $paginas->fetch_assoc()) {
114 | ?>
115 |
116 |
117 |
118 |
119 | Editar
120 | Apagar
121 |
122 |
123 |
124 |
127 |
128 | Apagar a página ""
129 |
130 |
134 |
135 |
136 |
137 |
138 |
139 |
140 | (não há páginas) "; } ?>
141 |
142 |
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 | Nome
198 |
199 |
200 |
201 |
202 | num_rows > 0){
204 | while($row = $tipos->fetch_assoc()) {
205 | ?>
206 |
207 |
208 |
209 |
210 | Editar
211 | Apagar
212 |
213 |
214 |
215 |
218 |
219 | Apagar o tipo de registo ""
220 |
221 |
225 |
226 |
227 |
228 |
229 |
230 | (não há tipos de registo) "; } ?>
231 |
232 |
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 |
62 |
63 |
Sign In
64 |
65 |
84 |
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 |
29 |
32 |
37 |
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 |
106 |
107 |
108 |
109 |
131 |
132 |
133 |
134 |
135 |
136 |
137 | #
138 | Registos
139 | Campos
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){ ?>
166 |
167 |
168 |
169 |
170 |
171 | =
172 |
173 | =
174 | (não há registos associados) "; } ?>
175 |
176 |
177 |
178 |
179 |
180 |
185 |
186 |
187 |
188 |
189 |
192 |
193 |
194 | query("SELECT T.nome,T.typecnt FROM tipo_registo T WHERE T.userid=$userid AND T.ativo=1");
196 | while($tipo = $tipos->fetch_assoc()) {
197 | ?>
198 |
199 |
200 |
201 |
202 | query("SELECT T.nome,T.typecnt FROM tipo_registo T WHERE T.userid=$userid AND T.ativo=1");
204 | while($tipo = $tipos->fetch_assoc()) {
205 | ?>
206 |
207 |
208 |
209 |
210 |
211 | query("SELECT T.nome,T.typecnt FROM tipo_registo T WHERE T.userid=$userid AND T.ativo=1");
213 | while($tipo = $tipos->fetch_assoc()) {
214 | ?>
215 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
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 |
28 |
31 |
36 |
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 |
96 |
97 |
119 |
120 |
121 |
122 |
123 |
124 |
125 | #
126 | Campos
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 |
142 | Apagar
143 |
144 |
145 |
146 |
149 |
150 | Apagar o campo ""
151 |
152 |
156 |
157 |
158 |
159 |
160 |
161 |
162 | (Não há campos para este tipo de registo) "; } ?>
163 |
164 |
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 |
25 |
28 |
33 |
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 | Nome
107 |
108 |
109 |
110 |
111 | num_rows > 0){
113 | while($row = $paginas->fetch_assoc()) {
114 | ?>
115 |
116 |
117 |
118 |
119 | Editar
120 | Apagar
121 |
122 |
123 |
124 |
127 |
128 | Apagar a página ""
129 |
130 |
134 |
135 |
136 |
137 |
138 |
139 |
140 | (não há páginas) "; } ?>
141 |
142 |
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 | Nome
198 |
199 |
200 |
201 |
202 | num_rows > 0){
204 | while($row = $tipos->fetch_assoc()) {
205 | ?>
206 |
207 |
208 |
209 |
210 | Editar
211 | Apagar
212 |
213 |
214 |
215 |
218 |
219 | Apagar o tipo de registo ""
220 |
221 |
225 |
226 |
227 |
228 |
229 |
230 | (não há tipos de registo) "; } ?>
231 |
232 |
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 |
62 |
63 |
Sign In
64 |
65 |
84 |
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 |
29 |
32 |
37 |
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 |
118 |
119 |
120 |
121 |
143 |
144 |
145 |
146 |
147 |
148 |
149 | #
150 | Registos
151 | Campos
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){ ?>
178 |
179 |
180 |
181 |
182 |
183 | =
184 |
185 | =
186 | (não há registos associados) "; } ?>
187 |
188 |
189 |
190 |
191 |
192 |
197 |
198 |
199 |
200 |
201 |
204 |
205 |
206 | query("SELECT T.nome,T.typecnt FROM tipo_registo T WHERE T.userid=$userid AND T.ativo=1");
208 | while($tipo = $tipos->fetch_assoc()) {
209 | ?>
210 |
211 |
212 |
213 |
214 | query("SELECT T.nome,T.typecnt FROM tipo_registo T WHERE T.userid=$userid AND T.ativo=1");
216 | while($tipo = $tipos->fetch_assoc()) {
217 | ?>
218 |
219 |
220 |
221 |
222 |
223 | query("SELECT T.nome,T.typecnt FROM tipo_registo T WHERE T.userid=$userid AND T.ativo=1");
225 | while($tipo = $tipos->fetch_assoc()) {
226 | ?>
227 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
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 |
28 |
31 |
36 |
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 |
96 |
97 |
119 |
120 |
121 |
122 |
123 |
124 |
125 | #
126 | Campos
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 |
142 | Apagar
143 |
144 |
145 |
146 |
149 |
150 | Apagar o campo ""
151 |
152 |
156 |
157 |
158 |
159 |
160 |
161 |
162 | (Não há campos para este tipo de registo) "; } ?>
163 |
164 |
165 |
166 |
167 |
168 |
173 |
174 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 | close(); ?>
210 |
211 |
212 |
--------------------------------------------------------------------------------