Blog Mysql PHP Programação
Mysql com C/Lazarus/Python/PHP/R – Parte 3

Seguindo com nossos artigos, irei incluir agora uma aplicação em PHP, consumindo Mysql.

Este artigo é o terceiro, sobre esse tema, onde irei abordar o uso do mysql em diversas linguagens.

Neste artigo especifíco abordarei o uso no PHP.

GITHUB

Iremos criar em nosso projeto:

https://github.com/marcelomaurin/mysql-vs-todos

Será criado uma pasta chamada PHP, esta pasta, conterá o material necessário para rodar a aplicação.

Pré requisitos

Instale os seguintes pacotes em sua máquina Ubuntu

apt install apache2

Instale os pacotes

apt install php libapache2-mod-php php7.4-mysql php7.4-common php7.4-mysql php7.4-xml php7.4-xmlrpc php7.4-curl php7.4-gd php7.4-imagick php7.4-cli php7.4-dev php7.4-imap php7.4-mbstring php7.4-opcache php7.4-soap php7.4-zip php7.4-intl -y

apt install python3-certbot-apache

Pronto instalação realizada com sucesso, conforme a contraprova.

PHP recem instalado

Criação dos códigos

Criação da Página Principal

Usaremos como interface o boot strap, para gerar uma interface bonita e simples de usar.

Usaremos o modelo MVC (Model , View , Control), que divide a página em 3 partes.

Abordarei o projeto em detalhes parte a parte.

Sempre lembrando que os fontes encontram-se no git.

Para visualização de como ficará no PHP, podemos acessar o link:

http://maurinsoft.com.br/exemplos/phpmysql/

Atribuíndo a conexão

A conexão de todos os scripts são definidos pelo código connectdb.php, conforme fragmento abaixo:

<?php
	define("HOSTNAME","localhost");
	define("USERNAME","php");
 	define("PASSWORD","123456");
	define("DATABASE","testedb");
?>

$dbhandle = new mysqli(HOSTNAME, USERNAME, PASSWORD, DATABASE) or die("Erro ao conectar no banco de dados");

Nele definimos as definições de conexão que podemos chamar nos demais programas.

Web Service do PHP

Acesso a base de Pessoas, eu criei um web service bem simples.

Meu web service possui 4 serviços:

  • dPessoa.php – Apaga um registro
  • iPessoa.php – Inclui um registro de pessoa
  • sPessoa.php – Pesquisa um conjunto de pessoas
  • uPessoa.php – Atualiza o cadastro de uma pessoa.

O Serviço pode ser visto no caminho:

http://maurinsoft.com.br/exemplos/phpmysql/ws/

Todos os web services são baseados em GET para obter os parametros, segue o código do sPessoa.php:

<?php<?php
    /*phpinfo();*/
	/*Registra webservice para processamento de jobs*/
	ini_set('display_errors', 'Off');
	error_reporting(E_ALL);

	include "connectdb.php";

	//header('Cache-Control: no-cache, must-revalidate');
	//$data = var_dump(json_decode(file_get_contents("php://input")));
	$data = json_decode(file_get_contents("php://input"));
	if($data){
		$idpessoa = $dbhandle->real_escape_string($data->idpessoa);
		$nome = $dbhandle->real_escape_string($data->nome);
		$profissao = $dbhandle->real_escape_string($data->profissao);
		$sexo = $dbhandle->real_escape_string($data->sexo);
		$dtnasc = $dbhandle->real_escape_string($data->dtnasc);
	} else {
		$idpessoa = $dbhandle->real_escape_string($_GET['idpessoa']);
		$nome = $dbhandle->real_escape_string($_GET['nome']);
		$profissao = $dbhandle->real_escape_string($data->profissao);
		$sexo = $dbhandle->real_escape_string($data->sexo);
		$dtnasc = $dbhandle->real_escape_string($data->dtnasc);
	}


	$query = "select * from pessoas";
	$sqlwhere = "";
	if(!empty($idpessoa)){
		$sqlwhere = " where (idpessoa = ".$idpessoa.");";
	}
	if(!empty($nome)){
		if($sqlwhere){
			$sqlwhere = $sqlwhere." and (nome like '%".$nome."%');";
		} else {
			$sqlwhere = " where (nome like '%".$nome."%');";
		}
	}
	if(!empty($profissao)){
		if($sqlwhere){
			$sqlwhere = $sqlwhere." and (profissao like '%".$profissao."%');";
		} else {
			$sqlwhere = " where (profissao like '%".$profissao."%');";
		}
	}
	if(!empty($sexo)){
		if($sqlwhere){
			$sqlwhere = $sqlwhere." and (sexo = '".$sexo."');";
		} else {
			$sqlwhere = " where (sexo = '".$sexo."');";
		}
	}
	if(!empty($dtnasc)){
		if($sqlwhere){
			$sqlwhere = $sqlwhere." and (dtnasc = '".$dtnasc."');";
		} else {
			$sqlwhere = " where (dtnasc = '".$dtnasc."');";
		}
	}
	$query = $query . $sqlwhere;

	//echo $query."<br/>";

	$rs = $dbhandle->query($query);

	//print json_encode($rs);

	$cont = 0;

	echo '{"rs":[';
	$row=$rs->fetch_assoc();
	if($row){
		do
		{
			if($cont!=0)
			{
				echo ',';
			}
			echo '{';
			echo '"idpessoa":"'.$row['idPessoa'].'",';
			echo '"nome":"'.$row['nome'].'",';
			echo '"profissao":"'.$row['profissao'].'",';
			echo '"dtnasc":"'.$row['dtnasc'].'",';
			echo '"sexo":"'.$row['sexo'].'"';
			echo '}';
			$cont ++;
		} while($row=$rs->fetch_assoc());
	}
	echo ']}';
	if ($cont>0)
	{
		echo($strJSON);
	}


?>

Neste fragmento, temos um web service muito simplificado.

Onde criamos uma conexão com o banco de dados,

No proximo passo, capturamos os parametros, que podem ser 4:

  • idpessoa – codigo do registro que será pesquisado
  • nome – nome da pessoa que será pesquisada
  • profissão – profissao da pessoa que será pesquisada
  • sexo – Sexo da pessoa que será pesquisada

Os parametros passados, podem ou não retornar um unico registro.

Por fim o json é montado, convertendo o conjunto de itens encontrados em uma expressão json.

Para testar o web service, é necessário rodar conforme o link.

Exemplo de JSON criado

Visualização

Select

http://maurinsoft.com.br/exemplos/phpmysql/ws/sPessoa.php?idpessoa=1

Insert

http://maurinsoft.com.br/exemplos/phpmysql/ws/iPessoa.php?nome=Marcelo&dtnasc=2021-01-01&profissao=Analista&sexo=M

Delete

http://maurinsoft.com.br/exemplos/phpmysql/ws/dPessoa.php?nome=Marcelo

Update

http://maurinsoft.com.br/exemplos/phpmysql/ws/uPessoa.php?pesnome=Marcelo&nome=Marcella&profissao=Tecnica Informatica&sexo=F&dtnasc=2002-01-16

Front End

O index.php – e o front end, ele é responsável pela troca de informações entre o browser e os demais componentes.

Link do front end:

http://maurinsoft.com.br/exemplos/phpmysql/index.php

Segue o formulario:

No Front End, desenvolvido no modelo MVC, criamos 3 elementos.

O index.php, que mostrará as informações encontradas.


<?php
  //Controla o Debug no projeto
  ini_set('display_errors', 'On');

  include "sessao.php";
  include "config.php";
  include "funcs.php";
?>

