Jump to content


Grundor

Member Since 18/08/2008
Offline Last Active 12/08/2011, 23:35
-----

Topics I've Started

Php5.3+Zend/ Programação Em Camadas E Outros Frufrus

12/08/2011, 23:35

Olá amigos,
Estive procurando um fórum para falar sobre isso mas não encontrei nenhum, acho que não é um assunto que todos gostem de discutir.

Estou desenvolvendo o meu sistema em PHP5.3(completamente usando as novas regras e metodologias) e utilizando o Framework Zend.
Meu professor fica questionando milhares de coisas que não sei responder principalmente sobre camada DAO.
Pra mim o que importa é a joça funcionando no final e bem documentada, mas ele insiste nessa mesma tecla.

Eu utilizo assim:
View - html, no máximo alguns foreach para poder imprimir relatórios.
Controle - Manipulo o objeto modelo fazendo os ifs necessários e devolvendo os valores para a view.
Modelo - Dou extend em uma classe mae que por sua vez dá extend na Zend_db, nela eu faço coisas como "ListarTodosUsuariosAtivos()"

È certo ele ficar exigindo padrões de desenvolvimento desktop em desenvolvimento web?

Gostaria de saber o que vocês sabem a respeito disso.

Erro Com Sistema De Login Com Php Oo.

24/03/2011, 23:06

Olá,
Tem um bom tempo que não programo em PHP
A algumas semanas me interesse pelo framework EXTJS então estou querendo usá-lo em meu TCC.
O maior problema é que os exemplos que encontro estão com PHP estruturado então acabo me enrolando um pouco para adaptar para o OO.


Spoiler


Então, estou agora tentando criar uma pré-tela solicitando login e Senha e checando no banco de dados.

Criei então a Classe AutLogin.php

<?php
class AutLogin {
    public $nome, $senha;

  function getNome() {
   return $this->nome;
  }

  function AutLogin($nome,$senha) { // método construtor.
   $this->nome  = $nome;
   //A senha será submetida a um hash, que é uma criptografia sem volta.
   //$this->senha = md5($senha);
   $this->senha = $senha;
  }

  function autentica() {
   $con = new Conexao(); // Cria um novo objeto de conexão com o BD.
   $nome  = $this->nome;
   $senha = $this->senha;
   $query = "SELECT * FROM `usuarios` WHERE `usu_login` = '".$nome."' AND `usu_senha` = '".$senha."'";
   echo $query;
   $resultados = $con->execute($query);
   if (mysql_num_rows($resultados)>0) {
    $this->geraSessao($this);
    $con->fecha();
    return true;
   }
   else{
    return false;
    echo "Falha ao Conectar";
   }
  }

  function geraSessao($usuario) {
   session_start();
   $_SESSION['usuario'] = $usuario;
  }
  function destruirSessao(){
     return session_destroy(); 
  }
}
?>


E o arquivo para include e receber os dados do form de execução da autenticação

<?php
 include ("../class/AutLogin.php");
 include ("../class/Conexao.php");

$username = $_POST["loginUsername"];
$password = $_POST["loginPassword"];

 $usuario = new AutLogin($username,$password);

 if ($usuario->autentica()) {
  header("location:principal.php");
 }
 else {
  header("location:login.php");
 }
?>

Usando um dos exemplos que achei modifiquei o seguinte arquivo para o login:

<html>
<head>
<title>Autenticação</title>
<link rel="stylesheet" type="text/css" href="lib/ext3.2.1/resources/css/ext-all.css" />
		<link rel="stylesheet" type="text/css" href="lib/ext3.2.1/examples/shared/icons/silk.css"/>
		<link rel="stylesheet" type="text/css" href="lib/ext3.2.1/examples/shared/examples.css"/>
		<link rel="stylesheet" type="text/css" href="lib/ext3.2.1/examples/ux/flashmessage/Ext.ux.MessageBox.flash.css">

<!-- LIBS -->
<script type="text/javascript" src="lib/ext3.2.1/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="lib/ext3.2.1/ext-all.js"></script>

<script type="text/javascript" src="js/JanelaLogin.js"></script>
<!-- ENDLIBS -->

