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