PHP Meerdere fout meldingen

Status
Niet open voor verdere reacties.

tim687

Terugkerende gebruiker
Lid geworden
25 apr 2010
Berichten
1.774
Beste leden,

Ik ben bezig met het ontwikkelen van mijn website.

Deze werkt met een custom cms.

Ik krijg alleen meerdere fout meldingen:

Call to a member function fetch_replies() on a non-object
Cannot use object of type Comment as array.

Dit is de code die boven aan de echte webpagina staat:


PHP:
<?php

                include_once('includes/connection.php');

                include_once('includes/blogpost.php');

                include_once('includes/comment.php');
				
				include_once('includes/reply.php');

                $blogpost = new Blogpost;
                $comment = new Comment;
				$reply = new Reply;
				
                if(isset($_GET['id'])){
                    // display the blogpost
                

                    $id = $_GET['id'];
                    $data = $blogpost->fetch_data($id);
                    
                    $comments = $comment->fetch_comment($id);

                }else{
                    header('Location: index.php');
                    exit();
                }
                

                ?>
Connection.php en Blogpost.php werken!



comment.php:

<?php

class Comment{
    
    public function fetch_comment($blog_post_id){
        global $pdo;
        
        $query = $pdo->prepare("SELECT * FROM blog_post_comments WHERE blog_post_id =?");
        $query->bindValue(1, $blog_post_id);
        $query->execute();
        
        return $query->fetchAll();
        
    }
       
}

?>

reply.php:

<?php

class Reply{
	
	
	
	 public function fetch_replies($blog_post_id,$comment_id){
        
        global $pdo;
        
        $query = $pdo->prepare("SELECT * FROM blog_post_comments WHERE blog_post_id=? AND blog_post_reply_comment_id =?");
        $query->bindValue(1, $blog_post_id);
        $query->bindValue(2, $comment_id);
        $query->execute();
        return $query->fetch();
    }
	
}

?>

Vervolgens doet hij een foreach op de comments en komt er als object $comment uit. De comments worden netjes geladen, de reacties alleen niet.

Dit is midden in het html bestand zelf

PHP:
<?php
echo $data['blog_post_id'];
echo $comment['blog_post_reply_comment_id']; // Beide echo's geven de goede waarde!
											$comment_id = $comment['blog_post_reply_comment_id'];
											$replies = $reply->fetch_replies($data['blog_post_id'],int $comment_id); //Call to a member function fetch_replies() on a non-object in pagina.php on deze lijn
											foreach($replies as $reply){
																			 ?>
Vervolgens gaat hij niet verder met het laden van de pagina, en krijg ik op mijn WAMP server de fout (zie de code hierboven) te zien (in het PHP error log bestand)

Wie weet wat ik fout doe?

ps: het foreach statement wordt met de } weer gesloten later in de code, deze heb ik alleen weggelaten :p

Bedankt,

Tim
 
Laatst bewerkt:
De melding is toch redelijk duidelijk, je hebt een variabele $comment die een object Comment bevat. Echter roep je daarna $comment['blog_post_reply_id'] aan wat suggereert dat $comment een array zou bevatten.
 
Moet ik voor de comment die uit het foreach statement komt een andere naam geven? Ik zal dat eens proberen vanmiddag
 
Het is waarschijnlijk handiger om het hele bestand waarin je de boel opvraagt te plaatsen aangezien je variabelen op meerdere plekken hetzelfde hebt genoemd. Hierdoor is het lastig te begrijpen wat er nu precies in staat en op wat voor manier het allemaal aangeroepen wordt.
 
Het gehele bestand kan ik helaas niet plaatsen, het is een website die ik heb gekocht.

Wat ik wel kan doen is de stukjes van de code in elkaar plakken:

PHP:
<?php

include_once('includes/connection.php');

                include_once('includes/blogpost.php');

                include_once('includes/comment.php');
				
				include_once('includes/reply.php');

                $blogpost = new Blogpost;
                $comment = new Comment;
				$reply = new Reply;
				
                if(isset($_GET['id'])){
                    // display the blogpost
                
                    $id = $_GET['id'];
                    $data = $blogpost->fetch_data($id);
                    
                    $comments = $comment->fetch_comment($id);

                }else{
                    header('Location: index.php');
                    exit();
                }

echo $data['blog_post_title'];
echo $data['blog_post_lead'];
echo $data['blog_post_content'];
echo $data['blog_post_author'];

