quarta-feira, 19 de junho de 2013

Script padrão para bancos de dados Mysql em linguagem PHP - V

Bibliotecas - I

libParamLine.php

Esta biblioteca tem duas funções que tratam essencialmente dos tipos possíveis de variáveis em uma tabela de banco de dados, não necessariamente do Mysql, mas de quase todos os bancos cujas queries sejam guiadas a SQL.

O primeiro objetivo é construir as sentenças SQL com a sintaxe correta, ou seja, colocando os conteúdos entre os delimitadores corretos, convertendo as senhas no formato criptografado e invertendo a data quando for preciso. Além disto o campo de email também é tratado.

O segundo objetivo é preparar corretamente as tags de INPUT, SELECT ou TEXTAREA, com os tipos e tamanhos corretos.

Código:

<?php
      // Classe usada para as ações: edit e editsave
      class paramLineOut{
public $delimitador;
public $valorfinal;
public $tipocampo;
public $taginput;
function __construct($arranjo,$linha,$valorparam){
 $valor = $valorparam;
 $this->valorfinal = $valorparam;
 $this->delimitador = $arranjo[$linha][7];
 $tipo = strtolower($arranjo[$linha][4]);
 $this->tipocampo = $tipo;
 $sTipo = $tipo;
 $inp = "<input";
 $this->taginput = $inp;
 switch ($tipo){
   case "select":
     $inp = "<select";
     $deli = "'";
     break;
   case "textarea":
     $inp = "<textarea";
     $deli = "'";
     break;
   case "":
     $deli = "";
     $sTipo = "number";
     break;
   case "'":
     $deli = "'";
     $sTipo = "text";
     break;
   case "email":
     $deli = "'";
     $sTipo = "text";
     break;
   case "hidden":
     $deli = "'";
     $sTipo = "hidden";
     break;
   case "pwd":
     $deli = "";
     $sTipo = "password";
     //$valor = "PASSWORD('" . $valor . "')";
     $valor = $valor;
     break;
   case "#":
     $deli = "'";
     $sTipo = "date";
     if( preg_match("/\d{1,2}[\/|\-]\d{1,2}[\/|\-]\d{4}/", $valor, $matches) ){
$dt = substr($valor,6,4) . "-" . substr($valor,3,2) . "-" . substr($valor,0,2);
//$dt = substr($valor,8,2) . "-" . substr($valor,5,2) . "-" . substr($valor,0,4);
//$dt = $valor;
} else {
$dt = $valor;
}
     
     $valor = $dt;
     break;
   default:
     $sTipo = "unknown";
     $deli = "'";
     break;
   }
   $this->delimitador = $deli;
   $this->valorfinal = $valor;
   $this->tipocampo = $sTipo;
   $this->taginput = $inp;
 }
function getDelimitador(){
 return $this->delimitador;
 }
function getValorfinal(){
 return $this->valorfinal;
 }
function getTipocampo(){
 return $this->tipocampo;
 }
}    
      // Classe usada para as ações: add, addsave e list
      class paramLine{
public $delimitador;
public $valorfinal;
public $tipocampo;
public $taginput;
function __construct($arranjo,$linha,$valorparam){
 $valor = $valorparam;
 $this->valorfinal = $valorparam;
 $this->delimitador = $arranjo[$linha][7];
 $tipo = strtolower($arranjo[$linha][4]);
 $this->tipocampo = $tipo;
 $sTipo = $tipo;
 $inp = "<input";
 $this->taginput = $inp;
 switch ($tipo){
   case "select":
     $inp = "<select";
     $deli = "'";
     break;
   case "textarea":
     $inp = "<textarea";
     $deli = "'";
     break;
   case "":
     $deli = "";
     $sTipo = "number";
     break;
   case "'":
     $deli = "'";
     $sTipo = "text";
     break;
   case "email":
     $deli = "'";
     break;
   case "hidden":
     $deli = "'";
     $sTipo = "hidden";
     break;
   case "pwd":
     $deli = "";
     $sTipo = "password";
     $valor = "PASSWORD('" . $valor . "')";
     break;
   case "#":
     $deli = "'";
     $sTipo = "date";
     if( preg_match("/\d{1,2}[\/|\-]\d{1,2}[\/|\-]\d{4}/", $valor, $matches) ){
$dt = substr($valor,6,4) . "-" . substr($valor,3,2) . "-" . substr($valor,0,2);
} else {
$dt = $valor;
}
     $valor = $dt;
     break;
   default:
     $sTipo = "unknown";
     $deli = "'";
     break;
   }
   $this->delimitador = $deli;
   $this->valorfinal = $valor;
   $this->tipocampo = $sTipo;
   $this->taginput = $inp;
 }
function getDelimitador(){
 return $this->delimitador;
 }
function getValorfinal(){
 return $this->valorfinal;
 }
function getTipocampo(){
 return $this->tipocampo;
 }
}
function openQuadro(){
 echo "<br><center><div class=moldb><div class=lin><div class=mold><br>";
 }