<html>
	<header>
		<title>Cadastro de Pessoas</title>
		<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js"></script>
		<!-- Latest compiled and minified CSS -->
		<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

		<!-- jQuery library -->
		<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

		<!-- Latest compiled JavaScript -->
		<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

	</header>
	<body>


		<div ng-app="Pessoas" ng-controller="cntrl" >
			<div class="container-fluid bg-1 text-rigth">
				<form>
					<?  Pesquisar Itens ?>
					<div class="jumbotron">
							<h1>Cadastro de Pessoas</h1>
							<p>Modelo de aplicação MVC, conforme <a href="http://maurinsoft.com.br/index.php/2022/02/04/mysql-com-c-lazarus-python-php-r-parte-3/">Artigo publicado.</a></p>
							<p>Para maiores informações <a href="mailto:marcelomaurinmartins@gmail.com">marcelomaurinmartins@gmail.com</a></p>
					</div>
					<div class="row">
						<div class="col-sm-1">idPessoa:</div>
						<div class="col-sm-2"><input class="form-control" placeholder="idPessoa (opcional)" type="text" ng-model="pidpessoa" name="pidpessoa"></div>
					</div>
					<div class="separador">
					</div>
					<div class="row">
						<div class="col-sm-1">Nome:</div>
						<div class="col-sm-4"><input class="form-control" placeholder="nome (opcional)" type="text" ng-model="pnome" name="pnome"></div>
					</div>
					<div class="separador">
					</div>

					<div class="row">
						<div class="col-sm-1">Profissão:</div>
						<div class="col-sm-4"><input class="form-control" placeholder="profissao (opcional)" type="text" ng-model="pprofissao" name="pprofissao"></div>
					</div>
					<div class="separador">
					</div>
					<div class="row">
					    <div class="col-sm-1">Dt. Nascimento:</div>
						<div class="col-sm-4"><input class="form-control" placeholder="dt Nascimento (yyyy-mm-dd) (opcional)" type="text" ng-model="pdtnasc" name="pdtnasc"></div>
					</div>
					<div class="separador">
					<div class="row">
					    <div class="col-sm-1">Sexo:</div>
						<div class="col-sm-4"><input class="form-control" placeholder="Genero sexual (M/F) (opcional)" type="text" ng-model="psexo" name="psexo"></div>
					</div>
					<div class="separador">
					</div>
					<div class="row">
						<div class="col-sm-1"></div>
						<div class="col-sm-4"></div>
						<div class="col-sm-1"> <input type="button" class="btn btn-primary"  value="Pesquisar" ng-click="displayPessoa(pidpessoa,pnome,pprofissao,psexo,pdtnasc)" > </div>
						<div class="col-sm-1">  </div>
						<div class="col-sm-1"> <input type="button" class="btn btn-primary"  value="Novo Item" ng-click="newPessoa(pidpessoa)" > </div>

					</div>


					<? Retorno de mensagem de erro ?>
					<div class="info">
						<div class="control-label">Alerta:</div>
						<div class="info">{{msg}}</div>
					</div>
				</form>
			</div>
			<? layout da tabela de resposta ?>
			<div class="container-fluid bg-1 text-rigth">

				<? **Cadastrar itens** ?>
				<div id="cadastro" ng-style="disableInsert" >
					<div class="row">
						<div class="col-sm-12"> <h3>Operação Insert registro </h3></div>
					</div>
					<div class="row">
						<div class="col-sm-1 control-label"> Nome: </div>
						<div class="col-sm-4"> <input  class="form-control" placeholder=" Nome da pessoa" type="text" ng-model="nome" name="nome"> </div>
					</div>
					<div class="row">
						<div class="col-sm-1 control-label"> Profissão</div>
						<div class="col-sm-4"> <input class="form-control"  placeholder=" Profissão da pessoa" type="text" ng-model="profissao" name="profissao"></div>
					</div>
					<div class="row">
						<div class="col-sm-1 control-label"> Dt. Nascimento</div>
						<div class="col-sm-4"> <input class="form-control"  placeholder=" Dt nascimento (YYYY-mm-dd)" type="text" ng-model="dtnasc" name="dtnasc"></div>
					</div>
					<div class="row">
						<div class="col-sm-1 control-label">Sexo</div>
						<div class="col-sm-4"> <input class="form-control"  placeholder=" Sexo de Nascimento (M/F)" type="text" ng-model="sexo" name="sexo"></div>
					</div>
					<div class="row">
						<div class="col-sm-4"></div>
						<div class="col-sm-1 control-label">  </div>
						<div> <input type="button" class="btn btn-primary" value="submit" ng-click="insertPessoa()" > </div>
					</div>
				</div>
			</div>

			<div class="container-fluid bg-1 text-rigth">

				<? *** Update *** ?>
				<div id="edicao" ng-style="disableUpdate" class="container-fluid bg-1 text-rigth">
					<div class="row">
						<div class="col-sm-12"> <h3>Operacao de Edicao</h3></div>
					</div>
					<div class="row">
						<div class="col-sm-1 control-label"> idPessoa:</div><div> {{edidpessoa}}</div>
					</div>
					<div class="row">
						<div class="col-sm-1 control-label"> Nome</div>
						<div class="col-sm-4"> <input class="form-control"  type="text" ng-model="ednome" name="ednome"></div>
					</div>
					<div class="row">
						<div class="col-sm-1 control-label"> Profissão</div>
						<div class="col-sm-4"> <input class="form-control"  type="text" ng-model="edprofissao" name="edprofissao"></div>
					</div>
					<div class="row">
						<div class="col-sm-1 control-label"> Dt. Nascimento</div>
						<div class="col-sm-4"> <input class="form-control"  type="text" ng-model="eddtnasc" name="eddtnasc"></div>
					</div>
					<div class="row">
						<div class="col-sm-1 control-label">Sexo</div>
						<div class="col-sm-4"> <input class="form-control"  type="text" ng-model="edsexo" name="edsexo"></div>
					</div>
					<div class="row">
						<div class="col-sm-4"></div>
						<div class="col-sm-1"> <button class="btn btn-primary" ng-click="updatePessoa(edidpessoa,ednome, edprofissao, eddtnasc, edsexo)">Atualizar</button></div>
					</div>
				</div>
			</div>

			<div class="container-fluid bg-1 text-rigth">
				<div class="row">
				<hr>
				</div>
			</div>

			<? ** Tela de Resultado **?>
			<div class="container-fluid bg-1 text-rigth">
				<table class="table table-striped">
					<thead>
						<tr>
							<th>IdPessoa</th>
							<th>Nome</th>
							<th>Profissão</th>
							<th>Dt. Nascimento</th>
							<th>Sexo</th>

						<tr>
					</thead>
					<tbody>
						<tr ng-repeat="dados in data.rs">
							<td>{{dados.idpessoa}}</td>
							<td>{{dados.nome}}</td>
							<td>{{dados.profissao}}</td>
							<td>{{dados.dtnasc}}</td>
							<td>{{dados.sexo}}</td>
							<td><button class="btn btn-primary" ng-click="deletePessoa(dados.idpessoa);">Delete</button></td>
							<td><button class="btn btn-primary" ng-click="HabilitaEdicao(dados);">Edit</button></td>
						</tr>
					</tbody>
				</table>


			</div>



			<? *** Controler *** ?>
			<script>
				var app = angular.module('Pessoas',[]);
				app.controller('cntrl', function($scope,$http)
				{
				    $scope.disableUpdate = {'display': 'none'}; //Atribui Edicao invisivel
					$scope.disableInsert = {'display': 'none'}; //Atribui Edicao invisivel

					//Mostra  os Jobs
					$scope.insertPessoa=function()
					{
						$http.post("/exemplos/phpmysql/ws/iPessoa.php",{'nome':$scope.nome,'profissao':$scope.profissao,'dtnasc':$scope.dtnasc,'sexo':$scope.sexo})
						.success(function()
						{
							$scope.msg = "nome foi cadastrado com sucesso";
							$scope.displayPessoa();
						})
					}

					$scope.displayPessoa=function(pidpessoa,pnome,pprofissao,psexo,pdtnasc)
					{
					    $scope.disableUpdate = {'display': 'none'}; //Atribui Edicao invisivel
						$scope.disableInsert = {'display': 'none'}; //Atribui Edicao invisivel

						if (typeof pidpessoa == "undefined")
						{
							pidpessoa = "";
						}
						if (typeof pnome == "undefined")
						{
							pnome = "";
						}
						if (typeof psexo == "undefined")
						{
							psexo = "";
						}
						if (typeof pprofissao == "undefined")
						{
							pprofissao = "";
						}
						if (typeof pdtnasc == "undefined")
						{
							pdtnasc = "";
						}

						var params = {"idpessoa": pidpessoa, "nome": pnome, "profissao": pprofissao, "sexo": psexo, "dtnasc": pdtnasc };
						var config = {params: params};


						$http.get("/exemplos/phpmysql/ws/sPessoa.php",config)
						.success(function(data)
						{
							$scope.data = data;
							$scope.msg = "Tela Atualizada!";
						})
						.error(function()
						{
							$scope.msg = "Pesquisa retornou vazia";
							$scope.data = null;
						})
					}

					$scope.deletePessoa=function(idpessoa)
					{
						$http.post("/exemplos/phpmysql/ws/dPessoa.php",{'idpessoa':idpessoa})
						.success(function()
						{
							$scope.displayPessoa();
							$scope.msg = "Registro excluido!";
						})
					}

					//Mostra  os Jobs
					$scope.newPessoa=function()
					{
						$scope.disableInsert = {'display': 'block'};
						$scope.disableUpdate = {'display': 'none'};
						$scope.edidpessoa = "";
						$scope.ednome = "";

					}

					$scope.HabilitaEdicao=function(dado)
					{
						$scope.disableUpdate = {'display': 'block'};
						$scope.edidpessoa = dado.idpessoa;
						$scope.ednome = dado.nome;
					}


					$scope.updatePessoa=function(edidpessoa, ednome, edprofissao, eddtnasc, edsexo)
					{
						$http.post("/exemplos/phpmysql/ws/uPessoa.php",{'pesidpessoa':edidpessoa,'nome':ednome,'profissao':edprofissao,'dtnasc':eddtnasc,'sexo':edsexo})
						.success(function()
						{
							$scope.displayPessoa();
							$scope.msg = "Registro excluido!";

							$scope.disableUpdate = {'display': 'none'};
							$scope.displayPessoa();
						})
					}

				});
			</script>


		</div>
	</body>