foreach($comments as $single_comment){


echo $single_comment['blog_post_name'];
echo date('g', $single_comment['blog_post_comment_timestamp']) . ":" . date('i', $single_comment['blog_post_comment_timestamp']) . " " . date('d F',$single_comment['blog_post_comment_timestamp']) . ", " . date('Y', $single_comment['blog_post_comment_timestamp']);
echo $single_comment['blog_post_comment'];

echo $data['blog_post_id'];
echo $single_comment['blog_post_reply_comment_id'];
$comment_id = $single_comment['blog_post_reply_comment_id'];
$replies = $single_comment->fetch_replies($data['blog_post_id'],$single_comment['blog_post_reply_comment_id']); 
echo $replies;

			foreach($replies as $reply){

				echo $reply['blog_post_name'];

			}


}

Vergeleken met de vorige versie van de code (in de vraag) heb ik $comment in het foreach statement hernoemd naar $single_comment.

Nu krijg ik de fout dat hij geen member functie op een niet bestaand object ($single_comment) kan uitvoeren.

Hoe moet ik zeggen dat de $single_comment een Comment class is?

Als ik dat goed heb, is het denk ik opgelost.
 
Deze regel:
PHP:
$comment->fetch_comment($id)
Levert een multidimensionale array op, geen array van Comment objecten.

Als je dus dat resultaat voor de foreach gaat gebruiken dan bevat $single_comment een key-value array en geen object van het type Comment.

Wat je dus eigenlijk wilt is deze regels:
PHP:
$replies = $single_comment->fetch_replies($data['blog_post_id'],$single_comment['blog_post_reply_comment_id']);
vervangen door
PHP:
$replies = $comment->fetch_replies($data['blog_post_id'], $single_comment['blog_post_reply_comment_id']);

Nu is het probleem waarschijnlijk wel opgelost maar dit is geen nette manier van programmeren. Je wilt OOP werken dus in dit geval kun je beter het MVC (Model View Controller) design pattern gebruiken waarbij je de informatie in een Model opslaat.

Kijk anders eens of je iets van ORM (Object-Relational Mapping) kunt gebruiken zoals Doctrine of Eloquent.
 
Hmm,

Nu krijg ik de melding call to undefiened method Comment::fetch_replies().

Met een Model bedoelt u dan dat ik de info in een class op sla, die de code er dan vervolgens uithaalt?

EDIT: Is dit iets? Propel
 
Laatst bewerkt:
Oh sorry, verkeerde variabele gebruikt. Je moet $reply hebben (Je ziet dat het al verwarrend werkt :eek:)

Dat klopt, een ORM houdt MVC aan waarbij de data altijd via een Model beschikbaar wordt. Als je dan iets opvraagt uit de database krijg je niet een array terug maar een gevuld object.

Zelf maak ik veel gebruik van Doctrine aangezien die binnen het Symfony-framework geïntegreerd is.
 
Dus in plaats van

PHP:
$replies = $comment->fetch_replies($data['blog_post_id'], $single_comment['blog_post_reply_comment_id']);

PHP:
$replies = $reply->fetch_replies($data['blog_post_id'], $single_comment['blog_post_reply_comment_id']);


Heeft u ook ervaring met Propel? Of is die andere beter?
 
Ja, die aanpassing zou moeten werken omdat $reply een object Reply bevat en die heeft een methode "find_replies" (Daar zit de verwarring dus, want eigenlijk wil je van een comment de replies hebben vandaar dat ik hem in $comment verwachtte ;))

Met Propel heb ik geen ervaring, de werking komt aardig overeen met Doctrine dus als de documentatie goed opgezet is kun je hem prima implementeren lijkt mij.
 
Er komen gegevens uit, maar niet de goede, het is ook geen array van gegevens die erin zitten.

Ik zal propel implementeren en kijken of hij het dan wel doet.

Bedankt voor de hulp!
Tim
 
Ja, die aanpassing zou moeten werken omdat $reply een object Reply bevat en die heeft een methode "find_replies" (Daar zit de verwarring dus, want eigenlijk wil je van een comment de replies hebben vandaar dat ik hem in $comment verwachtte ;))

Met Propel heb ik geen ervaring, de werking komt aardig overeen met Doctrine dus als de documentatie goed opgezet is kun je hem prima implementeren lijkt mij.

Ik ben bezig met het installeren van Propel, ik loop ongelovelijk te k#tten. Niks werkt en alles geeft een error. Ook bij Doctrine is het blijkbaar heel moeilijk om het te installeren op windows.

Heeft u een tutorial voor mij?

Bedankt
 
Hoe ver kom je? Is het gelukt om composer te installeren?
 
Composer was geinstalleerd, maar heb alles weer verwijderd. Het kostte te veel tijd, en ik denkbdat de tijdswinst niet genoeg was. Er zat een fout in mijn code, ik zal morgenbde code plaatsen. De mobiele versie heeft geen code ondersteuning, dus ik zie geen codes
 
Het kost nu "veel" tijd ja maar met een ORM heb je een betere basis voor je relaties dan wanneer je dit zelf gaat zitten schrijven :)
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan