Ir para o conteúdo
mikeysantana

Publicação dos dados do formulário em uma base de dados

Mensagens Recomendadas

mikeysantana

Boa tarde,

Sou muito novo na programação com base de dados, mas gostaria de me aventurar e criar uma ferramenta com recurso ao HTML, PHP e MySQL para poder controlar as minhas faturas.

A ideia seria ter um formulário com os dados da fatura e um botão Submeter que faria com que esses dados fossem publicados na base de dados.

Já tenho o formulário e toda a página em HTML, mas agora não sei que código usar, ou como fazer. Será que alguém me podia ajudar?

Eu tentei ainda pesquisar aqui o tema, podia já alguem o ter aberto, mas não encontrei diretamente o que queria.

Cumprimentos.

mikeysantana

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Além do formulário em HTML já tens mais alguma coisa? A base de dados desenhada ou o código PHP (ou parte dele)? Estás a seguir algum tutorial?

Um tutorial para  parte de acesso à base de dados, com PDO (recomendado se não usares uma framework), https://phpdelusions.net/pdo, o site W3CSchools também tem um tutorial de PHP para quem não tem conhecimentos com a linguagem, http://www.w3schools.com/php/default.asp

É complicado ajudar sem fazer o trabalho por ti se não existirem dúvidas específicas :)

 

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mikeysantana
3 minutos atrás, Knitter disse:

Além do formulário em HTML já tens mais alguma coisa? A base de dados desenhada ou o código PHP (ou parte dele)? Estás a seguir algum tutorial?

Um tutorial para  parte de acesso à base de dados, com PDO (recomendado se não usares uma framework), https://phpdelusions.net/pdo, o site W3CSchools também tem um tutorial de PHP para quem não tem conhecimentos com a linguagem, http://www.w3schools.com/php/default.asp

É complicado ajudar sem fazer o trabalho por ti se não existirem dúvidas específicas :)

 

Olá Knitter,

Obrigado pela resposta.

Quanto à base de dados tenho os campos que quero, só ainda não está aberta. No código do formulário já atribui id's aos campos, penso que será mais fácil para depois enviar os dados para a base de dados. Por acaso, ainda não segui tutorial, porque pensei que poderia já encontrar a mesma dúvida de outra pessoa aqui!

Quanto ao PDO, não será aplicável com Twitter Bootstrap e esse tipo de frameworks?

OK, vou tentar ver se encontro algo na net depois aviso com uma dúvida específica.

Cumprimentos,

mikeysantana

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Ena que confusão, começando pelo fim :)

3 minutos atrás, mikeysantana disse:

Será que posso utilizar este tutorial a partir de onde diz "Insert Data Into a Database From an HTML Form"?

Podes utilizar esse tutorial, e o que é explicado vai funcionar, para iniciar serve perfeitamente no entanto usa um conjunto de funções que vai originar avisos, que são consideradas inseguras e que foram substituídas pela utilização de PDO; PDO é uma forma mais actual, segura e mais prática/simples de aceder a bases de dados... basicamente mudam os nomes das funções mas o princípio é o mesmo: abrir ligação, executar comandos para obter/inserir/actualizar dados, etc.

9 minutos atrás, mikeysantana disse:

Quanto à base de dados tenho os campos que quero, só ainda não está aberta.

Não percebo bem o que é que isto quer dizer. A base de dados deverá existir no servidor de bases de dados, no teu caso MySQL, sendo que já deve ser possível inserir dados na BD usando um qualquer cliente de MySQL (programa para ligar directamente à BD e usar comandos SQL para manipular dados)... O HTML da interface gráfica, o código PHP e a base de dados são três elementos que podem existir independentes um dos outros.

12 minutos atrás, mikeysantana disse:

No código do formulário já atribui id's aos campos, penso que será mais fácil para depois enviar os dados para a base de dados.

ID não são enviados quando o formulário é submetido para o servidor, os campos devem ter nomes (tag name), podem ter ID para ajudar mas não é obrigatório. Sem "name" o teu código PHP no servidor não vai receber nada.

13 minutos atrás, mikeysantana disse:

Quanto ao PDO, não será aplicável com Twitter Bootstrap e esse tipo de frameworks?