</html>

Podemos notar que todo o serviço pesado é realizado pelo web service, ficando a responsábilidade apenas do controler de consumir as informações passadas.

Não entrarei no detalhe técnico do PHP, nem em detalhes sobre o modelo MVC.

Deixarei tal atividade para um post em momento oportuno.

Conclusão

O PHP é uma linguagem robusta e intuitiva, permitindo escrita elegante de um código limpo e eficiente.

Eu no entanto, não me considero um programador excepcional em PHP, apenas quebro o galho, criando algumas páginas e cumprindo um papel menor.

O PHP é muito mais que apresentado aqui, porem sei que isso será suficiente para dar um norte para muitos.

Espero ter ajudado, e caso tenham gostado do artigo, mandem um email para mim.

,

Referências

https://www.cloudbooklet.com/how-to-install-lamp-apache-mysql-php-in-ubuntu-20-04/

https://getbootstrap.com/docs/5.1/examples/navbar-static/

Artigos Relacionados

    Banco de dados C/C++ Delphi Lazarus Mysql PHP Python R
    Mysql com C/Lazarus/Python/PHP/R – Parte 1

    Neste super tutorial, iremos abordar a Conexão do Mysql com estas 5 linguagens.

    Na primeira parte do tutorial, iremos abordado o Mysql própriamente dita, onde faço a instalação e configuração.

    Nos próximos posts abordarei cada linguagem individualmente.

    Mysql

    Mysql é um banco fornecido pela Oracle, muito utilizado em aplicações embarcadas e web.

    De forma geral é um banco sólido, com uma ampla gama de aplicações, e seguro.

    Instalação no Linux / Ubuntu

    A instalação do servidor mysql é muito simples.

    apt install mysql-server

    Instalação do mysql server em Linux

    A instalação do Mysql é muito simples, e instala os principais componentes.

    Instalação do Mysql

    Vídeo de demonstração

    Instalação do Mysql

    Criando um banco de dados

    Agora, iremos criar um projeto de banco de dados bem simples.

    A idéia é basicamente permitir CRUD nos demais artigos. Para quem não conhece o CRUD, é a abreviação (Create, Read, Update, Delete).

    Para nos ajudar, irei criar um git, do projeto.

    Ambiente de desenvolvimento

    A instalação do ambiente de desenvolvimento precisa ser feito através da lib:

     apt-get install libmysqlclient-dev 

    A lib acima, instala os headers e .so para integração com C e outras linguagens, como Lazarus.

    A medida que avancemos nos demais artigos, irei incluindo aqui, as bibliotecas para as demais linguagens tambem. Então fique atento.

    GIT

    https://github.com/marcelomaurin/mysql-vs-todos

    SCRIPTS

    Agora iremos criar o Nosso Makefile para carregar os scripts:

    Arquivo Makefile

    # Script de criacao do banco de dados
    # Autor Marcelo Maurin Martins
    # Daa: 31/01/2022
    #
    
    
    APP=mysql
    
    all:  database Tabelas
    database:
    	$(APP)  < database.sql
    Tabelas:
    	$(APP) < pessoas.sql
    

    Em seguida iremos criar o script de criação da base de dados, database.sql:

    #Cria um banco de dados em Mysql
    #Autor: Marcelo Maurin Martins
    #31/01/2022
    
    
    create database IF NOT EXISTS `testedb`;

    E por fim nossa tabela pessoas.sql

    #Cria a tabela de pessoas
    #Autor: Marcelo Maurin Martins
    #31/01/2022
    
    use testedb;
    
    create table if not exists pessoas
    (
       idPessoa INT(6) unsigned auto_increment primary key,
       nome varchar(30) not null,
       dtnasc date,
       profissao varchar(20),
       sexo char(1),
       dtchg timestamp default current_timestamp on update current_timestamp,
       dtcad timestamp default current_timestamp
    );
    

    Executando Scripts

    Entre na pasta scripts, para que possamos criar nossas estruturas de banco.

    Digite o comando:

    make

    executa a criação do banco

    A figura abaixo mostra sua execução

    Exemplo do script do banco de dados

    Por fim mais um vídeozinho

    Procedimento de instalação dos scripts

    Permissões

    Ao montar o segundo artigo lembrei que para melhorar este artigo, o ideal seria criar uma conta especifica para cada aplicação. Desta forma criei um scripts novo chamado GRANTS.SQL

    Desta forma, existe essa ultima etapa. Que precisamos, que será criar um usuário para acesso a aplicação:

    Criando o usuario:

    CREATE USER 'seu_usuario'@'localhost' IDENTIFIED BY 'suasenha';

    Dando permissão:

    GRANT ALL PRIVILEGES ON * . * TO 'seu_usuario'@'localhost';

    Finalizando

    FLUSH PRIVILEGES;

    Este procedimento será validado, quando digitarmos

    mysql -h localhost -u gcc -p

    Conectando em banco de dados

    Pois se as permissões não estiverem corretas o usuario não conecta.

    Sempre que avançarmos em uma etapa, um novo usuário será criado, neste script.

    Então não estranhem se eventualmente os scripts sofrerem modificação no git.

    Cenas do próximos capítulos

    Agora que preparamos a cama, iremos começar a codificar nela. No próximo artigo iremos criar um crud em C para cadastrar pessoas.

    Até a próxima.

    Referências

    https://stackoverflow.com/questions/838978/how-to-check-if-mysql-database-exists

    https://stackoverflow.com/questions/11739014/how-to-generate-a-create-table-script-for-an-existing-table-in-phpmyadmin

    https://stackoverflow.com/questions/6239131/how-to-grant-remote-access-permissions-to-mysql-server-for-user

    https://linuxize.com/post/how-to-create-mysql-user-accounts-and-grant-privileges/

    Artigos Relacionados

      maurinsoft.com.br