Selecteer bijbehorende images en echo ze op category title

Status
Niet open voor verdere reacties.

killer4all2

Gebruiker
Lid geworden
26 mei 2009
Berichten
449
Goedendag,

Voordat ik begin excuseer ik mij alvast, aangezien ik het zeer moeilijk uit te leggen vind wat ik wil alhoewel het idee vrij simpel is. :)

Op het moment heb ik twee tables met de volgende structuren:

Tabel 'Category':

ID | CATEGORYNAME

Voorbeeld inhoud:

5 | TIMMERWERK |

Tabel 'Gallery':

ID | NAME | IMAGENAME | CATEGORY

Voorbeeld inhoud:

1 | MIJNHAMER | HAMER.JPG | 5

_________________________________

Wat ik wil:
Zoals je boven hier als voorbeeld inhoud ziet, heeft de tabel Category 1 category met het id 5 en als naam timmerwerk. In de tabel gallery zit 1 image die als category "5" heeft. Het plaatje met de naam MIJNHAMER matched dus met de category TIMMERWERK aangezien zij als category id dezelfde nummers hebben, namelijk nummer 5.

Wat ik wil is dat deze worden ge echo'd op Category title op de volgende manier:

_________________________________

HTML:
<div class="block">
<h2>$CATEGORYNAAM 1</h2>

<hier een lijst van alle plaatjes behorend tot deze category naam 1>
<img src='#' alt='imagename' />
</div>

<div class="block">
<h2>$CATEGORYNAAM 2</h2>

<hier een lijst van alle plaatjes behorend tot deze category naam 2>
<img src='#' alt='imagename' />
</div>

ETC.

__________________________________

Tot slot:

Nu gaat het programmeren mij al aardig goed af alleen lukt het mij even niet om deze logica te verzinnen en hoop ik dat iemand mij hiermee kan helpen :) Na lang denken heb ik een beetje hoofdpijn gekregen. Als het zou kunnen een nieuwe query te openen in een fetch zou dit makkelijk kunnnen, maar dit kan helaas niet.

Ik hoop dat iemand weet wat ik als query zou kunnen gebruiken of hoe ik de database structuur kan verbeteren :)

Ik gebruik de volgende notatie voor het maken van mijn query's:

PHP:
function getGallery()
    {
        global $Database;
        
        if($stmt = $Database->prepare("DE QUERY"))
        {
            $stmt->execute();
            $stmt->bind_result($c_id, $c_name);
            
            while($stmt->fetch())
            {
                echo "<h2>$c_id, $c_name</h2>";                
            }
        }
    }

Alvast heel erg bedankt voor de tijd.

Ik hoop dat iemand mij kan helpen :)

Vriendelijke groet,

Rowan
 
Deze query heb je nodig: http://sqlfiddle.com/#!2/3f880/2/0

Het ging voornamelijk over het tonen :D
PHP:
function getGallery()
{
    global $Database;
    $gallery = '';
    $category = '';
    if($stmt = $Database->prepare("SELECT * FROM GALLERY g, CATEGORY c WHERE g.CATEGORY = c.ID ORDER BY c.CATEGORYNAME"))
    {
        $stmt->execute();
        $stmt->bind_result($g_id, $g_name, $g_imagename, $c_id, $c_name);
        while($stmt->fetch())
        {
            if($c_name != $category)
            {
                $gallery .= ($category != '') ? '</div>' : '';
                $category = $c_name;
                $gallery .= '<div class="block"><h2>'. $category .'</h2>';
            }
            $gallery .= '<img src="'. $g_imagename .'" alt="'. $g_name .'" />';
        }
    }
    return $gallery;
}

echo getGallery();

Hoewel ik het niet verstandig vind op HTML in een PHP functie te laten genereren.
Dit moet je in de uiteindelijke pagina doen. Een functie moet enkel data teruggeven.