PDO é PHP (servidor), Twitter Bootstrap é HTML+JS+CSS (cliente/browser). Um não afecta o outro. O código que executar no browser não sabe nada do que acontece no servidor, podes usar o que quiseres do lado do cliente para desenhar a interface gráfica que isso será apenas código visível ao browser. Quando falei em frameworks referia-me a frameworks de PHP para o lado servidor, que ajudam quando se desenvolvem aplicações deste tipo e que têm camadas de funções próprias, em cima do PDO... mas isso pode ficar para a segunda versão do teu programa :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos
Agora, Knitter disse:

Podes utilizar esse tutorial, e o que é explicado vai funcionar, para iniciar serve perfeitamente no entanto usa um conjunto de funções que vai originar avisos, que são consideradas inseguras e que foram substituídas pela utilização de PDO; PDO é uma forma mais actual, segura e mais prática/simples de aceder a bases de dados... basicamente mudam os nomes das funções mas o princípio é o mesmo: abrir ligação, executar comandos para obter/inserir/actualizar dados, etc.

Pelo que vi, o tutorial indicado usa a extensão mysqli, que, tanto quanto sei, é segura e não origina avisos (a extensão mysql é que foi descontinuada).  A utilização do PDO terá ainda assim algumas vantagens (e.g., maior nível de abstracção), mas o mysqli não é necessariamente uma má opção.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter
5 minutos atrás, Rui Carlos disse:

Pelo que vi, o tutorial indicado usa a extensão mysqli, que, tanto quanto sei, é segura e não origina avisos (a extensão mysql é que foi descontinuada).  A utilização do PDO terá ainda assim algumas vantagens (e.g., maior nível de abstracção), mas o mysqli não é necessariamente uma má opção.

Falha minha, o Rui tem toda a razão, é o que dá olhar só por alto enquanto se fazem outras coisas. E ainda bem que ele corrigiu, porque não ia olhar para o link outra vez e estava a dar informação errada.

Editado por Knitter

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mikeysantana

Tentei fazer uma pesquisa pelo PDO e fiquei com este código. Deverá ficar assim?

A opção Setor é uma caixa de opções, posso deixar assim como está?

Estava a pensar adicionar um ID automático para prevenir informação duplicada, terei de o fazer ou a base de dados já o faz automaticamente? Seria como no Excel, cada linha tem um número associado.

<?php
if(isset($_POST["submit"])){
$hostname='localhost';
$username='utilizador';
$password='pass';

try {
$dbh = new PDO("mysql:host=$hostname;dbname=factgest",$username,$password);

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // <== add this line
$sql = "INSERT INTO comerciantes (nif, comerciante, setor)
VALUES ('".$_POST["nif"]."','".$_POST["comerciante"]."','".$_POST["setor"]."')";
if ($dbh->query($sql)) {
echo "<script type= 'text/javascript'>alert('Novo comerciante introduzido com sucesso!');</script>";
}
else{
echo "<script type= 'text/javascript'>alert('O comerciante não foi introduzido. Tenta novamente.');</script>";
}

$dbh = null;
}
catch(PDOException $e)
{
echo $e->getMessage();
}

}
?>

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

Não programo PHP regularmente, e nunca usei PDO, mas pelo menos a execução da query não me parece estar a ser feita de forma recomendável.  Por diversos motivos, convém usares prepared statements para executares as queries, em vez de executares a query directamente com os parâmetros.

Tens mais informação sobre a utilização de prepared statements aqui.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Como o Rui disse, usa prepared statements.

A tabela precisa de uma chave primária que identifique de forma única cada registo, pode ser o NIF, se o valor nunca se repetir nessa tabela ou podes adicionar um campo AUTO_INCREMENT; É um campo inteiro cujo valor começa em zero e que vai sendo incrementado automaticamente cada vez que inseres um registo novo, a BD trata de fazer isso.

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mikeysantana
28 minutos atrás, Rui Carlos disse:

Não programo PHP regularmente, e nunca usei PDO, mas pelo menos a execução da query não me parece estar a ser feita de forma recomendável.  Por diversos motivos, convém usares prepared statements para executares as queries, em vez de executares a query directamente com os parâmetros.

Tens mais informação sobre a utilização de prepared statements aqui.

20 minutos atrás, Knitter disse:

Como o Rui disse, usa prepared statements.

 

