Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

t0ze

[Resolvido] "Chamar" objecto PDO dentro de uma classe.

Recommended Posts

t0ze

Boa noite,

Estou com um problema que acho ser de organização de pastas do meu projecto, o que faz com que não consiga aceder ao objecto $db que é um PDO, dentro da minha classe "Animais".

Na pratica, tenho na raiz do projecto algo assim

/includes

/constants

/classes

/functions

/js

/stye

/index.php

A criação do objecto $db está a ser feita em /includes/connection.php da seguinte forma:

<?php
require("constants.php"); //contem os valores de DB_ ...
try {
$db = new PDO('mysql:host='.DB_SERVER.';dbname='.DB_NAME.'', DB_USER, DB_PASS);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = ('SET NAMES "utf8"; SET CHARACTER SET utf8; SET COLLATION_CONNECTION = "utf8_general_ci"');
$db->exec($query);
} catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}
?>

E no meu ficheiro index.php onde incluo o ficheiro /includes/connection.php incluo também o ficheiro /classes/animal.php assim:

<?php require_once("includes/session.php"); ?>
<?php require_once("includes/connection.php"); ?>
<?php require_once("includes/functions.php");?>
<?php include("includes/html.php"); ?>
<?php include("includes/header.php"); ?>
<?php
confirm_logged_in();
@validate_parameter();
?>
<?php include("includes/menu.php"); ?>
<?php include("classes/pagination.php"); ?>
<?php include("classes/animal.php"); ?>
</div>
<?php
$horse = new animal($id=276);
?>

E na minha /classes/animal.php o seguinte:

<?php
Class animal {

 public $animal;
 public function __construct($id = NULL, $n = NULL){
if ($id != NULL || $n != NULL) {
  $query = $db->Prepare("SELECT animal.*
						FROM animal
						WHERE id = :id OR n = :n
						LIMIT 1");
  $query->bindValue(':id', $id );
  $query->bindValue(':n', $n);

  try {
	$query->execute();
  }catch (PDOException $e) {

  }
  if ($query->rowCount() == 1) {
	   $animal = $query->fetch(PDO::FETCH_ASSOC);
	  $this->animal= $animal;
  }
  }
 }
....
...
..

E isto tudo dá-me um erro no inde.php

Notice: Undefined variable: db in C:\inetpub\wwwroot\effective\classes\animal.php on line 10
Fatal error: Call to a member function Prepare() on a non-object in C:\inetpub\wwwroot\effective\classes\animal.php on line 10

Já tentei colocar o /includes/connection.php no ficheiro /classes/animal.php mas continua com erros... alguma ideia/sugestão de organizar isto ?

Obg

Edited by t0ze

Share this post


Link to post
Share on other sites
scorch

Coloca isto: :)

public function __construct($id = NULL, $n = NULL){
    //É necessário indicar a variável como global na função
    global $db;


       if ($id != NULL || $n != NULL) {
         $query = $db->Prepare("SELECT animal.*
                                                       FROM animal
                                                       WHERE id = :id OR n = :n
                                                       LIMIT 1");
         $query->bindValue(':id', $id );
         $query->bindValue(':n', $n);

         try {
               $query->execute();
         }catch (PDOException $e) {

         }
         if ($query->rowCount() == 1) {
                  $animal = $query->fetch(PDO::FETCH_ASSOC);
                 $this->animal= $animal;
         }
  }

  • Vote 1

scorch_pp.png

PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Share this post


Link to post
Share on other sites
t0ze

Pronto, resolvido, já estou desbloqueado de novo :)

Já tinha experimentado chamar em global, mas fora da classe no ficheiro /classes/animal.php ...

Obrigado pela ajuda scorch !

Share this post


Link to post
Share on other sites
mjamado

Cada vez que alguém usa uma variável global, um GNR dá um pontapé num porco. Sê amigo dos recos, não uses variáveis globais.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
pikax

nao uses variaveis globais, mais vale implementar um singleton


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

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

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.