</head>
<body>
<div id="xxx"></div>
</body>
</html>
(aqui o arquivo no ar http://www.l2jbrasil...teste/login.php)

E o JS que constrói a tela de login:
Ext.onReady(function()
{
     Ext.QuickTips.init();

     var login = new Ext.FormPanel(
     {
          labelWidth:80,
          url:'include/LoginAction.php',
          frame:true,
          title		: 'Autenticação',
          defaultType:'textfield',
          monitorValid:true,
          iconCls : 'icone-cadeado',
          items:[{
               fieldLabel:'Usuário',
               name:'loginUsername',
               allowBlank:false,
               blankText: 'Preencha este campo'
          },{
               fieldLabel:'Senha',
               name:'loginPassword',
               inputType:'password',
               allowBlank:false
          }],buttons:[{
               text:'Login',
               formBind: true,
               iconCls : 'icone-porta-entrando',
               // Aciona quando clica no botao
               handler:function(){
                    login.getForm().submit({
                         method:'POST',
                         waitTitle:'Conectando',
                         waitMsg:'Enviando dados...',
                         success:function(){
                              Ext.Msg.alert('Status', 'Logado com Sucesso!', function(btn, text){
                                   if (btn == 'ok'){
                                        var redirect = 'principal.php';
                                        window.location = redirect;
                                   }
                              });
                         },

                         // Failure function, see comment above re: success and failure.
                         // You can see here, if login fails, it throws a messagebox
                         // at the user telling him / her as much.

                         failure:function(form, action){
                              if(action.failureType == 'server'){
                                   obj = Ext.util.JSON.decode(action.response.responseText);
                                   Ext.Msg.alert('Login Failed!', obj.errors.reason);
                              }else{
                                   Ext.Msg.alert('Atenção!', 'Servidor de autenticação está inacessível : ' + action.response.responseText);
                              }
                              login.getForm().reset();
                         }
                    });
               }
          }]
     });


     // This just creates a window to wrap the login form.
     // The login object is passed to the items collection.
     var win = new Ext.Window({
          layout:'fit',
          width:300,
          height:180,
          closable: true,
          resizable: false,
          plain: true,
          border: false,
          items: [login]
     });
     win.show();
});


Então quando insiro os dados de login e senha fica toda vida tentando logar-se mas não loga.. então adicionei o login e senha por $_GET para testar o php:

http://www.l2jbrasil...=usu1&pass=usu1
Exibe-se então o seguinte erro:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/l2jbrasil/www/leonan/projfinal/teste/class/AutLogin.php on line 34

Warning: Cannot modify header information - headers already sent by (output started at /home/l2jbrasil/www/leonan/projfinal/teste/class/AutLogin.php:32) in /home/l2jbrasil/www/leonan/projfinal/teste/include/LoginAction.php on line 17


A SQL está correta e executa.

SELECT * FROM `usuarios` WHERE `usu_login` = 'usu1' AND `usu_senha` = 'usu1'

Aqui tá a classe de conexão(que funciona para as outras aplicações normalmente.
<?php

/**
 * Classe para tabalhar com banco de dados
 */

class Conexao {
	
	private $con; # objeto de conexão
	
	public function __construct() {
		# efetua conexão com servidor
		$this->con = mysql_connect('localhost', 'root', '');
		if (!$this->con) {
		    die('N�o foi poss�vel conectar-se com o servidor: ' . mysql_error());
		}
		
		# seleciona banco de dados
		if (!mysql_select_db('TST_PEDIDOS', $this->con)) {
		    die ('N�o foi poss�vel selecionar o banco de dados: ' . mysql_error());
		}
	}
	
	/**
	 * Fecha conexão
	 * @return void
	 */
	public function fecha() {
		# fecha conexão
		mysql_close($this->con);
	}

	/**
	 * Executa uma query no banco
	 * @param $sql (query a ser executada)
	 * @return true|false|array
	 */
	public function execute($sql) {
		$sql = trim($sql);
		$retorno = false;
		
		# executa a query
		$result = mysql_query($sql);
		//print_r($sql);
		# no caso de select, os dados são colocados em um array
		if (is_bool($result))
			$retorno = $result;
		else {
			
			while ($row = mysql_fetch_array($result)) {
				# codifica resultado para utf8
				array_walk($row, 'toUtf8');
   				$retorno[] = $row;
			}
		}
		
		return $retorno;
	} # execute
	
} # fim da classe 
?>

Desculpem-me esse ar de desespero, mas só quem já passou pelo TCC sabe do que estou falando.. rsrs

Grato desde já.

Forte Abraço

IPB Skin By Virteq