Como referi, não tenho qualquer conhecimento de bases de dados e nunca tinha trabalhado com elas com o auxílio de PHP.

O código que adaptei do tutorial seria para usar antes de fechar a tag </body> dentro da página do formulário.

Já li a página do código dos prepared statements mas não consegui perceber onde o posso colocar no meu código...

Fico a aguardar uma resposta sobre isto.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mikeysantana
32 minutos atrás, Knitter disse:

A tabela precisa de uma chave primária que identifique de forma única cada registo, pode ser o NIF, se o valor nunca se repetir nessa tabela ou podes adicionar um campo AUTO_INCREMENT; É um campo inteiro cujo valor começa em zero e que vai sendo incrementado automaticamente cada vez que inseres um registo novo, a BD trata de fazer isso.

Esse campo seria uma outra coluna na base de dados?

Pelo que li apenas seria necessário aquando a criação da tabela no MySQL, depois já não será necessário colocar nenhuma informação no código, penso eu.

Se estiver errado avisa-me por favor.

Cumprimentos,

mikeysantana

Editado por mikeysantana

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mikeysantana

Boa tarde pessoal,

Acho que já cheguei a um código com os prepared statements.

A minha dúvida é se os dados que se encontram em "// insert a row" e "// insert another row". É essa a minha confusão. Porque é que vêm preenchidos se vai depender dos dados que colocar no formulário?! Já encontrei dois tutoriais assim...

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // prepare sql and bind parameters
    $stmt = $conn->prepare("INSERT INTO comerciantes (nif, comerciante, setor) 
    VALUES (:nif, :comerciante, :setor)");
    $stmt->bindParam(':nif', $nif);
    $stmt->bindParam(':comerciante', $comerciante);
    $stmt->bindParam(':setor', $setor);

    // insert a row
    $firstname = "John";
    $lastname = "Doe";
    $email = "john@example.com";
    $stmt->execute();

    // insert another row
    $firstname = "Mary";
    $lastname = "Moe";
    $email = "mary@example.com";
    $stmt->execute();

    // insert another row
    $firstname = "Julie";
    $lastname = "Dooley";
    $email = "julie@example.com";
    $stmt->execute();

    echo "Novo comerciante introduzido com sucesso!";
    }
catch(PDOException $e)
    {
    echo "O comerciante não foi introduzido. Tente novamente." . $e->getMessage();
    }
$conn = null;
?>

Fico a aguardar uma resposta.

Cumprimentos,

mikeysantana

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

No exemplo que tens, não há formulário, daí as variáveis serem inicializadas com constantes.  Numa aplicação a sério, os valores das variáveis serão definidos de outra forma (no teu caso, seriam definidos a partir dos dados recebidos do formulário).

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mikeysantana
15 horas atrás, Rui Carlos disse:

No exemplo que tens, não há formulário, daí as variáveis serem inicializadas com constantes.  Numa aplicação a sério, os valores das variáveis serão definidos de outra forma (no teu caso, seriam definidos a partir dos dados recebidos do formulário).

Olá Rui,

Obrigado pela resposta.

Para ficar ativo com as variáveis apenas preciso de substituir por isto certo?

// insert a row
    $nif = ":nif";
    $comerciante = ":comerciante";
    $setor = ":setor";
    $stmt->execute();

Quanto ao campo AUTO_INCREMENT, é só adicionar quando adicionamos os outros campos certo? Depois disso não precisamos de escrever nada no código PHP para que ele atribua o número à linha da BD pois não?

Fico a aguardar uma resposta.

Cumprimentos,

mikeysantana

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mikeysantana
Em 26/08/2016 às 20:38, Rui Carlos disse:

O que devias ter era mais algo como:


<?php
//...
$nif = $_POST["nif"];
$comerciante = $_POST["comerciante"];
//...

 

Olá Carlos,

Funcionou! Obrigado! :)

Só mais duas perguntinhas:

- No formulário das faturas tenho um campo que permite receber ficheiros PDF para as faturas. Como faço para fazer o upload dos ficheiros para uma paste, em vez da base de dados, como os outros campos? Eu vi este tutorial: http://www.w3schools.com/php/php_file_upload.asp Parece simples, até quase uma questão de copiar e colar, mas posso juntar ao mesmo código que recolhe a informação do formulário para a base de dados?