Mijn voorstel is dan ook:
PHP:
function getGallery()
{
    global $Database;
    if($stmt = $Database->prepare("SELECT * FROM GALLERY g, CATEGORY c WHERE g.CATEGORY = c.ID ORDER BY c.CATEGORYNAME"))
    {
        $stmt->execute();
        $stmt->bind_result($g_id, $g_name, $g_imagename, $c_id, $c_name);
        return $stmt->fetch();
    }
    return 0;
}

$category = '';
$gallery = getGallery();
while($gallery)
{
    if($c_name != $category)
    {
        echo ($category != '') ? '</div>' : '';
        $category = $c_name;
        echo '<div class="block"><h2>'. $category .'</h2>';
    }
    echo '<img src="'. $g_imagename .'" alt="'. $g_name .'" />';
}
echo '</div>';
 
Laatst bewerkt:
EDIT: Ik zie dat je je post veranderd heb ik zou er even na kijken heel erg bedankt ! :)

Goedendag,

Heel erg bedankt voor je reactie. Zeer handige website die je daar gebruikt. Nu word inderdaad alles de echo'd uit de database. Maar daar is waar het probleem komt opdagen. Wat ik wil is dat hij 1 keer de title van alle categorien echo'd en daaronder alle "plaatjes" en informatie die bij die plaatjes horen. Die komen dus onder een <h2> van de categorie titel.

Wat er nu gebeurd is dat er per gevonden resultaat een titel h2 word ge echo'd.

Screenshots van database inhoud en weergaven na de functie word geroepen:

Screenshot naar uitvoeren onderstaande functie
screen 1.jpg

Screenshot gallery table:
screen 2.jpg

Screenshot gallery table
screen 3.jpg

Functie die ik gebruik :

PHP:
function getGallery()
    {
        global $Database;
        
        if($stmt = $Database->prepare("SELECT * FROM category c, gallery g WHERE g.category = c.id"))
        {
            $stmt->execute();
            $stmt->bind_result($c_id, $c_name, $g_id, $g_name, $g_imagename, $g_category);
            
           
            while($stmt->fetch())
            {
                echo "<h2>$c_id, $c_name</h2>";
                                
            }
        }
    }

Ik hoop dat het zo wat duidelijker is tegen welk probleem ik aanloop :)

Alvast heel erg bedankt!
 
Laatst bewerkt:
Ik weet niet wat er precies fout is aan het script, maar mijn home server crashed en moet opnieuw opgestart worden nadat ik je scriptje erin plak :P
 
Vermoedelijk omdat ik de functie in de WHILE had gestopt.
Verbeterde versie zie je hierboven :)
 
EDIT:
Ik weet niet wat er fout is maar mijn pagina wilt niet meer laden als ik die functie erin zet :P De eerste werkt wel, maar waarom de tweede niet werkt weet ik niet. De pagina laadt gewoon niet :(

De eerste versie werkte wel ik ga even de betere versie proberen. Heel erg bedankt ! :D
 
Laatst bewerkt:
Het kan best zijn dat het resultaat anders is dan ik verwacht.

Wat is het resultaat wanneer je dit uitvoert?
PHP:
function getGallery()
{
    global $Database;
    if($stmt = $Database->prepare("SELECT * FROM GALLERY g, CATEGORY c WHERE g.CATEGORY = c.ID ORDER BY c.CATEGORYNAME"))
    {
        $stmt->execute();
        $stmt->bind_result($g_id, $g_name, $g_imagename, $c_id, $c_name);
        return $stmt->fetch();
    }
    return 0;
}

var_dump(getGallery());
 
Sorry ik kijk aan het eind van middag even ik moet even weg :) Alvast bedankt voor je hulp! :D
 
EDIT: Ik vroeg mij ook af wat return 0; doet. Is dat het zelfde als else return 0? :P

De var_dump heeft wel wat duidelijk gemaakt. Bij bind results was je vergeten de category te binden van de gallery table :)

Je bent ook een punt vergeten achter de $g_name :P Kopieer steeds je functie daarzo, moet steeds die punt toevoege :P

De functie returned nu een Boolean: true als ik var_dump. De pagina loopt nog steeds helemaal vast als ik de while loop aanroept. Ik gok dat hij infinite is :P

