Jump to content

[Resolvido] Call to a member function getIdAluno() on a non-object


Peaceandlove
 Share

Recommended Posts

Peaceandlove

Hey,

preciso de ajuda sobre um bocado de código.

Tenho uma colecção da classe Notas e vou buscar à BD a informação através deste código:

$this->notas = new Collection();
   $this->carregaArray();
public function carregaArray(){
$link = mysql_connect('localhost:3307', 'root', 'usbw');
$l = mysql_select_db('estagio', $link);
$sql = "Select * From notas";
$result = mysql_query($sql,$link);
while($row = mysql_fetch_assoc($result)){
   $this->notas->addItem($row);
   }
    }

Estou a tentar usar o $this->notas neste método:

public function procurarNota($idAluno,$idElemento){
    if(!($this->notas->isEmpty())){
	    foreach($this->notas->getAll() as $nota){
	    for ($i = 0; $i <= $this->notas->getLength(); $i++){
		    if($this->notas->getItem($i)->getIdAluno() && $this->notas->getItem($i)->getIdComp() == $idElemento){
			    return $nota;
			    }
		    }
	    }
    }
    return 0;
} 

Mas da-me este erro:

Call to a member function getIdAluno() on a non-object in D:\8.5\root\classes\UC.php on line 709

A funçao getItem é definida por:

private $items = array();
public function getItem($key) {
    if (isset($this->items[$key])) {
	    return $this->items[$key];
    } else {
	    throw new Exception("No match found for $key.");
    }
   }

O que estou a fazer de errado ?

Obrigado !

Link to comment
Share on other sites

HappyHippyHippo

como ninguém além de ti sabe como é a estrutura dessas classes todas, a única coisa que se pode dizer é:

if($this->notas->getItem($i)-> // <-- isto retorna algo que não é um objecto
                             getIdAluno()
  && $this->notas->getItem($i)->getIdComp() == $idElemento){
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

HappyHippyHippo

Então tenho de retornar na funcao do getItem um objecto ?

não serei eu que saberei o que pretendes fazer ...

a única coisa que fiz foi olhar para a mensagem de erro e verificar no código a sua razão.

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Peaceandlove

Basicamente ...

o que eu pretendo é carregar um array com dados da base de dados, percorrer esse mesmo array e comparar com um dos dados do array !

Foi a única maneira que encontrei de resolver esse problema !

Link to comment
Share on other sites

HappyHippyHippo

como ninguém além de ti sabe como é a estrutura dessas classes todas

tens de pensar no teu problema porque só tu saberás responder:

- o que estás a gravar na classe Collection ? (classe que para mim soa a algo completamente desnecessário)

- o que estás a retornar ?

- a função getItem está a ser chamada com um parâmetro correcto ?

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Peaceandlove

tens de pensar no teu problema porque só tu saberás responder:

- o que estás a gravar na classe Collection ? (classe que para mim soa a algo completamente desnecessário)

A minha classe Collection é isto:

class Collection
{
   private $items = array();
private $nota;

   function __construct() {
    $this->nota = new Notas();
   }
   //adiciona um elemento
   public function addItem($obj, $key = null) {
    if ($key == null) {
	    $this->items[] = $obj;
    }
    else {
		    $this->items[$key] = $obj;
    }
   }
   /**
 *
 * @param type $key
 * Remove o item com a posição enviada
 */
   public function deleteItem($key) {
    if ($this->getItem($key)) {
		    unset($this->items[$key]);
    }
   }
   /**
 *
 * @param type $id
 * Remove item com o ID enviado
 */
   public function deleteID($id) {
    for ($i = 0; $i < count($this->items); $i++) {
	    if($this->getItem($i)->getId() === $id) {
		    unset($this->items[$i]);
	    }
    }
   }
   /**
 *
 * @param type $key
 * @return type
 * @throws KeyInvalidException
 * Devolve o item que corresponde ao indice enviado
 */
   public function getItem($key) {
    if (isset($this->items[$key])) {
	    return (Notas)$this->items[$key];
    } else {
	    throw new Exception("No match found for $key.");
    }
   }
   /**
 *
 * @return type
 * Devolve o ultimo item da coleção
 */
   public function getLast() {
    return end($this->items);
   }
   /**
 *
 * @param type $key
 * @param type $value
 * Subsitui o item na posicao $key pelo enviado no $value
 */
   public function replace($key,$value) {
    if(isset($this->items[$key])) {
	    $this->items[$key] = $value;
    }
   }
   /**
 *
 * @param type $key
 * @return boolean
 * verifica se o item com indice enviado existe
 */
   public function exists($key) {
    if (array_key_exists($key, $this->items)) {
	    return true;
    } else {
	    return false;
    }
   }
   /**
 * Reconstroi a coleção
 */
   public function rebuild() {
    $this->items = array_values($this->items);
   }
   /**
 *
 * @return type
 * Devolve o tamanho total da colecao
 */
   public function getLength() {
    return count($this->items);
   }
   /**
 *
 * @return type
 * Verifica se a coleção esta vazia
 */
   public function isEmpty(){
    return empty($this->items);
   }
   /**
 *
 * @return type
 * Devolve todos os itens da coleção
 */
   public function getAll() {
    return $this->items;
   }
public function imprimeArray(){
print_r($this->items);
}}

- o que estás a retornar ?

Eu quero retornar as notas de um aluno com o id que é passado por parâmetro no método procurarNota

- a função getItem está a ser chamada com um parâmetro correcto ?

Certo ! Para verificar onde exite o id de aluno !

Edited by Peaceandlove
Link to comment
Share on other sites

Peaceandlove

A minha classe Colection esta a gravar notas que o utilizador insere para um determinado aluno. É uma collection da classe Notas e tenho outro para os diferentes componentes.

A segunda resposta é como te disse... Quero o id do aluno. Pensei como o java, percorrendo o Array todo e verificar quando o array enviado por um parametro coincide com o array guardado na BD...

Link to comment
Share on other sites

HappyHippyHippo

isso não é uma resposta de programador, mas sim de analista de sustemas

responde novamente, mas agora olha para o código e diz exactamente o que está a ser inserido na "Collection"

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Peaceandlove

Estou a enviar uma nota:

public function adicionarNota($nota) {
      $temp= $this->procurarNota($nota->getIdAluno(),$nota->getIdComp());
       if(!is_a($temp,"Notas")){
           $this->notas->addItem($nota);
       }else{
           $temp->setNota($nota->getNota());
           $temp->setFinal($nota->getFinal());
       }
   }

Sendo as notas o Array e a nota o que recebe por parâmetro.

Que insere no array isto:

Array ( [0] => Array ( [idAluno] => 110221045 [idElemento] => ELEMENTO_55DDD43F44AA52.91714971 [nota] => 12 [final] => 1 )
Link to comment
Share on other sites

HappyHippyHippo

eu não perguntei se $this-items é um objecto !!!

eu perguntei se

Array ( [0] => Array ( [idAluno] => 110221045 [idElemento] => ELEMENTO_55DDD43F44AA52.91714971 [nota] => 12 [final] => 1 )

é um objecto

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Peaceandlove

Sim, porque eu quando adiciono um item na colecção uso este método:

//adiciona um elemento
   public function addItem($obj, $key = null) {
    if ($key == null) {
	    $this->items[] = $obj;
    }
    else {
		    $this->items[$key] = $obj;
    }
   }
Link to comment
Share on other sites

HappyHippyHippo

vamos lá ver ...

o que estás a gravar nem são objectos nem são strings (parâmetro da chamada da função addItem).

se nem sabes o que estás a gravar na instância da classe Collection, como podes auferir que o resultado da chamada da função getItem é um object

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Eu acho que estás a confundir arrays com objectos. O que está a ser gravado no código que mostraste é um array e não um objecto.

Um objecto costuma ter no output a palavra object ou então stdClass, dependendo das situações. Por exemplo:

class notas 
{
   public $id;
   public $nome;
}

$objects = array();

for($i = 0; $i <= 5; $i++)
{
  $nota         = new notas();
  $nota->id     = $i;
  $nota->nome   = 'João - ' . $i;

  $objects[]    = $nota;
}

print_r($objects);

/*
Array
(
   [0] => Notas Object
       (
           [id]     => 1
           [nome]   => 'João - 1';
       )

   [1] => Notas Object
       (
           [id]     => 2
           [nome]   => 'João - 2';
       )
)*/

Se tens um array normal e desejas converte-lo num objecto - neste caso numa stdClass - podes fazê-lo facilmente.

$notas = array();

for($i = 0; $i <= 5; $i++)
   $notas[] = (object)array('id' => $i, 'nome' => 'João - ' . $i);

print_r($notas);

/*
Array
(
   [0] => stdClass Object
       (
           [id] => 0
           [nome] => João - 0
       )

   [1] => stdClass Object
       (
           [id] => 1
           [nome] => João - 1
       )
)
*/

Em ambos os códigos, independentemente do número de índices que possa conter o array, haverá sempre o índice zero, portanto para devolveres o valor utilizas

$notas[0]->id;
$objects[0]->id;

O array sobre o que estás a trabalhar parece-me claramente ser o tradicional pelo que o acesso aos valores é diferente.

$teuArray[indice]['nome_campo']
Edited by bioshock
Link to comment
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
 Share

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