Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Kelen Miranda Silva

Conexao PDO

Recommended Posts

Olá, preciso de uma ajuda. Sou iniciante em php.

Tinha uma conexão desta forma:

$conexao = new PDO('mysql:host=localhost;dbname=meubanco','meuuser','');

No entanto para fins de aprendizado ela ficou assim...

try
	{    
    	class dbconn 
			{
				public $dblocal;
              	public function __construct()
                  {
                  }
    
		public function initDBO()
          	{
				$this->dblocal = new PDO("mysql:host=localhost;dbname=meubanco;charset=latin1","root","",array(PDO::ATTR_PERSISTENT => true));
              	$this->dblocal->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
          	}
			}
    
    
	}
?>

Beleza. A conexão funciona sem problemas. 

Agora veja esta linha:

$result = $conexão->prepare($select); 

Aqui eu usava a variável ($conexão), agora tentei usar a variável ($this) e recebo um erro. (Fatal error: Using $this when not in object context in )

Como resolver isto, já que o nome não é mais "$conexão" e sim "$this" que não pode ser usado? Grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

$this é uma pseudo variável (quer dizer que ela se comporta como uma variável, mas, você não na verdade uma variável).

 

Citar

The pseudo-variable $this is available when a method is called from within an object context. $this is a reference to the calling object (usually the object to which the method belongs, but possibly another object, if the method is called statically from the context of a secondary object).

 

A parte grifada explica que $this está disponível dentro de um método que é chamado de dentro do contexto de um objeto, ou seja, uma referência do objeto chamado.

 

Você utiliza a variável $this dentro da class dbconn, pois, você está dentro de um contexto do objeto.

 

Para continuar utilizando o método PDO::prepare, você pode realizar de duas formas

 

Acessando a variável que contém a instância de PDO:

$result = $conexao->dblocal->prepare($select);

Ou criando o método prepare na class dbconn e realizando a chamada na PDO:

class dbconn
{
    /** demais código omitido **/

    public function prepare(string $statement , array $drive_options = array()) : PDOStatement
    {
        $this->dblocal->prepare($statement , $drive_option);
    }
}

Essas poderiam ser alternativas para a resolução da questão.

 

Entretanto, a PDO é uma biblioteca bem completa. Contanto que você não esteja criando nenhum comportamento novo e/ou adicionando novas funcionalidades, não há motivos para encapsular a PDO em outra classe. Utilize-a diretamente como ela é.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentei todas as opções...

Nesta,

$result = $conexao->dblocal->prepare($select);

Gera o seguinte erro:

Notice: Undefined variable: dblocal in C:\xampp\htdocs\admacuco4\index.php on line 57

Notice: Trying to get property of non-object in C:\xampp\htdocs\admacuco4\index.php on line 57

Fatal error: Call to a member function prepare() on null in C:\xampp\htdocs\admacuco4\index.php on line 57

Agora veja meu código:

dbconn.php

<?php