Functie opgelost:
PHP:
function getGallery()
    {
        global $Database;
        if($stmt = $Database->prepare("SELECT * FROM GALLERY g, CATEGORY c WHERE g.CATEGORY = c.ID ORDER BY c.CATEGORYNAME"))
        {
            $stmt->execute();
            $stmt->bind_result($g_id, $g_name, $g_imagename, $g_category, $c_id, $c_name);
            return $stmt->fetch();
        }
        return 0;
    }

Ik hoop dat je een oplossing weet, Alvast heel erg bedankt ! :D
 
Laatst bewerkt:
Ah ja, ik zie waar het probleem zit.

Bekijk ik de documentatie van mysqli_stmt::fetch() dan zie ik dit:
Code:
bool mysqli_stmt::fetch ( void )
Hij geeft dus een boolean terug in plaats van (wat ik had verwacht) een array of een object met de data uit de database.

De return 0 zorgt er voor dat als het IF-statement op regel 4 niets oplevert er toch wat teruggegeven wordt vanuit de functie.
Deze heb ik nu aangepast naar een lege array.
Je zou een ELSE kunnen gebruiken maar dat is niet nodig, zodra de functie een return tegenkomt wordt alles daar onder niet meer uitgevoerd.

De manier waarop je nu een query uitvoert zal dus omgegooid moeten worden.
Ik verwacht in de variabele $database een instantie is van mysqli
PHP:
function getGallery()
{
    global $Database;
    if($stmt = $Database->prepare("SELECT * FROM GALLERY g, CATEGORY c WHERE g.CATEGORY = c.ID ORDER BY c.CATEGORYNAME"))
    {
        $stmt->execute();
        $stmt->get_result();
        return $stmt->fetch_assoc();
    }
    return array();
}

var_dump(getGallery());
MySQLi gebruik ik niet vaak (in ieder geval niet direct, wellicht via een PHP framework) dus ook hier is het even gokken :)

De typo in mijn vorige code heb ik aangepast ;)
 
Laatst bewerkt:
Bedankt voor je reactie :)

Op het moment krijg ik een error terug :

error:
Code:
Fatal error: Call to undefined method mysqli_stmt::fetch_assoc() in F:\wamp\www\icms-eden\models\m_gallery.php on line 205

Als ik van fetch_assoc() , fetch() maak dan krijg ik weer een boolean terug. (false) fetch_assoc blijkt om redenen niet te kunnen. Is het niet vreemd dat de volgende functie wel werkt:

PHP:
function getGallery()
    {
        global $Database;
        $gallery = '';
        $category = '';
        if($stmt = $Database->prepare("SELECT * FROM GALLERY g, CATEGORY c WHERE g.CATEGORY = c.ID ORDER BY c.CATEGORYNAME"))
        {
            $stmt->execute();
            $stmt->bind_result($g_id, $g_name, $g_imagename, $g_cat, $c_id, $c_name);
            while($stmt->fetch())
            {
                if($c_name != $category)
                {
                    $gallery .= ($category != '') ? '</div>' : '';
                    $category = $c_name;
                    $gallery .= '<div class="block"><h2>'. $category .'</h2>';
                }
                $gallery .= '<img width="100px" height="100px" src="uploads/gallery/'. $g_imagename .'" alt="'. $g_name. '" />';
            }
        }
        return $gallery;
    }

Sorry voor de onduidelijkheid over de inhoud van $Database :)
 
Laatst bewerkt:
Crap, een onzorgvuldigheidje van mijn kant :confused:

Ik gebruik de functie mysqli_stmt::get_result(), deze geeft een mysqli_result terug
Code:
mysqli_result [B]mysqli_stmt::get_result[/B] ( void )
Vervolgens zat ik de documentatie van een mysqli_result te bekijken en kwam daar fetch_assoc() tegen.
Het probleem is echter dat ik hem toepas op de variable $stmt wat een instantie is van mysqli_stmt en geen mysqli_result.

