IA PHP pós graduação Python
Chatbot no wordpress – Parte 2b

Neste fragmento criamos uma série de mudanças no plugin do wordpress para centralizar as operações do chatbot.

Git do projeto

https://github.com/marcelomaurin/chatbot-wordpress

Fiz esta modificação para facilitar a gestão dos itens.

Mudanças envolvidas

No plugin foram feitas diversas mudanças, entre elas. Criação de um menu de itens.

Plugin do wordpress

Temos um menu onde temos opções de Teste de funcionalidade do chatbot

Exemplo do chatbot

E o histórico, que mostra as perguntas realizadas, com opção de exclusão de lixo.

Histórico de Pesquisa

O projeto agregou um web service, que permite comunicação com o banco de dados, conforme o projeto historico.php.


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

include "connectdb.php";

$typereq = $_SERVER['REQUEST_METHOD'];
//echo $typereq;

if ($typereq==='POST')
{
	//echo "POST";
    // The request is using the POST method
	$data = json_decode(file_get_contents("php://input"));
	if($data){
		$localguid = $dbhandle->real_escape_string($data->guid);
		$idhistorico = $dbhandle->real_escape_string($data->idhistorico);
		//echo var_dump(json_decode($foo, true));
	} else {
		$localguid = $dbhandle->real_escape_string($_POST['guid']);
		$idhistorico = $dbhandle->real_escape_string($_POST['idhistorico']);
		//echo "3";
	}
	//echo $localguid;
	//echo $idhistorico;
}

if ($typereq === 'GET') {
	//echo "GET";
    // The request is using the POST method
	$data = json_decode(file_get_contents("php://input"));
	if($data){
		$localguid = $dbhandle->real_escape_string($data->guid);
		$idhistorico = $dbhandle->real_escape_string($data->idhistorico);
	} else {
		$localguid = $dbhandle->real_escape_string($_GET['guid']);
		$idhistorico = $dbhandle->real_escape_string($_GET['idhistorico']);
	}
}

if ($typereq === 'DELETE')
{
	//echo $typereq;
	$data = json_decode(file_get_contents("php://input"));
	if($data){
		$localguid = $dbhandle->real_escape_string($data->guid);
		$idhistorico = $dbhandle->real_escape_string($data->idhistorico);
	} else {
		$localguid = $dbhandle->real_escape_string($_GET['guid']);
		$idhistorico = $dbhandle->real_escape_string($_GET['idhistorico']);
	}
	//$localguid = $data->guid;
	//$idhistorico = $data->idhistorico;
	$query = "delete from historico where idhistorico = ".$idhistorico;
	$dbhandle->query($query);
	//echo ($query);
}

if($localguid!=GUID)
{
	//echo $localguid;
	//echo "  - - ";
	//echo GUID;
	$strJSON =  '{';
	$strJSON = $strJSON . '"mensagem":"Acesso negado"';
	$strJSON = $strJSON . '}';
	echo $strJSON;
	exit();
}


if (($typereq === 'GET')||($typereq === 'POST')){
	if(($idhistorico)&&($idhistorico!='0'))
	{
		$query = "select idhistorico, pergunta from historico where (idhistorico = ".$idhistorico.");";
	} else {
		$query = "select idhistorico, pergunta from historico ;";
	}
	$rs = $dbhandle->query($query);

	$cont = 0;
	//echo $query;
	$strJSON =  '{"rs":[';
	//while($row=$rs->fetch_assoc())
	while($row=$rs->fetch_assoc())
	{

		if($cont!=0)
		{
			$strJSON = $strJSON . ',';
		}
		$strJSON = $strJSON . '{';
		$strJSON = $strJSON . '"idhistorico":'.$row['idhistorico'].',';
		$strJSON = $strJSON . '"pergunta":"'.$row['pergunta'].'"';
		$strJSON = $strJSON . '}';
		$cont ++;
	}
	$strJSON = $strJSON . ']}';
	if ($cont>0)
	{
		echo($strJSON);
	}
}
?>

No código acima, vemos que os verbos do HTML estão contemplados, apesar do sistema apenas usar o POST e DELETE.

O uso destes verbos será modelo para outros web services mais complexos.

Outra melhoria foi o uso de um GUID, que irá aumentar a segurança, restringindo o acesso ao web service, apenas a requisições com a chave correta.

Muitas mudanças ainda serão necessárias, porem estas garantem que nosso chatbot seja mais prático.

Muitas pessoas sabem que um chatbot não precisa deste tipo de melhoria, mas de fato, quando a intensão é o aprendizado, faze-lo de forma que fique mais fácil gerenciar as diversas ações de gestão do chatbot, ajudarão em um futuro próximo.