class dbconn {
	public $dblocal;
	public function __construct()
	{

	}
	public function initDBO()
	{
		$this->dblocal = new PDO("mysql:host=localhost;dbname=meubanco;charset=latin1","meuuser","minhasenha",array(PDO::ATTR_PERSISTENT => true));
		$this->dblocal->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
		
	}
?>

Agora minha página com erro:

Obs. Arquivo anterior incluso com require...

 

...

<?php
	if(isset($_POST['logar'])){
		//Recuperar Dados do Form
		$usuario=trim(strip_tags($_POST['usuario'])); 
		$senha=trim(strip_tags($_POST['senha']));
		
		//Selecionar Banco de Dados$
		$select = "SELECT * from tab_usuarios WHERE email=:usuario AND senha=:senha";
		
	try	{
		$result = $conexao->dblocal->prepare($select); //Limha 57 com erro
		$result->bindParam(':usuario',$usuario, PDO::PARAM_STR);
		$result->bindParam(':senha',$senha, PDO::PARAM_STR);
		$result->execute();
		
		//O código continua, mas acho que até dá pra ver meu problema.
		//A ideia aqui é a criação de um menu, que recupera dados do banco Mysql.	
?>


...

Esta variável $conexão, não existe em lugar algum. Portanto o PHP informa isto... Ela existia antes de eu mexer no código, como informei no início do post.

 

Lembrando que tenho pouco tempo de estudo do PHP. Estou vindo para ele cheio de manias de Acces/VBA. Lendo demais aqui... mas com a ajuda de vcs, penso que vai dar certo.

Compartilhar este post


Link para o post
Compartilhar em outros sites
17 horas atrás, Kelen Miranda Silva disse:

Esta variável $conexão, não existe em lugar algum. Portanto o PHP informa isto... Ela existia antes de eu mexer no código, como informei no início do post.

 

Lembrando que tenho pouco tempo de estudo do PHP. Estou vindo para ele cheio de manias de Acces/VBA. Lendo demais aqui... mas com a ajuda de vcs, penso que vai dar certo.

 

Acho que você não entendeu o conceito ou se atropelou na orientação a objeto.

Em fim é muito conteúdo para explicar aqui, então sugiro que pesquise a respeito de php orientado a objeto. Pelo fato de que não fez a instância da classe e ainda quer pegar um objeto, inseri-lo dentro de uma variável que não existe executando um método da classe que também não existe passando um parâmetro que não possui valor algum.

$result = $conexao->dblocal->prepare($select);  // Nunca isso vai funcionar

 

Como disse tente aprender alguma coisa sobre php orientado a objeto. E veja isso onde mostrei minhas algumas de minhas classes PDO:

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, Omar~ disse:

Acho que você não entendeu o conceito ou se atropelou na orientação a objeto.

Você tem razão...

2 horas atrás, Omar~ disse:

Como disse tente aprender alguma coisa sobre php orientado a objeto. E veja isso onde mostrei minhas algumas de minhas classes PDO:

É exatamente isso que estou fazendo. Estou lendo vários manuais e vendo videos e agora procurei o fórum. Enfim, é muito conteúdo.

Só queria entender  como fazer pra que eu possa substituir a conexão de

$conexao = new PDO('mysql:host=localhost;dbname=meubanco','meuuser','');

para o jeito que está, dentro de uma classe.

 

2 horas atrás, Omar~ disse:

$result = $conexao->dblocal->prepare($select);  // Nunca isso vai funcionar

Isto funcionava antes com a conexão do jeito acima. E também  tentei como a Gabriel sugeriu.

 

Como o amigo Gabriel ensinou, $this, não pode ser usado neste caso. Entendi. 

 

Mudei o tipo de conexão. 

E aqui o que deveria mudar?

20 horas atrás, Kelen Miranda Silva disse:

try { $result = $conexao->dblocal->prepare($select); //Limha 57 com erro

 

Tentei isto...

$conexão= new dbconn();

antes da linha acima, mas também não deu...

 

De qualquer forma, grata desde já...

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Kelen Miranda Silva o seu erro é exatamente tentar utilizar um objeto que não foi instanciado.

 

O erro abaixo é o que mais explica o problema.

Citar

Notice: Trying to get property of non-object in C:\xampp\htdocs\admacuco4\index.php on line 57

Traduzindo: Tentando obter a propriedade de um "não objeto".

 

Como eu não vi o seu código completo, eu bato na tecla que já foi mencionada. O objeto $conexao não foi instanciado.

try
{
    $conexao = new dbconn();
    $result = $conexao->dblocal->prepare($select);
}
catch (Exception $exception)
{
}

Esse código acima deve funcionar sem problemas. Se não funcionar, existe algum erro em outro lugar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ao seguir sua dica, ele me retornou o erro:


Fatal error: Call to undefined method dbconn::prepare() in C:\xampp\htdocs\...\index.php on line 49

 

Segue o código completo:

dbconn.php

<?php

class dbconn {
	public $dblocal;
	public function __construct()
	{

	}
	public function initDBO()
	{
		$this->dblocal = new PDO("mysql:host=localhost;dbname=meubanco;charset=latin1","meuuser","minhasenha",array(PDO::ATTR_PERSISTENT => true));
		$this->dblocal->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
		
	}
	
}
?>

No arquivo com erros:

index.php

<?php
include ("model/dbconn.php");

if(isset($_POST['logar']))
    
{

    //Recuperar Dados do Form
    $usuario=trim(strip_tags($_POST['usuario'])); 
    $senha=trim(strip_tags($_POST['senha']));

    //Selecionar Banco de Dados$
    $select = "SELECT * from tab_usuarios WHERE email=:usuario AND senha=:senha";
    
    try    
        {
            $conexao = new dbconn(); //Incluida por orientacao do Amigo Gabriel - Gerou o erro (atal error: Call to undefined method dbconn::prepare() in C:\xampp\htdocs\...)
            $result = $conexao->prepare($select); //Antes estava aqui o erro.
            $result->bindParam(':usuario',$usuario, PDO::PARAM_STR);
            $result->bindParam(':senha',$senha, PDO::PARAM_STR);
            $result->execute();

            //Contagem de Registro PDO
            $contar = $result->rowCount(); 
            if($contar>0)
                { //Se tiver um registro no BD...
                    $usuario=$_POST['usuario'];
                    $senha=$_POST['senha'];
                
                    //Criamos uma session para guardar o user e a senha
                    $_SESSION['usuarioad'] = $usuario; 
                    $_SESSION['senhaad'] = $usuario; 
                    echo '<div class="alert alert-sucess" role="alert">
                    <strong>Logado com sucesso!</strong> Redirecionando....
                    </div>';
                    header ("Refresh: 2, home.php");exit;

                }else
                    {
                        echo '<div class="alert alert-dangers" role="alert">
                            <strong>Erro ao Logar!</strong> Usuário e/ou Senha Incorretos.
                            </div>';
                    }

        }catch(PDOException $e)
        {

        }
}            

?>

Mais uma vez obrigado pela atenção

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora você está cometendo o mesmo erro que foi comentado aqui. Você não pode chamar na classe dbconn um método da classe PDO.

 

Que é exatamente o que você está fazendo aqui:

$result = $conexao->prepare($select); //Antes estava aqui o erro.

E as soluções continuam a mesma.

 

Utilize a variável dblocal:

$result = $conexao->dblocal->prepare($select);

Ou crie o método prepare na class dbconn:

class dbconn
{
    /** demais código omitido **/

    public function prepare(string $statement , array $drive_options = array()) : PDOStatement
    {
        $this->dblocal->prepare($statement , $drive_option);
    }
}

Ou utilize diretamente PDO:

$conexao = new PDO("mysql:host=localhost;dbname=meubanco;charset=latin1","meuuser","minhasenha",array(PDO::ATTR_PERSISTENT => true));
$conexao->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$result = $conexao->prepare($select);

Utillize apenas uma dessas três soluções.

 

A mais recomendada é a última, pois, sua classe dbconn não está criando/alterando nenhum comportamento da classe PDO, logo, a PDO pode ser usada por si só.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos ver....

É tudo pura questão de saber como criar uma classe, acessar seus métodos, e criar objetos dessa classe.

Tentaremos uma coisa então, vamos fazer uma classe simples aqui o nome do arquivo vai ser (MinhaClasseConn.php):

 

Spoiler

<?php
class MinhaClasseConn {

    private $host = 'localhost';
    private $database = 'meu_database';
    private $login = 'root';
    private $senha = '';

    /* Somente esse atributo realmente é necessário */
    private $conexao;

    private function conectarPrivado() {
        /* Primeiro pegamos alguns atributos para colocarmos os dados (Não que isso seja realmente necessário)
         * Então lançamos uma exceção (É para isso que servem blocos TRY)
         */
        try {
            $this->conexao = new PDO("mysql:host={$this->host}; dbname={$this->database}", $this->login, $this->senha);
        } catch (PDOException $erro) {
            echo "A conexão não foi completada por esse motivo:<p><b>{$erro->getMessage()}</b></p>";
        }
        $this->conexao->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        /* Beleza então com isso vamos retornar o atributo com tudo que está armazenado nele */
        return $this->conexao;
    }

    public function acessarConexao() {
        return $this->conectarPrivado();
    }

}

 

 

Opa! Temos uma classe. E ela possui 2 métodos, um para executar a conexão e outro método público para podemos chamar essa conexão. LEGAL

 

Podemos então testar se deu certo. Criamos um novo arquivo.php e fazemos isso:

Spoiler

<?php
require ('MinhaClasseConn.php');

$objeto = new MinhaClasseConn();

// Isso é apenas para testar se conseguimos conectar
var_dump($objeto->acessarConexao());

 

Se tudo ocorreu bem nosso objeto recebeu 2 dados da classe PDO. Deve aparecer algo tipo assim: object(PDO)#2 (0) { }

 

Então vimos como criar a classe como criar um objeto e como acessar um método da classe.

 

Que tal agora tentar selecionar algum dado no banco de dados? Vamos tentar....

No mesmo arquivo criamos uma variável e armazenamos nosso objeto que tem o método que faz parte dele

$variavel = $objeto->acessarConexao();

Mas nada acontece com isso. Apesar que nesse momento armazenamos a toda a classe e sua conexão em uma variável ou seja, executamos todo aquele código em um única linha. (POO é uma maravilha mesmo)

Tentamos então fazer um select

Spoiler

<?php
require ('MinhaClasseConn.php');

$objeto = new MinhaClasseConn();
try {
    $variavel = $objeto->acessarConexao();
    $tabela = 'usuarios';
    $coluna = 'nome';
    $dados = 'Coelinho da páscoa';

    $query = $variavel->prepare("SELECT * FROM {$tabela} WHERE {$coluna} = :statement");
    $query->bindParam(':statement', $dados, PDO::PARAM_STR);
    $query->execute();
    $arrayDeResultado = $query->fetchAll(PDO::FETCH_ASSOC);

    // E bingo!! Aqui nosso resultado
    echo "<pre>";
    var_dump($arrayDeResultado);
    echo "</pre>";

} catch (PDOException $erro) {
    echo "Ops!? algo errado! Por causa disso: " . $erro->getMessage();
}

 

 

Lógico, isso aqui foi um básico do básico do jeito mais simples, simplificando.... :smile:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aleluias.... Gabriel e Omar.... Muuuuiiiito obrigada mesmo. Deu certo aqui. Qual das soluções? Todas elas... Fiz vários testes aqui para aprender.Tenho muita dificuldades. Embora todos dizem que POO é mais facil e facilita, acredito, mas mudar do procedural está realmente complicado. O bom que eu estou aprendendo. As ultimas explicações de vocês deixou tudo mais claro. É assim que iniciante como eu entende, porque as vezes algo que é comum pra que já está na area há mais tempo, pode ser um bicho de 7 cabeças pra gente.Valeu mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por landerbadi
      Olá pessoal, boa tarde
       
      Tenho uma tabela chamada "produtos" com os seguintes campos (id, produto) e outra tabela chamada "itens" com os seguintes campos (id, prod_01, prod_02, prod_03, prod_04).
       
      Na tabela produtos eu tenho cadastrado os seguintes produtos: laranja, maçã, uva, goiaba, arroz, feijão, macarrão, etc.
       
      Na tabela itens eu tenho cadastrado os itens da seguinte maneira:
       
      1, laranja, uva, arroz, feijão;
      2, maçã, macarrão, goiaba, uva;
      3, arroz, feijão, maçã, azeite
       
      Meu problema é o seguinte: 
      Eu escolho um produto da tabela "produtos", por exemplo "uva".  Preciso fazer uma consulta na tabela "itens" para ser listado todos os registros que contenham o produto "uva" e que todos os demais produtos estejam cadastrados na tabela "produtos".
       
      No exemplo acima seria listado apenas dois registros, pois o terceiro registro não contém o produto "uva". 
       
      Alguém pode me ajudar? Pois estou quebrando a cabeça a vários dias e não consigo achar uma solução.
    • Por landerbadi
      Boa tarde pessoal. Estou tentado fazer uma consulta no banco de dados porém estou tendo dificuldades. Tenho uma tabela chamada "itens" com os seguintes campos: id, item, plural, ativo. Nela tem cadastrado vários itens e seu respectivo plural. No campo ativo eu coloco a letra "S" para informar que esta palavra está ativa no sistema. Por exemplo: 1, casa, casas, S 2, mesa, mesas, S 3, cama, camas, S 4, moto, motos, S 5, rádio, rádios O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "variações" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, camas, moto 2, mesas, casas, radio 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela variações da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "casa". Preciso fazer com que o php me liste todos os registros da tabela "variações" que contenham a palavra "casa". Porém se tiver algum registro com a palavra "casas" também tem que ser listado. Neste caso ele irá encontrar dois registros. Agora eu preciso que o php verifique os demais itens e faça a listagem apenas dos item que estão ativos (que contenham um "S" no campo ativo. Neste caso ele irá encontrar apenas um registro, pois o segundo registro contém a palavra "rádio". E "rádio" não está ativo na tabela itens. Como faço isso?
    • Por ILR master
      Fala pessoal.
       
      Seguinte:
       
      Quero selecionar duas tabelas e mostrar com resultados intercalados. Abaixo segue um código explicando para vcs terem uma ideia.
       
      $consulta = "SELECT A.*, B.* FROM tabela1 A, tabela2 B'";
      $resultado = mysqli_query($conexao, $consulta) or die ("erro");
      while($busca = mysqli_fetch_array($resultado)){
       
      print $busca['cod_evento']; --> traz o código da tabela1 
      print $busca['titulo_evento']; -->  traz o titulo da tabela1
      print $busca['cod_noticia']; --> traz o código da tabela2
      print $busca['titulo_noticia']; --> traz o tituloda tabela2
       
      }
       
      Espero que entendam. Grato
       
    • Por gersonab
      Bom dia
      estou com uma dúvida de como proceder, tenho uma tabela de categoria e uma de subcategoria, a categoria pode ter várias subs, até ai tranquilo, quando faço update de uma sub altero normalmente a quantidade deste, até aí normal, porém me deparei com uma situação um pouco diferente, vou tentar ser o mais claro possível, de certa forma algumas subs são comuns só mudando o nome praticamente, aí eu preciso que ao efetuar o update em umas destas este ocorra nas demais, tipo:
       
      Se o id da sub for 5 , eu preciso fazer o mesmo update nos ids 6 e 7 ;
       
      Se o id da sub for 9 , eu preciso fazer o mesmo update no id 10
       
      se for 2 , fazer o update somente neste
       
      ainda não estou conseguindo ver uma lógica para isso, e ou uma nova coluna para cadastrar em comum nestes casos.
       
      qual seria a melhor opção
    • Por JoaoSilva75
      oi pessoal
       
      se eu entrar no link dos desenvolvedores php pesquisasar quem é programador e enviar uma mesma mensagem para uns 6 ou 8 membros do forum serei advertido   ou é spam ???????
       
      procuro um programador php para me fazer algo 
       
      mas não tem como postar aqui nessa sessão
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.