Nu zou ik hem kunnen 'chainen', alleen weet ik niet zeker of jouw PHP versie dat ondersteunt dus ik zet de chaining tussen commentaar zodat je hem kunt proberen :)
PHP:
function getGallery()
{
    global $Database;
    if($stmt = $Database->prepare("SELECT * FROM GALLERY g, CATEGORY c WHERE g.CATEGORY = c.ID ORDER BY c.CATEGORYNAME"))
    {
        $stmt->execute();
        $mysqli_result = $stmt->get_result();
        // return $stmt->get_result()->fetch_assoc();
        return $mysqli_result->fetch_assoc();
    }
    return array();
}
 
var_dump(getGallery());
Nu maar hopen dat dit de goede manier is :D

Een poging om je vraag te beantwoorden waarom de functie met echos wel werkt:
In de documentatie van mysqli_stmt::fetch() staat dit:
Fetch results from a prepared statement into the bound variables
Als ik het goed begrijp zal hij, wanneer gebruikt in combinatie met een WHILE-lus, zolang hij TRUE teruggeeft de waardes tonen.
Omdat we binnen die WHILE functie meteen output genereren is de data dus zichtbaar.
 
Hey top man :D De $mysqli_result manier werkt. Het chainen doet het niet. Ik heb PHP 5.3.13 :) Werkt blijkbaar niet in de nieuwe php :P

Error bij de chain: (misschien wel intressant :) )

Code:
Fatal error: Call to a member function fetch_assoc() on a non-object in F:\wamp\www\icms-eden\models\m_gallery.php on line 205

Informatie die hij terug geeft bij $mysqli_result = $stmt->get_result(); :
Code:
array (size=5)
  'id' => int 1
  'name' => string 'blaadjes' (length=8)
  'imagename' => string 'ulj4c01e4ngreen-leaves-wallpaper_2560x1600_86508.jpg' (length=52)
  'category' => int 1
  'categoryname' => string 'category' (length=8)

Hiermee zou het moeten gaan lukken :D

Heel erg bedankt hier was ik zelf nooit achter gekomen :)

Ik snap eigenlijk niet waarom hij wel werkt als je eerst een variable aanmaakt en niet als je hem direct achter elkaar zet :P
 
Ik vermoed dat chaining niet werkt omdat het om 2 verschillende objecten gaat.
Dit is je uiteindelijke code binnen het IF-statement geweest?
PHP:
$stmt->execute();
return $stmt->get_result()->fetch_assoc();
(Of dit, als chaining wel werkt zoals ik denk)
PHP:
return $stmt->execute()->get_result()->fetch_assoc();
Geeft hij trouwens wel alle rijen uit de database terug?

Ik snap eigenlijk niet waarom hij wel werkt als je eerst een variable aanmaakt en niet als je hem direct achter elkaar zet :P
Als bovenstaand niet werkt komt dat door dit:
Het probleem is echter dat ik hem toepas op de variable $stmt wat een instantie is van mysqli_stmt en geen mysqli_result.
 
De while lus werkt inderdaad nog steeds niet. Hij crashed nog steeds mijn pagina :(

Hij blijft unlimited doorloopen

EDIT:

Wat ook niet werkt is dat er in de while gebruikt gemaakt word van de $c_name
 
Laatst bewerkt:
Grote kans inderdaad dat zaken nu anders opgeroepen moeten worden.

Van de while maken we eens een foreach, en dan kijken we wat er in elke iteratie op te vragen valt :)

PHP:
function getGallery()
{
    global $Database;
    if($stmt = $Database->prepare("SELECT * FROM GALLERY g, CATEGORY c WHERE g.CATEGORY = c.ID ORDER BY c.CATEGORYNAME"))
    {
        $stmt->execute();
        $mysqli_result = $stmt->get_result();
        // return $stmt->get_result()->fetch_assoc();
        return $mysqli_result->fetch_assoc();
    }
    return array();
}

$gallery = getGallery();
foreach($gallery AS $image)
{
    echo '<h1>Nieuwe iteratie</h1>';
    var_dump($image);
}

Ik vermoed dat je elke keer een array gepresenteerd krijgt waardoor je velden op kan vragen via $image['{naam_van_veld}'];
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan