Jump to content

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


Recommended Posts

Posted (edited)

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
Posted

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

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

Posted

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 !

Posted

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.

Posted

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."

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
×
×
  • Create New...

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.