array uit object halen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Fabian webstars

Fabian webstars

02/11/2015 18:02:44
Quote Anchor link
Hallo allemaal,

ben pas geleden begonnen met object-oriented programming en loop vast.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
public function categories()
{

    $sql1 ="
    SELECT c.id, c.name, c.description, c.position,
    (SELECT count(t.id)
    FROM topics as t
    WHERE t.parent=c.id and t.id2=0) as topics,
    (SELECT count(t2.id)
    FROM topics as t2
    WHERE t2.parent=c.id and t2.id2!=0) as replies
    FROM categories as c
    GROUP BY c.id
    ORDER BY c.position ASC
    "
;
    $result1 = mysqli_query($this->reg, $sql1);
    $numrows1 = mysqli_num_rows($result1);

/*while ($row=....)
{
echo $row['cat'];
}
*/



}
?>

dit zit in mn object, maar ik moet die while in mn html hebben en niet in mn object dus:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$forum
= new forum;
$categories = $forum->categories();

foreach ($categories as $category) {
    echo '<span>' . $category['name'] . '</span>';
}

?>

dit werkt niet
mn class werkt gewoon en als ik de while loop in mn object werkt het ook gewoon, kan iemand me verder helpen?
groetjes
Gewijzigd op 02/11/2015 18:03:14 door Fabian webstars
 
PHP hulp

PHP hulp

14/03/2025 03:56:22
 
Thomas van den Heuvel

Thomas van den Heuvel

02/11/2015 20:05:18
Quote Anchor link
Wat is $this->reg?

En wat is er object georienteerd aan mysqli_query(), for that matter :/. Dat is de procedurele variant.

Verder weet ik niet precies wat je verwacht dat categories() teruggeeft?
Een MySQLi resultset (wat een object is)?
Een array?
Op dit moment retourneer je niets.

Ook hoef je geen aparte variabele hiervoor aan te maken, je zou ook zoiets kunnen doen (als je categories() hebt gerepareerd):

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
foreach ($forum->categories() as $category) {
    ...
}

?>

Daarnaast is een naamgeving als getCategories() wellicht ook handig, enkel "categories()" is een beetje onbestemd.
 
Fabian webstars

Fabian webstars

03/11/2015 16:16:04
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
foreach ($forum->getCategories() as $category) {
    echo '<span>' . $category['categorie'] . '</span>';
}

?>

ik heb het veranderd maar hoe moet mn object er uit zien?
 
- Ariën  -
Beheerder

- Ariën -

03/11/2015 16:21:30
Quote Anchor link
Je object is $forum->getCategories().
Je method, is de functie die in je class staat. Deze moet dan iets bevatten zoals dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
while($data = mysqli_fetch_array($result)){
        $r_news[] = $data;
    }

Deze bouwt dan een array op van je categorieën, en utieraard moet je die array ook netjes returnen.
Gewijzigd op 03/11/2015 16:22:03 door - Ariën -
 
Ivo P

Ivo P

03/11/2015 20:56:42
Quote Anchor link
ben ik de enige die de query raar vindt?

Een gewone Join lijkt me meer voor de hand liggen.

In dit geval leveren de 2 subquery's gewoon een getal op en is er geen sprake van een aggregatie functie (zoals count) in de hoofdquery.
Daarmee hoort er dus geen group-by in die query thuis.
 
Pg Vincent

Pg Vincent

03/11/2015 21:03:52
Quote Anchor link
Ivo P op 03/11/2015 20:56:42:
ben ik de enige die de query raar vindt?


Het is een beetje een oddball query, maar opzich is alleen de GROUP BY in de hoofdquery fout, de counts konden wel eens efficienter zijn dan een volledige join op alles, dat zou je moeten benchmarken.

Maar, categorieen veranderen niet zo vaak en het tellen is sowieso een traag proces dus het is sowieso beter om de tellingen gewooon bij de categorie op te slaan en die bij elke verandering in de categorie bij te werken.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.