Você está na página 1de 50

SIA-MEE 2023/24

Projeto
Desenvolvimento de um sistema WEB de Gestão de
questionários, tipo Kahoot

Rúben Filipe Tavares Oliveira 2020147218


Gonçalo André Pinheiro Castelo Ferreira 2020142102

1
Índice
Base de dados ............................................................................................................................. 3
Interface ...................................................................................................................................... 4
Página de apresentação: ......................................................................................................... 4
Login ........................................................................................................................................ 4
Registo ..................................................................................................................................... 5
Visualização de todos os Registados ....................................................................................... 6
Criar Kahoot ............................................................................................................................ 6
Login Parte do Aluno ............................................................................................................... 7
Respostas Parte do Aluno........................................................................................................ 7
Explicação breve da parte de código ....................................................................................... 8
Conclusão: ................................................................................................................................. 49

2
Base de dados
Numa fase inicial começou-se com o seguinte esquema da base de dados:

Como chaves estrangeiras tinhas o seguinte proposto:

“idPerguntas” da tabela “perguntas” era chave estrangeira do “nPergunta” da tabela


“respostaAlunos”

O “idQuetionario da tabela “questionários” era a chave estrangeira “nQuestionario” da tabela


“perguntas” e “nQuestionario” da tabela “respostasAlunos”.

Porém não foi possível carregar para o xamp estas tabelas. Por isso optamos por mudar as
tabelas passando a não ter chaves estrangeiras, ao custo da procura e aumentar a dificuldade a
escrever/ler da bd.

Sem ligação entre tabelas.

3
Interface
Página de apresentação:
Aqui o utilizador pode optar entre criar conta ou fazer o login:

Login
Nesta parte é apresentada uma janela simples na qual é pedido o email do utilizador e a
password e é feita a distinção entre aluno e professor.

4
Registo
Nesta página é pedido a quem frequenta a página para criar utilizador com o preenchimento
de alguns dados pessoais:

5
Visualização de todos os Registados

Aqui é possível modificar os dados das tabelas carregando no lápis e eliminar todos os dados
carregando no caixote do lixo. Também é possível ir para o menu de criação de perguntas onde
diz kahoot.

Criar Kahoot
Nesta parte o usuário com aceso “Professor” é capaz de adicionar o número do questionário,
código, perguntas e as respostas.

6
Login Parte do Aluno
Nesta parte o aluno será redirecionado para uma página onde e necessário inserir o código.

Respostas Parte do Aluno


O aluno irá escolher as respostas á pergunta e será redirecionado para a próxima pergunta ao
carregar no botão enviar

A opção 1,2,3 e 4 são guardadas numa base de dados sendo que essa base de dados guarda
também o número da pergunta.

7
Explicação breve da parte de código

Estes são todos os ficheiros que foram usados na


criação do projeto.

Home.php
<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta http-equiv="X-UA-Compatible" content="IE=edge">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>SITE | GN</title>

<style>

body{

font-family: Arial, Helvetica, sans-serif;

background: linear-gradient(to right, rgb(0, 0, 0), rgb(0, 0, 0));

text-align: center;

color: white;

.box{

position: absolute;

top: 50%;

left: 50%;

transform: translate(-50%,-50%);

8
background-color: rgba(0, 0, 0, 0.6);

padding: 30px;

border-radius: 10px;

a{

text-decoration: none;

color: white;

border: 3px solid dodgerblue;

border-radius: 10px;

padding: 10px;

a:hover{

background-color: dodgerblue;

</style>

</head>

<body>

<h1>Gestao de questionarios--Tipo kahoot</h1>

<h2>Gonçalo Ferreira n2020142102</h2>

<h3>Ruben Oliveira n2020147218</h3>

<div class="box">

<a href="login.php">Login</a>

<a href="formulario.php">Register</a>

</div>

</body>

</html>

Este ficheiro corresponde ao html responsável pela página de apresentação. Tem vários
elementos configuráveis para o aspeto e para os botões que aparecem na mesma.

Ao carregar no botão login existe um reencaminhamento para o ficheiro login.php e ao


carregar no botão register somos reencaminhados para o ficheiro formulário.php.

9
formulário.php
<<?php

include_once('config.php');

if ($_SERVER["REQUEST_METHOD"] == "POST") {

$nome = $_POST["nome"];

$email = $_POST["email"];

$telefone = $_POST["telefone"];

$ProfOUAluno = $_POST["ProfOUAluno"];

$data_nascimento = $_POST["data_nascimento"];

$cidade = $_POST["cidade"];

$concelho = $_POST["concelho"];

$endereco = $_POST["endereco"];

$passwordd = $_POST["passwordd"];

$result = mysqli_query($conexao, "INSERT INTO usuarios (nome, email, telefone, ProfOUAluno, data_nasc,
cidade, concelho, endereco, passwordd)

VALUES
('$nome','$email','$telefone','$ProfOUAluno','$data_nascimento','$cidade','$concelho','$endereco','$passwordd')
");

?>

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta http-equiv="X-UA-Compatible" content="IE=edge">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Formulário | GN</title>

<style>

body {

font-family: Arial, Helvetica, sans-serif;

10
background-image: linear-gradient(to right, rgb(0, 0, 0), rgb(0, 0, 0));

margin: 0;

display: flex;

justify-content: center;

align-items: center;

height: 100vh;

.box {

color: white;

background-color: rgba(0, 0, 0, 0.9);

padding: 20px;

border-radius: 2px;

width: 30%;

box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);

fieldset {

border: 3px solid dodgerblue;

border-radius: 10px;

margin: 20px 0;

legend {

border: 1px solid dodgerblue;

padding: 10px;

text-align: center;

background-color: dodgerblue;

border-radius: 8px;

color: white;

.inputBox {

position: relative;

margin-bottom: 20px;

11
}

.inputUser {

background: none;

border: none;

border-bottom: 1px solid white;

outline: none;

color: white;

font-size: 15px;

width: 92%;

letter-spacing: 2px;

padding: 8px;

.labelInput {

position: absolute;

top: 0;

left: 0;

pointer-events: none;

transition: .5s;

color: dodgerblue;

.inputUser:focus ~ .labelInput,

.inputUser:valid ~ .labelInput {

top: -20px;

font-size: 12px;

#data_nascimento {

border: none;

padding: 8px;

border-radius: 10px;

outline: none;

font-size: 15px;

12
}

#submit {

background-image: linear-gradient(to right, rgb(0, 92, 197), rgb(90, 20, 220));

width: 100%;

border: none;

padding: 15px;

color: white;

font-size: 15px;

cursor: pointer;

border-radius: 10px;

transition: background-image 0.3s;

#submit:hover {

background-image: linear-gradient(to right, rgb(0, 80, 172), rgb(80, 19, 195));

.control {

margin-top: 20px;

text-align: center;

.button {

background-color: #ff3860;

color: white;

padding: 10px 20px;

text-decoration: none;

border-radius: 5px;

transition: background-color 0.3s;

.button:hover {

background-color: #d71f3b;

13
</style>

</head>

<body>

<div class="box">

<form action="formulario.php" method="POST">

<fieldset>

<legend><b>Register</b></legend>

<div class="inputBox">

<input type="text" name="nome" id="nome" class="inputUser" required>

<label for="nome" class="labelInput">Nome completo</label>

</div>

<div class="inputBox">

<input type="text" name="email" id="email" class="inputUser" required>

<label for="email" class="labelInput">Email</label>

</div>

<div class="inputBox">

<input type="tel" name="telefone" id="telefone" class="inputUser" required>

<label for="telefone" class="labelInput">Telefone</label>

</div>

<p>Escolha:</p>

<input type="radio" id="Professor" name="ProfOUAluno" value="Professor" required>

<label for="Professor">Professor</label>

<br>

<input type="radio" id="Aluno" name="ProfOUAluno" value="Aluno" required>

<label for="Aluno">Aluno</label>

<br>

<label for="data_nascimento"><b>Data de Nascimento:</b></label>

<input type="date" name="data_nascimento" id="data_nascimento" required>

<br>

<div class="inputBox">

<input type="text" name="cidade" id="cidade" class="inputUser" required>

<label for="cidade" class="labelInput">Cidade</label>

</div>

<div class="inputBox">

<input type="text" name="concelho" id="concelho" class="inputUser" required>

14
<label for="concelho" class="labelInput">Concelho</label>

</div>

<div class="inputBox">

<input type="text" name="endereco" id="endereco" class="inputUser" required>

<label for="endereco" class="labelInput">Endereço</label>

</div>

<div class="inputBox">

<input type="text" name="passwordd" id="passwordd" class="inputUser" required>

<label for="passwordd" class="labelInput">Password</label>

</div>

<input type="submit" name="submit" id="submit">

<div class="control">

<a href="home.php" class="button is-danger">Sair</a>

</div>

</fieldset>

</form>

</div>

</body>

</html>

Este ficheiro divide-se em uma parte html e outra php. A parte HTML são recolhidos todos as
variáveis necessárias para um registro como: nome , data de nascimento … . Essas varáveis são
associadas a variáveis php. É feito através do método POST(maneira de enviar arquivos para um
script PHP). Na parte de PHP é chamado através da função include_once o ficheiro php que
possui as informações para ser possível a ligação à base de dados. Dentro do if existe a verificação
se o formulário foi enviado usando o metodo POST. As variáveis adquiridas através do método
POST são igualadas a outras que possuem o mesmo nome. Na função mysqli_query são inseridos
na tabela usuários os valores das variáveis respetivamente.

Config.php
<?php

$dbHost = 'localHost';

$dbUsername = 'root';

$dbPassword = '';

$dbName = 'formulario'; //nome da base de dados

$conexao = new mysqli($dbHost,$dbUsername,$dbPassword,$dbName);

15
/*if($conexao->connect_errno){

echo "Erro";

}else{

echo "conexao efetuada com sucesso";

}*/

?>

O ficheiro estabelece a ligação com a base de dados formulário.

login.php
<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta http-equiv="X-UA-Compatible" content="IE=edge">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Tela de login</title>

<style>

body{

font-family: Arial, Helvetica, sans-serif;

background-color: rgba(0, 0, 0);

div{

background-color: rgba(0, 0, 0, 0.9);

position: absolute;

top: 50%;

left: 50%;

transform: translate(-50%,-50%);

padding: 80px;

border-radius: 15px;

color: #fff;

16
}

input {

padding: 15px;

border: none;

outline: none;

font-size: 15px;

.inputSubmit {

display: inline-block; /* Make buttons display inline */

width: 48%; /* Set the width to 48% to leave some space between buttons */

margin: 0 1%; /* Add a small margin between buttons */

background-color: rgb(0, 0, 255);

border: none;

padding: 15px;

border-radius: 10px;

color: white;

font-size: 15px;

text-align: center;

.inputSubmit1 {

display: inline-block; /* Make buttons display inline */

width: 70px; /* Set the width to 48% to leave some space between buttons */

margin: 0 1%; /* Add a small margin between buttons */

background-color: rgb(255, 0, 0);

border: none;

padding: 15px;

border-radius: 10px;

color: white;

font-size: 15px;

text-align: center;

17
.inputSubmit:hover {

background-color: rgb(0, 0, 0);

cursor: pointer;

.inputSubmit1:hover {

background-color: rgb(0, 0, 0);

cursor: pointer;

</style>

</head>

<body>

<div>

<h1>Login</h1>

<form action="verificarLogin.php" method="POST">

<input type="text" name="email" placeholder="Email">

<br><br>

<input type="passwordd" name="passwordd" placeholder="Password">

<br><br>

<input class="inputSubmit" type="submit" name="submit" value="Enviar">

<a class="inputSubmit1" href="home.php">Sair</a>

</div>

</body>

</html>

O ficheiro login.php é um ficheiro que recolhe duas frases, uma a palavra-passe e outra o
email e reencaminha para o ficheiro verificarLogin.php

verificarLogin.php
<?php

session_start();

if (isset($_POST['submit']) && !empty($_POST['email']) && !empty($_POST['passwordd'])) {

// Se existirem variáveis, permite o acesso

18
include_once('config.php');

$email = $_POST['email'];

$passwordd = $_POST['passwordd'];

$aluno = $_POST['aluno'];

$sql = "SELECT * FROM usuarios WHERE email = '$email' AND passwordd = '$passwordd'";

$result = $conexao->query($sql);

if (mysqli_num_rows($result) < 1) {

// Usuário não existe

header('Location: login.php');

unset($_SESSION['email']);

unset($_SESSION['senha']);

} else {

// Usuário existe, verificar se é Professor

$row = mysqli_fetch_assoc($result);

$profOUAluno = $row['ProfOUAluno'];

if ($profOUAluno == 'Professor') {

// Se for Professor, redireciona para sistema.php

$_SESSION['email'] = $email;

$_SESSION['passwordd'] = $passwordd;

header('Location: sistema.php');

} else {

// Se for Aluno, redireciona para outra página ou realiza alguma outra ação

// header('Location: respostasAlunos.php');

header("Location: nQuestionario.php?parametro=$email");

19
}

} else {

header('Location: login.php');

?>

O ficheiro verificarLogin.php verificar se os dados inseridos estão corretos, ou seja, se são


encontrados na base de dados usuários ou não.

Se não houver registos correspondentes, redireciona o usuário de volta para a página de


login. Caso contrário, verifica se o usuário é um professor ou aluno e realiza o
redireccionamento apropriado. Redireciona para a página sistema.php caso seja um professor
e redireciona para a página nQuestionario.php e leva a variável email pois será necessária
posteriormente para identificação do aluno.

nQuestionario.php
<?php

include_once('config.php');

session_start();

if (isset($_POST['submit']) && !empty($_POST['num_questionario'])) {

// Se existirem variáveis, permite o acesso

$email = $_GET['parametro'];

$num = $_POST['num_questionario'];

$sql = "SELECT * FROM perguntas WHERE codigo = $num";

$result = $conexao->query($sql);

if (mysqli_num_rows($result) < 1) {

// não existe este questionário

echo("Questionário não existe...");

else {

echo("................");

header("Location: respostasAlunos.php?parametro=$email&codigo=$num");

20
?>

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta http-equiv="X-UA-Compatible" content="IE=edge">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Tela de login</title>

<style>

body {

font-family: Arial, Helvetica, sans-serif;

background-color: rgba(0, 0, 0);

div {

background-color: rgba(0, 0, 0, 0.9);

position: absolute;

top: 50%;

left: 50%;

transform: translate(-50%, -50%);

padding: 80px;

border-radius: 15px;

color: #fff;

text-align: center; /* Center align the content */

input {

padding: 15px;

border: none;

outline: none;

font-size: 15px;

.inputSubmit {

display: inline-block; /* Make buttons display inline */

width: 48%; /* Set the width to 48% to leave some space between buttons */

margin: 0 1%; /* Add a small margin between buttons */

21
background-color: rgb(0, 0, 255);

border: none;

padding: 15px;

border-radius: 10px;

color: white;

font-size: 15px;

text-align: center;

.inputSubmit1 {

display: inline-block; /* Make buttons display inline */

width: 70px; /* Set the width to 48% to leave some space between buttons */

margin: 0 1%; /* Add a small margin between buttons */

background-color: rgb(255, 0, 0);

border: none;

padding: 15px;

border-radius: 10px;

color: white;

font-size: 15px;

text-align: center;

.inputSubmit:hover {

background-color: rgb(0, 0, 0);

cursor: pointer;

.inputSubmit1:hover {

background-color: rgb(0, 0, 0);

cursor: pointer;

</style>

</head>

<body>

<div>

<h1>Código</h1>

<form action="" method="POST">

<input type="text" name="num_questionario" placeholder="Código...">

22
<br><br>

<input class="inputSubmit" type="submit" name="submit" value="Enviar">

<a class="inputSubmit1" href="home.php">Sair</a>

</form>

</div>

</body>

</html>

No nQuestionario.php divide-se numa parte php e noutra html. A parte html cria a interface
vista nas figuras introdutórias e recolhe a variável num_questionario. A variável é recolhida
pelo método POST no código PHP e nesse mesmo código é verificado se existe algum código na
tabela perguntas.

Depois da verificação reencaminha para o ficheiro respostasAlunos.php e leva consigo as


variáveis $email e o número do código.

RespostasAlunos.php
<?php

session_start();

include_once('configRespostas.php');

$email = $_GET['parametro'];

$codigo = $_GET['codigo'];

//$sql = "SELECT * FROM perguntas ORDER BY nPergunta ASC LIMIT 10";

$sql_count = "SELECT COUNT(*) AS total_perguntas FROM perguntas WHERE codigo = $codigo";

$count_linhas = $conexao->query($sql_count);

if ($count_linhas !== false) {

$limite = $count_linhas->fetch_assoc();

$_SESSION['perguntas_limit'] = $limite['total_perguntas'];

} else {

// Tratar erro na execução da consulta

$_SESSION['perguntas_limit'] = 10; // Ou qualquer valor padrão desejado

23
if (!isset($_SESSION['pergunta_atual'])) {

echo('primeira vez');

$_SESSION['pergunta_atual'] = 1;

/*$sql = "SELECT * FROM perguntas WHERE codigo = $codigo";

$result1 = $conexao->query($sql);

if ($result1->num_rows > 0) {

$row = $result1->fetch_assoc();

}*/

else {

echo('ELSE: pergunta_atual:');

$_SESSION['pergunta_atual'] += 1;

echo($_SESSION['pergunta_atual']);

echo('----------');

//$_SESSION["perguntas"] = $result1;

$cur_row = $_SESSION['pergunta_atual'];

$sql = "SELECT * FROM perguntas WHERE nPergunta=$cur_row AND codigo = $codigo";

$result1 = $conexao->query($sql);

// Verifique se há resultados

if ($result1->num_rows > 0) {

// Obtenha a linha do resultado

$row = $result1->fetch_assoc();

// Acesse os valores das colunas

$pergunta1 = $row['pergunta1'];

$opcaoA = $row['opcaoA'];

$opcaoB = $row['opcaoB'];

$opcaoC = $row['opcaoC'];

$opcaoD = $row['opcaoD'];

$questionarios = $row['questionarios'];

24
$nPergunta = $row['nPergunta'];

// ... continue para as outras colunas

// echo "pergunta1: " . $pergunta1 . "<br>";

//echo "opcaoA: " . $opcaoA . "<br>";

// echo "opcaoB: " . $opcaoB . "<br>";

//echo "opcaoC: " . $opcaoC . "<br>";

//echo "opcaoD: " . $opcaoD . "<br>";

//echo "questionarios: " . $questionarios . "<br>";

//$questionarios1 = $questionarios;

//$nPergunta1 = $nPergunta;

// ... faça algo com os outros valores

} else {

echo "Nenhum resultado encontrado.";

echo("####");

echo($nPergunta);

echo("####");

if (isset($_POST['submit'])) {

$Resposta = $_POST['Resposta'];

//Faz um echo de nPergunta e de cur_row e vê se são iguais

$result = mysqli_query($conexao, "INSERT INTO kahoot (Resposta,aluno,nPergunta,questionarios)

VALUES ('$Resposta','$email','$nPergunta','$questionarios')");

if ($result) {

echo "Resposta inserida com sucesso!";

//$row = $result1->fetch_assoc();

if ($cur_row > $_SESSION['perguntas_limit']) {

session_destroy();

header("Location: acabou.php");

25
} /*else {

$_SESSION['pergunta_atual'] += 1;

echo($_SESSION['pergunta_atual']);

}*/

} else {

echo "Erro ao inserir a resposta: " . mysqli_error($conexao);

$conexao->close();

?>

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta http-equiv="X-UA-Compatible" content="IE=edge">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Formulário | GN</title>

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.3/css/bulma.min.css">

<style>

body {

font-family: Arial, Helvetica, sans-serif;

background-image: linear-gradient(to right, rgb(0, 0, 0), rgb(0, 0, 0));

margin: 0;

display: flex;

justify-content: center;

align-items: center;

height: 100vh;

26
.form-horizontal {

width: 30%;

color: white;

background-color: rgba(0, 0, 0, 0.9);

padding: 20px;

border-radius: 15px;

box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);

fieldset {

border: 3px solid dodgerblue;

border-radius: 10px;

margin: 20px 0;

padding: 15px;

legend {

border: 1px solid dodgerblue;

padding: 10px;

text-align: center;

background-color: dodgerblue;

border-radius: 8px;

color: white;

.field {

margin-bottom: 20px;

text-align: center;

.control {

text-align: center;

.button {

27
background-color: #ff3860;

color: white;

padding: 10px 20px;

border-radius: 10px;

transition: background-color 0.3s;

.button:hover {

background-color: #d71f3b;

</style>

</head>

<body>

<form class="form-horizontal" method="post" action="">

<fieldset>

<legend><b>Resposta:</b></legend>

<!-- Question displayed first -->

<div class="field">

<label class="label"></label>

<div class="control">

<p>Pergunta: <?php echo $pergunta1; ?></p>

</div>

</div>

<!--

<!-- Radio buttons -->

<div class="field">

<div class="control">

<p>Escolha :</p>

<label class="radio">

<input type="radio" id="Opcao1" name="Resposta" value="Opcao1" required>

<span>Opção 1: <?php echo $opcaoA; ?></span>

28
</label>

<br>

<label class="radio">

<input type="radio" id="Opcao2" name="Resposta" value="Opcao2" required>

<span>Opção 2: <?php echo $opcaoB; ?></span>

</label>

<br>

<label class="radio">

<input type="radio" id="Opcao3" name="Resposta" value="Opcao3" required>

<span>Opção 3: <?php echo $opcaoC; ?></span>

</label>

<br>

<label class="radio">

<input type="radio" id="Opcao4" name="Resposta" value="Opcao4" required>

<span>Opção 4: <?php echo $opcaoD; ?></span>

</label>

</div>

</div>

<!-- Submit button -->

<div class="field">

<div class="control">

<input type="submit" name="submit" id="submit" class="button is-primary">

</div>

</div>

</fieldset>

</form>

</body>

</html>

O arquivo respostasAlunos.php consiste em uma combinação de código HTML e PHP. No


funcionamento desse arquivo, ele extrai informações da tabela "perguntas", como as opções A,
B, C, D, o número do questionário, o número da pergunta e o código associado. Em seguida,
utilizando o número da pergunta (armazenado na variável nPergunta), essas informações são
exibidas na tela para o usuário. As opções contendo as respostas também são apresentadas na
tela. Posteriormente, essas opções são enviadas para a tabela kahoot juntamente com o
endereço de e-mail associado e o número da pergunta. O processo visa armazenar as respostas

29
dos alunos para posterior análise ou avaliação. Quando chega ao fim das perguntas é enviado
um ficheiro(acabou.php) e posteriormente é reencaminhado para a tela de login.

Acabou.php
<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta http-equiv="X-UA-Compatible" content="IE=edge">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Formulário | GN</title>

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.3/css/bulma.min.css">

<style>

body {

font-family: Arial, Helvetica, sans-serif;

background-image: linear-gradient(to right, rgb(0, 0, 0), rgb(0, 0, 0));

margin: 0;

display: flex;

justify-content: center;

align-items: center;

height: 100vh;

.form-horizontal {

width: 30%;

color: white;

background-color: rgba(0, 0, 0, 0.9);

padding: 20px;

border-radius: 15px;

box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);

fieldset {

border: 3px solid dodgerblue;

30
border-radius: 10px;

margin: 20px 0;

legend {

border: 1px solid dodgerblue;

padding: 10px;

text-align: center;

background-color: dodgerblue;

border-radius: 8px;

color: white;

.field {

margin-bottom: 20px;

text-align: center;

.control {

text-align: center;

.button {

background-color: #ff3860;

color: white;

padding: 10px 20px;

text-decoration: none;

border-radius: 10px;

transition: background-color 0.3s;

cursor: pointer;

.button:hover {

background-color: #d71f3b;

31
</style>

</head>

<body>

<form class="form-horizontal" method="post" action="">

<fieldset>

<legend><b>ACABOU!</b></legend>

<div class="field">

<div class="control">

<input type="submit" name="Sair" id="submit" class="button is-primary" value="Sair">

</div>

</div>

</fieldset>

</form>

<?php

if (isset($_POST['Sair'])) {

// Perform any additional actions before redirection if needed

// Redirect to the home page

header("Location: home.php");

exit(); // Ensure that no further code is executed after redirection

?>

</body>

</html>

O ficheiro acabou.php possui o propósito de fazer de ponte entre o ficheiro respostasAlunos.php


e o ficheiro home.php.

sistema.php
<?php

session_start();

include_once('config.php');

32
// print_r($_SESSION);

if((!isset($_SESSION['email']) == true) and (!isset($_SESSION['passwordd']) == true))

unset($_SESSION['email']);

unset($_SESSION['passwordd']);

header('Location: login.php');

$logado = $_SESSION['email'];

if(!empty($_GET['search']))

$data = $_GET['search'];

$sql = "SELECT * FROM usuarios WHERE id LIKE '%$data%' or nome LIKE '%$data%' or email LIKE '%$data%'
ORDER BY id DESC";

else

$sql = "SELECT * FROM usuarios ORDER BY id DESC";

$result = $conexao->query($sql);

?>

USER

<!DOCTYPE html>

<!DOCTYPE html>

<html lang="en">

<head>

<!-- Your existing head content -->

<style>

body {

background-color: black;

color: white;

text-align: center;

.table-bg {

background: rgba(0, 0, 0, 0);

border-radius: 15px 15px 0 0;

33
}

.box-search {

display: flex;

justify-content: center;

gap: .1%;

.navbar.bg-primary {

background-color: black; /* Set the background color to black for the navbar */

</style>

</head>

<!-- The rest of your HTML code remains unchanged -->

</html>

</style>

</head>

<body>

<nav class="navbar navbar-expand-lg navbar-dark bg-primary">

<div class="container-fluid">

<a class="navbar-brand" href="#"></a>

<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-


controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">

<span class="navbar-toggler-icon"></span>

</button>

</div>

<div class="d-flex">

<a href="home.php" class="btn btn-danger me-5">Sair</a>

</div>

<nav class="navbar navbar-expand-lg navbar-dark bg-primary">

<div class="container-fluid">

<a class="navbar-brand" href="#"></a>

<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-


controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">

34
<span class="navbar-toggler-icon"></span>

</button>

</div>

<div class="d-flex">

<a href="kahoot.php" class="btn btn-danger me-5">kahoot</a>

</div>

</nav>

<br>

<?php

echo "<h1>Bem vindo <u>$logado</u></h1>";

?>

<br>

<div class="m-5">

<table class="table text-white table-bg">

<thead>

<tr>

<th scope="col">#</th>

<th scope="col">Nome</th>

<th scope="col">passwordd</th>

<th scope="col">Email</th>

<th scope="col">Telefone</th>

<th scope="col">ProfOUAluno</th>

<th scope="col">Data de Nascimento</th>

<th scope="col">Cidade</th>

<th scope="col">Concelho</th>

<th scope="col">Endereço</th>

<th scope="col">...</th>

</tr>

</thead>

<tbody>

<?php

while($user_data = mysqli_fetch_assoc($result)) {

echo "<tr>";

35
echo "<td>".$user_data['id']."</td>";

echo "<td>".$user_data['nome']."</td>";

echo "<td>".$user_data['passwordd']."</td>";

echo "<td>".$user_data['email']."</td>";

echo "<td>".$user_data['telefone']."</td>";

echo "<td>".$user_data['ProfOUAluno']."</td>";

echo "<td>".$user_data['data_nasc']."</td>";

echo "<td>".$user_data['cidade']."</td>";

echo "<td>".$user_data['concelho']."</td>";

echo "<td>".$user_data['endereco']."</td>";

echo "<td>

<a class='btn btn-sm btn-primary' href='edit.php?id=$user_data[id]' title='Editar'>

<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' class='bi bi-


pencil' viewBox='0 0 16 16'>

<path d='M12.146.146a.5.5 0 0 1 .708 0l3 3a.5.5 0 0 1 0 .708l-10 10a.5.5 0 0 1-.168.11l-5 2a.5.5 0


0 1-.65-.65l2-5a.5.5 0 0 1 .11-.168l10-10zM11.207 2.5 13.5 4.793 14.793 3.5 12.5 1.207 11.207 2.5zm1.586 3L10.5
3.207 4 9.707V10h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.293l6.5-6.5zm-9.761 5.175-.106.106-1.528 3.821 3.821-
1.528.106-.106A.5.5 0 0 1 5 12.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.468-.325z'/>

</svg>

</a>

<a class='btn btn-sm btn-danger' href='delete.php?id=$user_data[id]' title='Delete'>

<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' class='bi bi-


trash-fill' viewBox='0 0 16 16'>

<path d='M2.5 1a1 1 0 0 0-1 1v1a1 1 0 0 0 1 1H3v9a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V4h.5a1 1 0 0 0


1-1V2a1 1 0 0 0-1-1H10a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1H2.5zm3 4a.5.5 0 0 1 .5.5v7a.5.5 0 0 1-1 0v-7a.5.5 0 0 1 .5-.5zM8
5a.5.5 0 0 1 .5.5v7a.5.5 0 0 1-1 0v-7A.5.5 0 0 1 8 5zm3 .5v7a.5.5 0 0 1-1 0v-7a.5.5 0 0 1 1 0z'/>

</svg>

</a>

</td>";

echo "</tr>";

?>

</tbody>

</table>

</div>

</body>

<script>

36
O ficheiro sistema.php consulta os dados da tabela usuarios e reencaminha para outros
ficheiros através dos botões kahoot, da foto do lápis, e do caixote do lixo. Quando carregamos
no botão kahoot somos reencaminhados para o ficheiro criacaoPerguntas.php, quando
carregamos no botão do lápis somos reencaminhados para o edit.php e por fim quando
carregamos no botão do caixote do lixo somos reencaminhados para o ficheiro delete.php.

criacaoPerguntas.php
<?php

include_once('config.php');

session_start();

if ($_SERVER["REQUEST_METHOD"] == "POST") {

$pergunta1 = $_POST['Pergunta'];

$opcaoA = $_POST['opcaoA'];

$opcaoB = $_POST['opcaoB'];

$opcaoC = $_POST['opcaoC'];

$opcaoD = $_POST['opcaoD'];

$questionario = $_POST['questionario'];

$codigo = $_POST['codigo'];

$nPergunta = $_POST['nPergunta'];

$result = mysqli_query($conexao, "INSERT INTO perguntas (pergunta1, opcaoA, opcaoB, opcaoC, opcaoD, questionarios,
nPergunta, codigo)

VALUES ('$pergunta1', '$opcaoA', '$opcaoB', '$opcaoC', '$opcaoD', '$questionario','$nPergunta', '$codigo')");

?>

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta http-equiv="X-UA-Compatible" content="IE=edge">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Formulário de Perguntas</title>

<style>

body {

font-family: Arial, Helvetica, sans-serif;

background-image: linear-gradient(to right, rgb(0, 0, 0), rgb(0, 0, 0));

37
margin: 0;

display: flex;

justify-content: center;

align-items: center;

height: 100vh;

.container {

color: white;

background-color: rgba(0, 0, 0, 0.9);

padding: 20px;

border-radius: 2px;

width: 30%;

box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);

fieldset {

border: 3px solid dodgerblue;

border-radius: 10px;

margin: 20px 0;

legend {

border: 1px solid dodgerblue;

padding: 10px;

text-align: center;

background-color: dodgerblue;

border-radius: 8px;

color: white;

.field {

position: relative;

margin-bottom: 20px;

.input {

background: none;

38
border: none;

border-bottom: 1px solid white;

outline: none;

color: white;

font-size: 15px;

width: 92%;

letter-spacing: 2px;

padding: 8px;

.label {

position: absolute;

top: 0;

left: 0;

pointer-events: none;

transition: .5s;

color: dodgerblue;

font-size: 12px; /* Adjusted font size */

.input:focus ~ .label,

.input:valid ~ .label {

top: -20px;

font-size: 10px; /* Adjusted font size */

#submit {

background-image: linear-gradient(to right, dodgerblue, royalblue); /* Blue color gradient */

width: 100%;

border: none;

padding: 15px;

color: white;

font-size: 15px;

cursor: pointer;

border-radius: 10px;

transition: background-image 0.3s;

39
#submit:hover {

background-image: linear-gradient(to right, royalblue, dodgerblue); /* Blue color gradient on hover */

.control {

margin-top: 20px;

text-align: center;

.button {

background-color: #ff3860;

color: white;

padding: 10px 20px;

text-decoration: none;

border-radius: 5px;

transition: background-color 0.3s;

.button:hover {

background-color: #d71f3b;

</style>

</head>

<body class="has-background-light">

<div class="container">

<form action="" method="POST" class="form-horizontal">

<fieldset>

<legend class="title is-3 has-text-centered">Escreva as Perguntas:</legend>

<!-- Text input-->

<div class="field">

<label class="label" for="codigo">Escreva o codigo:</label>

<div class="control">

<input id="codigo" name="codigo" type="text" class="input" placeholder="Digite o codigo de acesso">

</div>

</div>

<div class="field">

40
<label class="label" for="nPergunta">Escreva o numero da Pergunta:</label>

<div class="control">

<input id="nPergunta" name="nPergunta" type="text" class="input" placeholder="Escreva o numero da Pergunta:">

</div>

</div>

<!-- Text input-->

<div class="field">

<label class="label" for="questionario">questionario:</label>

<div class="control">

<input id="questionario" name="questionario" type="text" class="input" placeholder="questionario">

</div>

</div>

<!-- Text input-->

<div class="field">

<label class="label" for="Pergunta">Pergunta:</label>

<div class="control">

<input id="Pergunta" name="Pergunta" type="text" class="input" placeholder="Digite a pergunta">

</div>

</div>

<!-- Text input-->

<div class="field">

<label class="label" for="opcaoA">Opção A:</label>

<div class="control">

<input id="opcaoA" name="opcaoA" type="text" class="input" placeholder="Digite a opção A">

</div>

</div>

<!-- Text input-->

<div class="field">

<label class="label" for="opcaoB">Opção B:</label>

<div class="control">

<input id="opcaoB" name="opcaoB" type="text" class="input" placeholder="Digite a opção B">

</div>

</div>

41
<!-- Text input-->

<div class="field">

<label class="label" for="opcaoC">Opção C:</label>

<div class="control">

<input id="opcaoC" name="opcaoC" type="text" class="input" placeholder="Digite a opção C">

</div>

</div>

<!-- Text input-->

<div class="field">

<label class="label" for="opcaoD">Opção D:</label>

<div class="control">

<input id="opcaoD" name="opcaoD" type="text" class="input" placeholder="Digite a opção D">

</div>

</div>

<!-- Submit button -->

<div class="field is-grouped">

<div class="control">

<button type="submit" class="button is-primary" id="submit">Enviar</button>

</div>

<div class="control">

<a href="sistema.php" class="button is-danger">Sair</a>

</div>

</div>

</fieldset>

</form>

</div>

</body>

</html>

O ficheiro criação de perguntas serve para criar as perguntas, apenas o professor tem acesso e
pode por dados como número da pergunta entre outros. Funciona como o formulário só que em
vez de enviar os dados para a tabela usuários envia os dados para a tabela perguntas.

edit.php
<?php

if (!empty($_GET['id'])) {

42
include_once('config.php');

$id = $_GET['id'];

$sqlSelect = "SELECT * FROM usuarios WHERE id=$id";

$result = $conexao->query($sqlSelect);

if ($result->num_rows > 0) {

while ($user_data = $result->fetch_assoc()) {

$nome = $user_data["nome"];

$email = $user_data["email"];

$telefone = $user_data["telefone"];

$ProfOUAluno = $user_data["ProfOUAluno"];

$data_nasc = $user_data["data_nasc"];

$cidade = $user_data["cidade"];

$concelho = $user_data["concelho"];

$endereco = $user_data["endereco"];

$passwordd = $user_data["passwordd"];

} else {

header('location: sistema.php');

exit(); // Ensure script stops execution after redirection

?>

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta http-equiv="X-UA-Compatible" content="IE=edge">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Formulário | GN</title>

43
<style>

body {

font-family: Arial, Helvetica, sans-serif;

background-image: linear-gradient(to right, rgb(0, 0, 0), rgb(0, 0, 0));

margin: 0;

display: flex;

justify-content: center;

align-items: center;

height: 100vh;

.box {

color: white;

background-color: rgba(0, 0, 0, 0.9);

padding: 20px;

border-radius: 2px;

width: 30%;

box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);

fieldset {

border: 3px solid dodgerblue;

border-radius: 10px;

margin: 20px 0;

legend {

border: 1px solid dodgerblue;

padding: 10px;

text-align: center;

background-color: dodgerblue;

border-radius: 8px;

color: white;

.inputBox {

position: relative;

margin-bottom: 20px;

44
}

.inputUser {

background: none;

border: none;

border-bottom: 1px solid white;

outline: none;

color: white;

font-size: 15px;

width: 92%;

letter-spacing: 2px;

padding: 8px;

.labelInput {

position: absolute;

top: 0;

left: 0;

pointer-events: none;

transition: .5s;

color: dodgerblue;

.inputUser:focus ~ .labelInput,

.inputUser:valid ~ .labelInput {

top: -20px;

font-size: 12px;

#data_nascimento {

border: none;

padding: 8px;

border-radius: 10px;

outline: none;

font-size: 15px;

#submit {

45
background-image: linear-gradient(to right, rgb(0, 92, 197), rgb(90, 20, 220));

width: 100%;

border: none;

padding: 15px;

color: white;

font-size: 15px;

cursor: pointer;

border-radius: 10px;

transition: background-image 0.3s;

#submit:hover {

background-image: linear-gradient(to right, rgb(0, 80, 172), rgb(80, 19, 195));

.control {

margin-top: 20px;

text-align: center;

.button {

background-color: #ff3860;

color: white;

padding: 10px 20px;

text-decoration: none;

border-radius: 5px;

transition: background-color 0.3s;

.button:hover {

background-color: #d71f3b;

</style>

</head>

<body>

<div class="box">

<form action="saveEdit.php" method="POST">

<fieldset>

46
<legend><b>Edit</b></legend>

<div class="inputBox">

<input type="text" name="nome" id="nome" class="inputUser" value="<?php echo ($nome) ?>"required>

<label for="nome" class="labelInput">Nome completo</label>

</div>

<div class="inputBox">

<input type="text" name="email" id="email" class="inputUser" value="<?php echo ($email) ?>" required>

<label for="email" class="labelInput">Email</label>

</div>

<div class="inputBox">

<input type="tel" name="telefone" id="telefone" class="inputUser" value="<?php echo ($telefone) ?>"required>

<label for="telefone" class="labelInput">Telefone</label>

</div>

<p>Escolha:</p>

<input type="radio" id="Professor" name="ProfOUAluno" value="Professor" <?php echo($ProfOUAluno == 'Professor' ?


'checked' : '') ?> required>

<label for="Professor">Professor</label>

<br>

<input type="radio" id="Aluno" name="ProfOUAluno" value="Aluno" <?php echo($ProfOUAluno == 'Aluno' ? 'checked' :


'') ?> required>

<label for="Aluno">Aluno</label>

<br>

<label for="data_nascimento"><b>Data de Nascimento:</b></label>

<input type="date" name="data_nascimento" id="data_nascimento" value="<?php echo ($data_nasc) ?>"required>

<br>

<div class="inputBox">

<input type="text" name="cidade" id="cidade" class="inputUser" value="<?php echo ($cidade) ?>"required>

<label for="cidade" class="labelInput">Cidade</label>

</div>

<div class="inputBox">

<input type="text" name="concelho" id="concelho" class="inputUser" value="<?php echo ($concelho) ?>"required>

<label for="concelho" class="labelInput">Concelho</label>

</div>

<div class="inputBox">

<input type="text" name="endereco" id="endereco" class="inputUser" value="<?php echo ($endereco) ?>"required>

<label for="endereco" class="labelInput">Endereço</label>

</div>

<div class="inputBox">

<input type="text" name="passwordd" id="passwordd" class="inputUser" value="<?php echo ($nome) ?>"required>

47
<label for="passwordd" class="labelInput">Password</label>

</div>

<input type="hidden" name="id" value="<?php echo $id; ?>">

<input type="submit" name="update" id="update">

<div class="control">

<a href="sistema.php" class="button is-danger">Sair</a>

</div>

</fieldset>

</form>

</div>

</body>

</html>

</html>

O arquivo edit.php é um script PHP que verifica se um parâmetro 'id' foi passado por meio de uma requisição GET.
Se esse parâmetro existir e for um valor numérico, o script exibirá um formulário HTML para a edição de dados do
usuário. Quando o formulário é submetido, os dados são enviados para o script saveEdit.php usando o método
POST.Dentro do saveEdit.php, há uma verificação para determinar se o formulário foi submetido (por meio do
parâmetro 'update'). Se essa condição for verdadeira, o script recupera os dados do formulário. Em seguida, constrói
e executa uma consulta SQL para atualizar os dados do usuário no banco de dados. Após a conclusão da atualização,
o script redireciona o usuário para a página 'sistema.php'.É crucial assegurar que o tratamento apropriado seja
realizado para lidar com a resposta da atualização na página de destino ('sistema.php'). Este processo geralmente
envolve exibir mensagens informativas ou de erro para o usuário, dependendo do sucesso ou falha da operação de
atualização.

saveEdit.php
<?php

include_once('config.php');

if(isset($_POST['update'])){

$id = $_POST["id"];

$nome = $_POST["nome"];

$email = $_POST["email"];

$telefone = $_POST["telefone"];

$ProfOUAluno = $_POST["ProfOUAluno"];

$data_nasc = $_POST["data_nasc"];

$cidade = $_POST["cidade"];

$concelho = $_POST["concelho"];

$endereco = $_POST["endereco"];

$passwordd = $_POST["passwordd"];

48
$sqlUpdate = "UPDATE usuarios SET nome='$nome', email='$email', telefone='$telefone', ProfOUAluno='$ProfOUAluno',
data_nasc='$data_nasc', cidade='$cidade', concelho='$concelho', endereco='$endereco', passwordd='$passwordd' WHERE
id='$id'";

$result = $conexao->query($sqlUpdate);

header('Location: sistema.php');

?>

No ficheiro saveEdit.php é feito o update das variáveis da tabela.

Delete.php

<?php

include_once('config.php');

$id = $_GET['id'];

$sqlSelect = "SELECT * FROM usuarios WHERE id=$id";

$result = $conexao->query($sqlSelect);

if ($result->num_rows > 0) {

$sqlDelete = "DELETE FROM usuarios WHERE id=$id";

$resultDelete = $conexao->query($sqlDelete);

header('location: sistema.php');

?>

O código PHP fornecido realiza a exclusão de um usuário com base no ID fornecido pela URL.
Se a operação for bem-sucedida, uma mensagem de resumo é construída indicando que o
usuário com o ID correspondente foi excluído com sucesso. Essa mensagem de resumo é então
incluída na URL de redirecionamento para a página 'sistema.php.

Conclusão:
Este projeto PHP e MySQL representou uma imersão prática no desenvolvimento web. Ao criar
o conjunto de arquivos, pudemos aplicar os conceitos aprendidos, como manipulação de dados
no MySQL e interação dinâmica com os usuários usando PHP.A capacidade de extrair e exibir
informações das tabelas, destaca a funcionalidade prática dessa combinação de tecnologias.
Enfrentei desafios, fortalecendo minhas habilidades de resolução de problemas e compreensão

49
do ciclo de vida de uma aplicação web. Este projeto não apenas consolidou meu entendimento
em PHP e MySQL, mas também deu-me uma visão valiosa sobre o desenvolvimento de sistemas
dinâmicos. Essa experiência serve como um trampolim para desafios futuros, contribuindo para
o nosso crescimento como desenvolvedores.

50

Você também pode gostar