function closeQuadro(){
 echo "</div></div></div></center>";
 }
?>


terça-feira, 18 de junho de 2013

Script padrão para bancos de dados Mysql em linguagem PHP - IV

Estrutura da engine genérica

Vamos colocar esquematicamente os includes em relação ao diagrama anterior:


Includes e requires

O Include contém um trecho reaproveitável de código PHP. Já o Require contém um código reaproveitável de HTML. No entanto, devido à sua característica de macrosubstituição, o Require pode conter um trecho em PHP. Além desta característica reside a verdadeira DIFERENÇA: se houver erro num include, e execução prossegue, ao contrário do que acontece num Require. Como Require lembra REQUERIDO, é claro que a script tem que obrigatoriamente abortar caso o trecho não seja encontrado.

No entanto, neste padrão não fomos ortodoxos, mas você pode sê-lo.

Include/Require  Finalidade 
ExemploDefinicao.inc Contém o esquema dos campos a serem preenchidos e apresentados
pelas ações da script 
libParamLine.php Contém uma biblioteca de funções de tratamento de tipos e delimitadores para os conteúdos dos campos a serem preenchidos.
libScriptsJs.php Armazena as funções Javascript 
libCabecalhoPadrao.php Contém um trecho em HTML com o cabeçalho padrão das várias ações da
script. 
Conexao_banco.php  Executa a abertura da tabela no banco de dados e coloca o pointer em $conn 
Conexao_banco_close.php   Fecha a conexão do banco ($conn). 

Nos próximos posts vamos detalhar os 5 últimos includes (o primeiro já o foi).






segunda-feira, 17 de junho de 2013

Script padrão para bancos de dados Mysql em linguagem PHP - III

Vamos conceber uma script genérica (engine) que vai ler a estrutura de uma tabela Mysql a partir de um arranjo em PHP. Não vamos nos lançar na trabalhosa e fútil busca pelo genérico do genérico, fazendo mirabolâncias para ler as tabelas internas do Mysql, até porque pretendemos fazer "views", e não um phpmyadmin.

Ações da script

A script em PHP vai tomar conhecimento de qual ação ela precisa fazer através de um parâmetro na URL de chamada através do protocolo http. O parâmetro que vamos convencionar é action, e as possibilidades dele são:

 action Descrição da funcionalidade 
add Procedimento de inclusão. Mostra um formulário para acréscimo de registros à tabela. 
addsave Procedimento de salvamento do registro que veio da ação add.
edit Procedimento de edição. Mostra um formulário para alteração do registro. A ação deve ter o acréscimo do parâmetro Id (AutoNumeração), contendo o número do registro. 
editsave Procedimento de salvamento do registro que veio da ação edit.
dele Procedimento de preparo do registro para deleção. 
delesave  Procedimento de confirmação da deleção do registro. 
list Mostra uma relação dos registros a partir de um parâmetro e de um conteúdo escolhido.

Organização das ações

As ações estão implementadas dentro da engine na forma do comando switch(){ case ... }.

Diagrama das ações


Em bom código PHP, teríamos, a grosso modo, o seguinte:

// O ajuste da variável $action é feito no include que possui os parâmetros (ExemploDefinicao.php)
$action = strtolower($_REQUEST['action']);
switch($action){
case "add":
.
.
.
break;
case "addsave":
.
.
.
break;
case "edit":
.
.
.
break;
case "editsave":
.
.
.
break;
case "dele":
.
.
.
break;
case "delesave":
.
.
.
break;
case "list":
.
.
.
break;
default:
.
.
.
}

No próximo post começaremos a detalhar os demais includes, para depois especificar cada ação.







Script padrão para bancos de dados Mysql em linguagem PHP - II

No post anterior mostramos o coração das scripts de controle de registros em tabelas de bancos de dados Mysql (ou qualquer outro banco) para a linguagem PHP.

Mas o núcleo destas scripts precisa ter outros parâmetros para fácil configuração em um pedaço de código que seja passível de manutenção por até um estagiário. A seguir mostramos este include completo, ao qual demos o nome de ExemploDefinicao.inc:

<?php
// Mensagens
$msgAdd = "<p>Registro INCLU͍DO.<br>Obrigado. Fim da operação.</p>";
$msgEdit = "<p>Registro ALTERADO.<br>Obrigado. Fim da operação.</p>";
$msgDel = "<p>Registro EXCLU͍DO.<br>Obrigado. Fim da operação.</p>";
// Tí­tulos
$titulo = "Controle Padrão de Registros de Tabela em Banco de Dados";
$operAdd = "INCLUSÃO";
$descAdd = "Prepara a inclusão de um Registro";
$operAddSave = "INCLUSÃO - Gravação";
$descAddSave = "Efetua a inclusão definitiva do Registro";
$operEdit = "ALTERAÇÃO";
$descEdit = "Manutenção em um Registro";
$operEditSave = "EDIÇÃO - Gravação";
$descEditSave = "Efetivação da Manutenção no Registro";
$operDel = "DELEÇÃO";
$descDel = "Deleção de um Registro";
$operDelSave = "Deleção - Gravação";
$descDelSave = "Remoção definitiva do Registro";
$operList = "Relação dos Registros";
$descList = "Painel de Controle dos Registros";
// Botões Submit
$btnAdd = "GRAVAR";
$btnEdit = "ATUALIZAR";
$btnDel = "Confirmar DELEÇÃO";
// Permissões para as operações
$permiteAdd = TRUE;
$permiteEdit = TRUE;
$permiteDel = TRUE;
$permitePesq = TRUE;
$action = strtolower($_REQUEST['action']);
// Parâmetros de acesso ao Banco de Dados
$host = "localhost";
$user = "guest"; $senha = "xxxxxx";
$banco = "banco"; $tabela = "Tabela1";
// Arranjo de configuração do SCHEMA
$arr = array(
  "0"=> array("Id","Id",6,6,"","S", NULL,"NÃO preencha",""),
  "1"=> array("Descri","Descrição",25,50,"textarea","S",NULL,"",""),
  "2"=> array("DtAtiv","Data da Ativação",10,10,"#","S", NULL, "", ""),
  "3"=> array("TpReg","Tipo do Registro",10,10,"select","N","<option value=N/A>Nenhum<option value=A>A<option value=B>B<option value=C>C","",""),
  "4"=> array("Senha","Senha",10,10,"pwd","N",NULL,"Misture letras e números",""),
  "5"=> array("Cod","Codificação",25,25,"'","N",NULL,"","utf-8"),
  "6"=> array("Email","Email",50,80,"email","S",NULL,"",""),
  "7"=> array("NoPedido","No.do Pedido",4,4,"","N",NULL,"","")
  );
$NoCampos = count($arr);
?>

Este include se torna um arquivo de configuração da script genérica (engine) que faremos a seguir. Se o cliente para o qual estamos prestando serviço pedir modificações cosméticas na aparência dos formulários e partes funcionais da página PHP, quase todas elas residem neste include.

No próximo post mostraremos a estrutura geral da script genérica para manipulação das informações de uma tabela de dados do Mysql, utilizando este include.


Script padrão para bancos de dados Mysql em linguagem PHP - I

Vamos iniciar aqui um curso completo para explicar o acesso ao banco de dados Mysql através de scripts PHP, com os procedimentos para Inclusão, Alteração, Deleção e Relação de registros.

Esta script será genérica, ou seja, construindo um arranjo de forma apropriada, poderemos ter o controle destas quatro operações citadas sobre a estrutura de qualquer tabela do Mysql.

O arranjo mestre da estrutura

Este arranjo é uma espécie de derivado dos SCHEMAs de bancos de dados:

Tabela 1
 Índice Finalidade 
 0  Nome do campo no Mysql
 1  Nome do campo para exibição no formulário 
 2  Tamanho do campo no formulário (em caracteres)
 3  Tamanho máximo do conteúdo no campo do formulário (em caracteres)
 4  Tipo do campo (Ver a próxima tabela)
 5  Obrigatoriedade do preenchimento ("S" ou "N")
 6  Usado para o conteúdo de um campo do tipo Select. Se não for, deve conter NULL
 7  Mensagem auxiliar de preenchimento que aparecerá à frente do campo no formulário
 8  Valor default que vai aparecer no formulário de Inclusão

Tabela 2
 Tipo Descrição do conteúdo 
 "'"  (Aspas simples) Tipo texto em geral
 ""  (Vazio) Tipo numérico
# Campo data. A entrada pode ser no formato ano/mes/dia ou dia/mes/ano
email Campo de email
pwd Campo de senha
select Campo com um número finito e estático de opções
textarea Campo cujo conteúdo é do tipo a ser armazenado em um campo MEMO ou BLOB ou
VARCHAR de tamanho acima de 80 caracteres.

O include do SCHEMA

O preenchimento de um arranjo exemplo no include é:

$arr = array(
  "0"=> array("Id","Id",6,6,"","S", NULL,"NÃO preencha",""),
  "1"=> array("Descri","Descrição",25,50,"textarea","S",NULL,"",""),
  "2"=> array("DtAtiv","Data da Ativação",10,10,"#","S", NULL, "", ""),
  "3"=> array("TpReg","Tipo do Registro",10,10,"select","N","<option value=N/A>Nenhum<option value=A>A<option value=B>B<option value=C>C","",""),
  "4"=> array("Senha","Senha",10,10,"pwd","N",NULL,"Misture letras e números",""),
  "5"=> array("Cod","Codificação",25,25,"'","N",NULL,"","utf-8"),
  "6"=> array("Email","Email",50,80,"email","S",NULL,"",""),
  "7"=> array("NoPedido","No.do Pedido",4,4,"","N",NULL,"","")
  );
$NoCampos = count($arr);

A variável $NoCampos facilita o trabalho na hora de estabelecer os loops de exibição dos campos.

Repare nos tipos dos campos aparecendo após os dois tamanhos de campo. Somente o campo 5 tem um valor default. O campo do tipo select tem a lista de opções após o local para especificação de obrigatório ou não.

Devido à sua flexibilidade, os arranjos em PHP permitem uma manipulação bem mais simples que os arranjos em VBscript no ASP.

No próximo post veremos a estrutura completa do include com o SCHEMA.

sábado, 15 de junho de 2013

Teclado ABNT2 no Kubuntu 12.04, 12.10 e 13.04

Periféricos são uma dor de cabeça para se configurar. Mexer à mão em arquivos .conf é uma chateação.

Graças a Deus existem comandos que salvam a vida do analista e do programador. Se o seu teclado é do tipo ABNT2, e o sistema oferece a língua portuguesa, e as teclas de acento não funcionam, digite o seguinte comando no console:

setxkbmap -model abnt2 -layout br

Isto equivale a editar os arquivos de configuração do X11 (/etc/X11/xorg.conf, seção InputDevice). Editar arquivos de configuração à mão é muito bom para se jactar de ter conhecimento, mas já passamos deste tempo. Tudo tem que ser dirigido por aplicações gráficas.

Estranho é a opção de ABNT2 não estar já disponível no Configurador do Kubuntu.

Bom proveito.

quinta-feira, 13 de junho de 2013

Erro 0xc0000225 na instalação do Windows 2008 Server x64

No árduo trabalho de escolha e teste de servidores, tanto para a Web como para Redes e Intranets, e de virtualização dos mesmos, tivemos a oportunidade de proceder à instalação do Windows 2008 Server R2 em 64 bits.

Situação Inicial

A máquina (Dual Core) já possuía instalados o Windows Seven e o Linux Kubuntu 13.04, com todos os periféricos já instalados, inclusive um Wifi USB ASUS.

Por que uma situação tão complexa ? Para provar a capacidade do 2008 R2 de reconhecer sistemas instalados e incorporá-los ao seu menu de boot. Pois bem, a instalação parou com o erro 0xc0000225. Tentamos continuar, mas o erro reapareceu.

Os problemas

Então demos o boot para ver se tudo o mais continuava funcionando. E para nosso desprazer, nem Windows e nem Linux. O 2008 corrompeu a tabela do grub do Linux. Nem o Windows 7 ofereceu mais a opção de reparar.

É decepcionante que o 2008 não ofereça possibilidades de recuperação, e pelo que apuramos das causas, o que falta é a Microsoft dar um mínimo de recomendações. Além disto, com o domínio de sistemas e hardware que vem de pelo menos uns 30 anos, a Microsoft DEVERIA reconhecer na tabela de partições os sistemas do tipo Linux, e apresentá-los em seu menu de boot. Lamentável.

Solução

Basta HABILITAR o IO/APIC na BIOS, bem como a tecnologia Hyper-V, e os sistemas de 64 bits poderão ser instalados sem problema. Uma coisa tão simples que a Microsoft poderia colocar em letras vermelhas na capa da mídia do Windows 2008. É muita omissão.

Comentários

A Microsoft, como pretensa líder de vendas em softwares e soluções para servidores precisa, o quanto antes, colocar duas funcionalidades em seus produtos:

Detector de partições, inclusive Linux;
Opções para reparo de partições, bem como seu redimensionamento EM TEMPO DE INSTALAÇÃO;

Durante a instalação do Linux, é provida uma interface gráfica para redimensionamento, exclusão e criação de partições, bem como o GRUB, que possibilita configurar o comportamento dos diversos sistemas operacionais disponíveis em uma máquina.