Jump to content
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.

Share this post


Link to post
Share on other 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 é.

  • Obrigado! 1

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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:

 

  • Confuso 1

Share this post


Link to post
Share on other 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á...

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Edited by Gabriel Heming
remover o quote

Share this post


Link to post
Share on other 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ó.

Share this post


Link to post
Share on other 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:

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By DuduBacteria
      Tenho uma Tabela chamada "VENDAS" com os seguintes atributos:
       
       
      Eu quero retornar em MySQL o total de vendas ocorridos durante 1 semana, entre o dia atual até seis dias atrás.
       
      Ficando mais ou menos assim:
       
      SEMANA              TOTAL DE VENDIDO segunda                250.00 domingo                430.00 sábado                 160.50 sexta                  300.03 quinta                 300.03 quarta                 300.03 terça                  300.03
    • By biza
      Viva pessoal, 
      Estou com um problema na execução de um filtro aos dados vindos da base de dados, sera que alguém me pode ajudar, os dados estão vindo para a pagina através do método $_POST,
      que são seleccionados através do carregamento de uma dropbox chamada 'select-segment', desta forma se o utilizador apertar o botão 'action' ele executa o filtro caso não aperte ele executa a seleção sem filtros, será que alguém me pode ajudar...
      O erro devolvido é o seguinte:
      Fatal error::  Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /Applications/MAMP/htdocs/cargeWebsite/carList.php:46
      Stack trace:
      #0 /Applications/MAMP/htdocs/cargeWebsite/carList.php(46): PDOStatement->execute()
      #1 /Applications/MAMP/htdocs/cargeWebsite/index.php(155): include('/Applications/M...')
      #2 {main}
        thrown in 
      $query .='SELECT * FROM tbl_vehicle AS v INNER JOIN tbl_brands AS b ON v.brand_id = b.id_brand INNER JOIN tbl_images AS i ON v.id_vehicle = i.vehicle_id INNER JOIN tbl_fuel AS f ON v.fuel_id = f.id_fuel WHERE v.active = :active'; if(isset($_POST['action'])){ if(isset($_POST['select-segment']) && $_POST['select-segment']!=''){ $segment_filter = $_POST['select-segment']; $query.= 'AND segment_id IN ("'.$segment_filter.'")'; } $query .='ORDER BY v.last_inser ASC'; }else{ $query .='ORDER BY v.last_inser ASC'; } if($_POST['lenght'] = -1){ $query_1 = 'LIMIT :inicio, :limite'; } $dbh = createPDO(); $statement = $dbh->prepare($query); $statement->bindValue(':active',$intermedio); $statement->execute(); $number_filter_row = $statement->rowCount(); $statement = $dbh->prepare($query . $query_1); $statement->bindValue(':inicio',(int)$init, PDO::PARAM_INT); $statement->bindValue(':limite',(int)$limite, PDO::PARAM_INT); $statement->execute(); foreach ($result as $row){ }  
    • By Kefatif
      Prezados, boa tarde.
       
      Estou com uma dúvida:
       
      Estou precisando trazer dados do banco para uma tela de edição de cadastro, até aí tudo bem consegui fazer para os input através do código abaixo:
       
      <label style="width:16%;margin-left: 2%;">Data de Início<br> <input type="date" value="<?php echo $row["DATA_DISPENSACAO"] ?>" class="form-control" style="width:100%;"> </label>  
      Mas o meu select já traz o controle de peso do banco, eu gostaria que além dele trazer esses pesos que traga o salvo no cadastro de uma pessoa para visualização e edição.
       
      Segue abaixo o código do select como está:
       
      <label style="width:15%">Peso<b style="color:red">*</b><br> <select name="peso" class="form-control" required style="width:100%" value="<?php echo $row["DATA_TESTE"] ?>"> <option value="">Selecione</option> <?php $sqlpeso = "select distinct PESO from TESTE where ID_ESQUEMA = ".$row["ID_ESQUEMA"]; $resultpeso = mysqli_query($con, $sqlpeso); while ($rowpeso= mysqli_fetch_array($resultpeso)){ ?> <option value="<?php echo utf8_encode($rowpeso["PESO"]);?>" ><?php echo utf8_encode($rowpeso["PESO"]); ?></option> <?php } ?> </select> </label>  
      Meu banco é MYSQL.
       
      Agradeço desde já a todos pela ajuda.
       
      Abraço!
    • By adriano.eurich
      Estou com duvida de como é montada uma query de um formulário com muitos campos em php!
      Ex. Tenho um formulário com titulo dados do cliente, nele tem vários campos para ser preenchidos, depois tem outro titulo que é dados do anuncio, que também tem vários campos a ser preenchido e mais alguns!
      Todos esses campos estão dentro de um único formulário que gostaria de enviar ao banco! Porem percebi que a query fica enorme e confusa de montar até mesmo para achar um erro!
      Acho que essa não é a melhor forma de fazer! 
      Gostaria de alguma dica ou esclarecimento de como fazer da melhor forma!
       
      Att
      Adriano
       
    • By Kefatif
      Prezados, boa tarde.
       
      Gostaria de ajuda para caso o valor no banco mysql, campo "fase" seja igual a "2" retorne uma mensagem, caso contrário siga o código
       
      Fico agradecido desde já.
       
      Abs.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.