- Quando estamos a receber informação do formulário de um campo caixa "dropdown", o código é o mesmo como se fosse uma caixa de texto normal? É que verifiquei o que foi publicado na BD e apenas está o NIF, os campos Comerciante e Setor estão com "0". O que faço quanto a isso?

Cumprimentos,

mikeysantana

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
apocsantos

Bom dia,

Podes usar o código de upload em PHP que tens disponível. Por uma questão de organização seria bom se ele fosse executado no final das operações com a base de dados.

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

assinatura.jpg

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos
Em 8/30/2016 às 16:44, mikeysantana disse:

- Quando estamos a receber informação do formulário de um campo caixa "dropdown", o código é o mesmo como se fosse uma caixa de texto normal? É que verifiquei o que foi publicado na BD e apenas está o NIF, os campos Comerciante e Setor estão com "0". O que faço quanto a isso?

Como é que tens o HTML do dropdown?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mikeysantana
4 horas atrás, Rui Carlos disse:

Como é que tens o HTML do dropdown?

Boa tarde Rui, 

Está assim:

<select id="setor" name="setor" width="200" required>
                    <option value="dgf">Despesas Gerais Familiares</option>
                    <option value="saude">Saúde</option>
                    <option value="educacao">Educação</option>
                    <option value="habitacao">Habitação</option>
                    <option value="lares">Lares</option>
                    <option value="reparacao-automoveis">Reparação de Automóveis</option>
                    <option value="reparacao-motociclos">Reparação de Motociclos</option>
                    <option value="rest-aloj">Restauração e Alojamento</option>
                    <option value="cabeleireiros">Cabeleireiros</option>
                    <option value="vet">Atividades Veterinárias</option>
                  </select>

Fico a aguardar resposta.

Cumprimentos,

mikeysantana

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mikeysantana
7 horas atrás, apocsantos disse:

Bom dia,

Podes usar o código de upload em PHP que tens disponível. Por uma questão de organização seria bom se ele fosse executado no final das operações com a base de dados.

Cordiais cumprimentos,

Apocsantos

OK! Obrigado Apocsantos!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos
15 horas atrás, mikeysantana disse:

Boa tarde Rui, 

Está assim:


<select id="setor" name="setor" width="200" required>
                    <option value="dgf">Despesas Gerais Familiares</option>
                    <option value="saude">Saúde</option>
                    <option value="educacao">Educação</option>
                    <option value="habitacao">Habitação</option>
                    <option value="lares">Lares</option>
                    <option value="reparacao-automoveis">Reparação de Automóveis</option>
                    <option value="reparacao-motociclos">Reparação de Motociclos</option>
                    <option value="rest-aloj">Restauração e Alojamento</option>
                    <option value="cabeleireiros">Cabeleireiros</option>
                    <option value="vet">Atividades Veterinárias</option>
                  </select>

Fico a aguardar resposta.

Cumprimentos,

mikeysantana

Assumindo que isso está dentro do form, então a variável $_POST['setor'] irá conter a key da opção seleccionada (e.g., dgf).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mikeysantana
Em 04/09/2016 às 11:03, Rui Carlos disse:

Assumindo que isso está dentro do form, então a variável $_POST['setor'] irá conter a key da opção seleccionada (e.g., dgf).

Exato! Assim deveria ser, mas não, aparece só um 0. :confused:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

Mostra o código completo.  O seguinte exemplo mostra isso a funcionar:

<form method="post" action="tmp.php">
	<select id="setor" name="setor" width="200" required>
                    <option value="dgf">Despesas Gerais Familiares</option>
                    <option value="saude">Saúde</option>
                    <option value="educacao">Educação</option>
                    <option value="habitacao">Habitação</option>
                    <option value="lares">Lares</option>
                    <option value="reparacao-automoveis">Reparação de Automóveis</option>
                    <option value="reparacao-motociclos">Reparação de Motociclos</option>
                    <option value="rest-aloj">Restauração e Alojamento</option>
                    <option value="cabeleireiros">Cabeleireiros</option>
                    <option value="vet">Atividades Veterinárias</option>
        </select>
	<button type="submit">Submit</button>
</form>
<?php
echo "value: ", $_POST['setor'];

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.