Há muito o que fazer, espero que acompanhem essa jornada.

Abraço.

IA PHP Python wordpress
Chatbot no wordpress – Parte 2

Agora que criei a página do Chatbot, vou comecar a preparar o recheio.

Definindo objetivo do Chatbot

A primeira coisa que precisamos saber é sobre o que devemos realizar nosso chatbot.

Bom irei falar sobre os projetos da maurinsoft.

Então o primeiro trabalho que irei precisar é criar simulados de perguntas, para facilitar isso, irei criar um conjunto de aplicações.

Neste post irei falar sobre o primeiro.

A melhor forma de criar um conjunto de perguntas é perguntando.

Então vou adicionar ao meu projeto uma tabela historico.

historico.sql

use maurinsoftdb;

create table historico (
  idhistorico int AUTO_INCREMENT PRIMARY KEY,
  pergunta varchar(200) not null,
  ip varchar(40),
  dtquest TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Agora que criei o espaço de armazenamento no banco, irei incluir no web service que processa a pergunta.

Fonte: runpy.php

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

	header('Content-Type: application/json');  // <-- header declaration

	include "/var/www/html/python/connectdb.php";

	//header('Cache-Control: no-cache, must-revalidate');

$data = json_decode(file_get_contents("php://input"));

if($data){
		$pergunta = $dbhandle->real_escape_string($data->pergunta);
} else {
		$pergunta = $dbhandle->real_escape_string($_GET['pergunta']);
}

$ip = $_SERVER['REMOTE_ADDR']; /*Pega o ip do cliente*/

//echo "Inseriu";
$query= "INSERT into historico (pergunta, ip) values ( '". $pergunta. "', '".$ip."')";
$dbhandle->query($query); /*Executa*/

$json =  '{"rs":[';
if($pergunta){
  $command = escapeshellcmd('/var/www/html/python/nlp.py "'.$pergunta.'" > /var/log/proclog.log');
  $resposta = shell_exec($command);
  $resposta = str_replace (array("\r\n", "\n", "\r"), ' ', $resposta);

  if($resposta){
     $json = $json  . '{';
     $json = $json  .  '"pergunta":"'.$pergunta.'",';
     $json = $json  .  '"resposta":'.$resposta;
     $json = $json  .  '}';
  } else {
	 $json = $json  . '{';
	 $json = $json  .  '"pergunta":"'.$pergunta.'",';
     $json = $json  .  '"resposta":"'.'sem resposta'.'"';
	 $json = $json  .  '}';
  }
} else {
	$json = $json  . '{';
	$json = $json  .  '"pergunta":"'.$pergunta.'",';
    $json = $json  .  '"resposta":"'.'sem resposta'.'"';
	$json = $json  .  '}';
}
$json = $json  .  ']}';

echo $json
?>

Neste projeto que não irei falar muito, pois ja comentei sobre a maior parte em posts anteriores, fiz a inserção do código abaixo:

//echo "Inseriu";
$query= "INSERT into historico (pergunta, ip) values ( '". $pergunta. "', '".$ip."')";
$dbhandle->query($query); /*Executa*/	

Nela ao receber a pergunta armazenamos ela p pesquisa histórica.

Próximos passos

A seguir os próximos passos que iremos postar.

  • Iremos montar as questões que serão respondidas
  • Iremos cadastrar as respostas possíveis
  • Iremos associar as perguntas as respostas
  • Iremos gerar treinamento da nossa rede
  • Iremos codificar nosso código em python.
IA PHP Python
Criando um chatbot – Parte 1

Neste artigo iremos dar inicio a criação de um chatbot. Ele estará sendo hospedado em um raspberry pi.

Utilizando PHP, AngularJS e Python.

Este artigo é uma continuação do artigo anterior, que pode servir de referência:

http://maurinsoft.com.br/index.php/2022/05/27/integrando-python-com-php/

Eu apresentarei uma introdução hoje ao Angularjs e o PHP, onde apenas depois mostrarei a parte do Python e do IA propriamente dito.

Este estudo faz parte do estudo da minha Pós graduação na UNINOVE.

Primeiramente iremos escrever o javascript ctlr_test.js



		angular.module("App",[]);
		angular.module("App").controller("TesteCtrl", function ($scope,$http) {
			$scope.app = "Teste Chatbot";
			$scope.texto = "";
			$scope.pergunta = "";
			$scope.msg = "Dúvidas entre em contato com marcelomaurinmartins@gmail.com";
			$scope.resposta = "Sem resposta";
			$scope.url = "http://maurinsoft.com.br/python/runpy.php?pergunta?"+$scope.pergunta;

			$scope.IncluiResposta = function() {
			   $scope.texto = $scope.texto . $scope.resposta;
			}
			$scope.displayResposta = function() {
				$http.get("http://maurinsoft.com.br/python/runpy.php?pergunta="+$scope.pergunta)
				.success(function(data)
				{
					//console.log(data);
					$scope.data = data.rs[0];
					$scope.resposta = data.rs[0].resposta;
					$scope.texto = $scope.texto + "Pergunta:"+$scope.pergunta+'\n';
					$scope.texto = $scope.texto + "Resposta:"+$scope.resposta+'\n';
					$scope.msg = "Resposta obtida!";
				})
				.error(function(erro)
				{
					//console.log(erro);
					$scope.msg = "Pesquisa retornou vazia";
					$scope.data = null;
				})
			}
		});

Nele chamamos a função IncluiResposta , que envia a resposta para o web service(ws), que recebe a resposta e devolve para o browser.

Ao enviar a solicitação, a mesma é processada pelo ws, que devolve um json, na figura abaixo, vemos a execução direta do json, simulando a pergunta do browser.

Depois iremos criar o index.php , que monta uma interface para ser mostrada na tela.

<!DOCTYPE HTML>
	<HTML  ng-app="App" LANG="PT-BR">
	<head>
		<meta charset="UTF-8"/>
		<meta name="description" content="Maurinsoft"/>
		<meta name="viewport" content="width=device-width, initial-scale=1"/>
		<title>Teste de Chatbot</title>

		<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js"></script>

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



		<link rel="stylesheet" href="../../libs/bootstrap/css/bootstrap.css"/>
		<link rel="stylesheet" href="../../libs/bootstrap/css/bootstrap-theme.min.css"/>
		<link rel="stylesheet" href="style.css"/>
		<script src="https://code.angularjs.org/1.6.4/angular.js"></script>
		<script src="js/ctlr_test.js"></script>

	</head>
	<body ng-controller="TesteCtrl">
		<video autoplay loop poster="img/logo.jpg" class="bg_video">
			<source src="video/fundo.webm" type="video/webm">
			<source src="video/fundo.mp4" type="video/mp4">
		</video>
		<div class="container">
			<!--Caixa titulo -->
			<div class="row  borda_container">
				<div class="col-xs-2 ">
					<img src="img/logo.png" alt="Tutorial de CSS" title="Logo do CSS"  width="100" height="100"/>
				</div>
				<div class="col-xs-10 Logo ">
					<h1 class="titulo">{{app}}</h1>
				</div>
			</div>
			<div class="row separacao">
			</div>

			<!--Login -->
			<div class="row">

			</div>

			<!--Menu Item-->
			<div class="row">
					<div class="col-xs-12 menu">
						<div class="row">
						  <h4 class="menu_titulo">Conversa</h4>
						</div>

						<div class="row container col-xs-12">
						   <textarea type="text"  style=" top:500px;height:200px;width:600px; left:470px; overflow:hidden;" class="col-md-10" >{{texto}}</textarea>
						</div>
						<div class="info_help">
					   	 <div class="row col-md-12">
						    <h4>Perguta</h4>
						 </div>
						 <div class="row container">
						    <div class="col-md-8">
						      <input type="text" value="{{pergunta}}" ng-model="pergunta" name="Pergunta">
						    </div>
						    <div class="col-md-2">
						     <input type="submit" value="Enviar" ng-click="displayResposta()">
						    </div>
						 </div>
						</div>
					</div>
			</div>
		</div>
		<div class="row rodape_container">
			  <div class="row">
			  <center>{{msg}}</center>
			  </div>

		</div>
		<script type="text/javascript" src="../../libs/bootstrap/js/bootstrap.js"></script>
	</body>
	</html>

Chamada do lado do WS

No webservice, o python é chamado, que realiza toda a analise da pergunta.

Fonte do runpy.php, que é o web service.

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

	header('Content-Type: application/json');  // <-- header declaration

	include "/var/www/html/ws/connectdb.php";

	//header('Cache-Control: no-cache, must-revalidate');




$data = json_decode(file_get_contents("php://input"));

if($data){
		$pergunta = $dbhandle->real_escape_string($data->pergunta);
} else {
		$pergunta = $dbhandle->real_escape_string($_GET['pergunta']);
}


$json =  '{"rs":[';
if($pergunta){
  $command = escapeshellcmd('/var/www/html/python/nlp.py "'.$pergunta.'" > /var/log/proclog.log');
  $resposta = shell_exec($command);
  $resposta = str_replace (array("\r\n", "\n", "\r"), ' ', $resposta);

  if($resposta){
     $json = $json  . '{';
     $json = $json  .  '"pergunta":"'.$pergunta.'",';
     $json = $json  .  '"resposta":'.$resposta;
     $json = $json  .  '}';
  } else {
	 $json = $json  . '{';
	 $json = $json  .  '"pergunta":"'.$pergunta.'",';
     $json = $json  .  '"resposta":"'.'sem resposta'.'"';
	 $json = $json  .  '}';
  }
} else {
	$json = $json  . '{';
	$json = $json  .  '"pergunta":"'.$pergunta.'",';
    $json = $json  .  '"resposta":"'.'sem resposta'.'"';
	$json = $json  .  '}';
}
$json = $json  .  ']}';

echo $json


?>

O armazenamento das solicitações, podem ser gravadas pelo webservice, que permite gravar as respostas, para aprimoramento posterior.

Fonte do nlp.py, que gera a analise em python.

#!/usr/bin/env python3

#import pandas as pd
import sys
import numpy as np
import math
import time
import re
import random


pergunta = f'"{sys.argv[1]}"'

resposta = "Desculpe, não achei uma resposta válida"

#Iniciando o processo de analise de dados



#Devolvendo o modelo para o ws
resposta= "\"%s\""%(resposta)
print(resposta)

Neste exemplo simples porem integral, podemos notar o processo completo de desenvolvimento de chatbot, sem a implementação da parte do python, que abordaremos nos próximos tópicos.

URL do projeto

http://maurinsoft.com.br/index.php/2022/06/30/chatbot-no-wordpress/

IA PHP Python
Integrando Python com PHP

Neste artigo abordarei como rodar rotinas em python integrado com PHP.

Para exemplificar este projeto, estarei criando uma pagina PHP, conforme se segue:

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

	include "/var/www/html/ws/connectdb.php";

	//header('Cache-Control: no-cache, must-revalidate');


$data = json_decode(file_get_contents("php://input"));


$data = json_decode(file_get_contents("php://input"));
if($data){
		$pergunta = $dbhandle->real_escape_string($data->pergunta);
} else {
		$pergunta = $dbhandle->real_escape_string($_GET['pergunta']);
}



if($pergunta){
  $command = escapeshellcmd('/var/www/html/python/nlp.py "'.$pergunta.'" > /var/log/proclog.log');
  $resposta = shell_exec($command);

  if($resposta){
  echo '{"rs":[';
  echo '{';
  echo '"pergunta":'.$pergunta.',';
  echo '"resposta":'.$resposta;
  echo '}]}';
  } else {
    echo "sem resposta";
  }
} else {
	echo "sem pergunta";
}


?>

Neste programa chamamos o comando shell_exec para executar o comando python.

Ao chamar o programa python, devemos chamar, conforme apresentado.

#!/usr/bin/env python3

#import pandas as pd
import sys


pergunta = f'"{sys.argv[1]}"'

resposta= '"ok"'
print(resposta)

O detalhe que é importante é o comando /usr/bin/env chamando o python, que é destinado a transformar em um script python.

Para finalizar segue o link do url de teste:

http://maurinsoft.com.br/python/runpy.php?pergunta=teste2

O resultado é um JSON, conforme apresentado:

{"rs":[{"pergunta":teste2,"resposta":"ok" }]}

Instalando pacotes

Para adicionar pacotes basta rodar como administrador o comando:

pip3 install numpy

Exemplo de instalação do numpy

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

    PHP
    Programação PHP Integrada ao R

    O Desenvolvimento e analise de dados não é tarefa fácil.

    Integrar o R com outras linguagens é o segredo para analisar grande volume de dados em tempo real, gerando vetores e gráficos.

    Um exemplo deste é a Webapi que criei para linguagem PHP:

    http://maurinsoft.com.br:8090/ws/graphic.php

    Esta web api, gera um arquivo de imagem com um gráfico.

    Ao chamar o URL, é chamado em tempo de execução um script em R, que gera a imagem e armazena em um repositório.

    É possível criar diversos scripts com o mesmo URL, basta indicar nos parametros o script em R que deverá ser rodado.

    No caso do default.R, lê as informações processadas do sensor de chuva, que aponta quando ocorre precipitação de chuva em minha casa.

    Valore altos de 900 até 1024, indicam tempo seco.

    A imagem é armazenada neste endereço.

    Neste exemplo, o R processou o seguinte comando SQL

    select

    devvalue, dtupdate

    from logdevpar

    where

    devparname=’dev3′

    and iddevice=’2′

    and (dtupdate>=( DATE_SUB(CONCAT(CURDATE(), ‘ 00:00:00’), INTERVAL 1 DAY) ))

    order by dtupdate

    limit 100

    maurinsoft.com.br