Rij van links maken uit een database

Status
Niet open voor verdere reacties.

Jorryt

Gebruiker
Lid geworden
19 dec 2010
Berichten
246
Hallo,

Ik ben voor een schoolproject bezig met een website, waarop iedereen zijn eigen pagina heeft. Iedereen moet elkaars pagina kunnen bereiken. Om simpel te beginnen was ik bezig met een gewone link. Ik heb hiervoor het volgende script bedacht:

PHP:
<?php 
//verbinding maken met de database
$mysql = mysql_connect("localhost","x","x") or die("Fout: Er is geen verbinding met de MySQL-server tot stand gebracht!");
mysql_select_db("jtmovie",$mysql) or die("Fout: Het openen van de database is mislukt!");

// Alle namen uit de leden tabel halen
$querry = mysql_query("SELECT naam FROM leden",$mysql) or die("De toevoegquery op de database is mislukt!");

//er iets fatsoenlijks van maken 
$resultaat = mysql_fetch_array($querry,MYSQL_BOTH);

//kijken hoeveel rijen/gebuikers er zijn
$aantal = mysql_num_rows($resultaat);

// functie maken die met een variable de link print
function naamprinten($naam) {
print "<a href=\"leden/$naam.php\">$naam</a>"; 	
}

//daadwerkelijk de functie uitvoeren. Met lus zodat ze allemaal weergeven worden (aangezien nul ook meetelt, aantal -1)
for ($x = 0 ; $x <= $aantal-1 ; $x++)
{
naamprinten($resultaat["$x"]);
}

//database verbinding afsluiten
mysql_close($mysql) or die("Het verbreken van de verbinding met de MySQL-server is mislukt!"); 
?>

Alleen nu geeft de array: $resultaat["$x"] niet meer dan de eerste variabele (0) weer.
Persoonlijk dacht ik dat het probleem lag bij $resultaat = mysql_fetch_array($querry,MYSQL_BOTH); omdat ik in plaats van 1 rij met verschillende kolommen hier gebruik maak van 1 kolom met verschillende rijen.
Persoonlijk zou ik niet weten wat ik dan in moet vullen om de goede gegevens eruit te halen.
Bovendien geeft de teller voor het aantal rijen de volgende foutmelding

Warning: mysql_num_rows() expects parameter 1 to be resource, array given in L:\Xammp\xampp\htdocs\Project Inloggen\kiezen.php on line 34
Line 34 is hierboven regel 13

Groetjes,
Jorryt Tichelaar
 
Laatst bewerkt:
Mysql_fetch_array (en alle andere mysql_fetch-functies) halen maar een rij op. Om alle rijen op te halen moet je het in een lus gebruiken:
PHP:
while ($resultaat = mysql_fetch_array($querry,MYSQL_BOTH))
{
  naamprinten($resultaat["naam"]);
}

Omdat je nu geen mysql_num_rows meer nodig hebt ben je meteen van de waarschuwing af :). Die waarschuwing werd veroorzaakt omdat je msyql_num_rows moet aanroepen op het resultaat van de query, in dit geval $querry.
 
Ik denk niet dat ik dat stukje code helemaal begrijp.
Voor zover ik weet is while een functie die iets uitvoert totdat de while niet meer klopt.
Wat je nu in de while zet verandert toch niet? Dus dan zou die eeuwig de functie printennaam uitvoeren met maar 1 variable uit de array $resultaat

Toch bedankt voor je snelle reactie ;)
 
Wat die while doet is alle resultaten aflopen die mysql_fetch_array staan... ;)


Ik heb je script ingekort en overbodige dingen weggehaald :)

PHP:
<?php 
//verbinding maken met de database
$mysql = mysql_connect("localhost","x","x") or die("Fout: Er is geen verbinding met de MySQL-server tot stand gebracht!");
mysql_select_db("jtmovie",$mysql) or die("Fout: Het openen van de database is mislukt!");
 
// Alle namen uit de leden tabel halen
$querry = mysql_query("SELECT naam FROM leden",$mysql) or die("De toevoegquery op de database is mislukt!");
 
while ($resultaat = mysql_fetch_array($querry,MYSQL_BOTH))
{
 echo "<a href=\"leden/".$resultaat['naam'].".php\">".$resultaat['naam']."</a>";
}
 
//database verbinding afsluiten
mysql_close($mysql) or die("Het verbreken van de verbinding met de MySQL-server is mislukt!"); 
?>
 
Laatst bewerkt:
Voor zover ik weet is while een functie die iets uitvoert totdat de while niet meer klopt.
Wat je nu in de while zet verandert toch niet? Dus dan zou die eeuwig de functie printennaam uitvoeren met maar 1 variable uit de array $resultaat

While gaat inderdaad door tot de conditie niet meer klopt. Als je je while zo maakt zoals in de code die ik gaf (en in SumBeams versie) wordt, elke keer als de conditie gecontroleerd wordt, een nieuw resultaat uit de database in $resultaat gezet.

Overigens, als ik jou was zou ik je gebruikersnaam en wachtwoord uit je post halen (dan kan SumBeam dat ook even doen in zijn voorbeeld).
 
Bedankt allebei :thumb:

Ik gebruik toch liever de zelfgemaakte functie, is vind ik, wat overzichtelijker. Al helemaal nu ik van een link afbeeldingen en dergelijken van ga maken.

Mag ik vragen waarom je in jouw versie zoveel dubbele quotes gebruikt?

Ik snap ook nooit waarom mensen echo gebruiken ipv print. Wat is het voordeel?

En waarom gebruik je $resultaat["naam"]? waar haal je die naam vandaan?
 
Uit de database. Het veld daar heet naam, dus in de resultaat array is er ook een key die "naam" heet, met daarin de waarde van het "naam" veld uit de database voor die rij.
 
Mag ik vragen waarom je in jouw versie zoveel dubbele quotes gebruikt?

Euh, ja. Kwestie van mijn programmeer stijl. Maakt in principe niet veel uit, maar ik vind het zelf handiger.

Ik snap ook nooit waarom mensen echo gebruiken ipv print. Wat is het voordeel?

Er is weinig verschil en in de praktijk niet merkbaar, maar het schijnt dat print een functie is die een 1 of een 0 teruggeeft. Echo doet dat niet en zou sneller moeten zijn. Maar dat zijn van die nutteloze verschillen die niet merkbaar zijn.


En waarom gebruik je $resultaat["naam"]? waar haal je die naam vandaan?

Zie hierboven :) Jij gebruikt hem zelf trouwens ook ;)
 
Ik gebruikte de $resultaat["x"] toch?

In ieder geval ontzettend bedankt,
Jullie hebben me een stuk verder geholpen!

Nou heb ik wel een volgend probleem, 1 lange rij is een beetje onoverzichtelijk en zelfs lelijk. Ik zou ze dus graag naast elkaar zetten, maar dan moet je dus voor bijvoorbeeld alle oneven resultaten (resultaat 1,3,5) iets anders moeten doen voor de even resultaten. Ik zou zelf niet weten hoe je hierin verschil kan maken, tenzij je de while eentje kan laten skippen...?

Alvast bedankt.
 
Bovendien, frats, heb ik nou je signature gestolen:O
wat een toeval.
 
Haha, mijn quote verspreid zich blijkbaar. Of ik ben niet de enige die op het idee gekomen was.

Je kunt een while niet echt iets laten skippen, maar je kunt wel in een variabele bijhouden
of je met een even of oneven rij bezig bent en afhankelijk daarvan wat veranderen...

PHP:
$even = false;
for ( $i = 0 ; $i < 10 ; $i++ ) {
  $even = !$even; // wissel de status van even (als het even was is het nu niet even en als het niet even was is het nu even
}

Dat kun je ook in een while loop doen en dan kun je dus controleren wat de status is.
 
Ik snap denk ik wel wat daar staat, je kan kijken of het even is als $even = true voor even of $even = false voor oneven.

Maar hoe krijg je dit dan in een while?
 
Door de "for" door een "while" te vervangen ;)

Principe is hetzelfde.
 
Ik heb nu iets in deze richting, alleen werken wil het niet...

PHP:
<table width="100%" border="0">
<?php
//verbinding maken met de database
$mysql = mysql_connect("localhost","root","130048") or die("Fout: Er is geen verbinding met de MySQL-server tot stand gebracht!");
mysql_select_db("jtmovie",$mysql) or die("Fout: Het openen van de database is mislukt!");

// Alle namen uit de leden tabel halen
$querry = mysql_query("SELECT naam FROM leden",$mysql) or die("De toevoegquery op de database is mislukt!");

// De resultaten loopen zodat die elke rij afgaat. Bovendien bij elk ding, de $even van false naar true zetten en ook omgekeerd.
$even = false;

while ($resultaat = mysql_fetch_array($querry,MYSQL_BOTH)) {
$even = !$even;
if ($even = true) naamprintene($resultaat["naam"]); 
else {naamprintenn($resultaat["naam"]);} 
}

// functie maken die met een variable de link print eentje voor even en eentje voor not even
function naamprintene($naam) {
print "<tr><td><div class=\"pagina\"><a href=\"leden/$naam.php\">$naam<a/></div></td>"; }

function naamprintenn($naam) { 
print "<td><div class=\"pagina\"><a href=\"leden/$naam.php\">$naam<a/></div></td></tr>"; }

//database verbinding afsluiten
mysql_close($mysql) or die("Het verbreken van de verbinding met de MySQL-server is mislukt!"); 
?>
</table>
 
Laatst bewerkt:
Je hebt weer je gebruikersnaam en wachtwoord gepost.

Dat het niet werkt (wat werkt er precies niet) heeft waarschijnlijk te maken met de variable scope. Het komt er op neer dat de variabele "$even" van regel 11 en 16 een andere is dan de variabele "$even" op regel 22 (dat is een lokale).
Je moet dus of de "if" in de while-lus zetten, of gebruik maken van het keyword "global" of "$GLOBALS" (zie bovenstaande link).

Nog even over je stijl. Als je een variabele gebruikt met een boolean waarde (true of false) controleer je dat doorgaans niet met
PHP:
if ($even == true)
maar met
PHP:
if ($even)
(je vraagt immers ook "regent het vandaag" en niet "is het waar dat het vandaag regent" :)). Het werkt wel, maar het is minder gebruikelijk.

[edit]Dan moet je niet terwijl ik aan het typen ben je code veranderen ;). In je nieuwe code gaat het waarschijnlijk mis omdat je
PHP:
if ($even = true)
gebruikt. Dat moet met twee '='-tekens (nog een voordeel als je dat deel helemaal weg laat :)).[/edit]
 
Laatst bewerkt:
Dit werkt leuk als er een even aantal qua leden is, maar stel dat er 17 gebruikers zijn? Dan wordt de laatste <tr> niet afgesloten. Ik heb vroeger ook eens met dat probleem te maken gehad, toen was dit mijn oplossing (3 jaar geleden toen ik nog wat minder ver in PHP was)

PHP:
	    // Get info from database
	$sql = mysql_query("SELECT * FROM `servers` ORDER BY `name` ASC");
    // Count rows
	$num_rows = mysql_num_rows($sql);
	for ($i = 1; $info = mysql_fetch_object($sql); $i++)
	{
	    // Check if $i is odd
		if($i % 2 == 1)
		{
			echo "<tr><td class=\"hoststatus\">".$info['name']."</td>\n";

            // Check if $i is the last row from the database, if so, add the closing tag for <tr>
			if($i == $num_rows)
				echo "</tr>\n";
		}
        // $i is even
		else
		{
			echo "<td class=\"hoststatus\">".$info['name']."</td></tr>\n";
		}
	}
 
Laatst bewerkt:
Persoonlijk zou ik dat anders doen, namelijk buiten de loop nog een laatste keer controleren of !$even, en als dat het geval is nog een lege rij uitputten. Dat is net even wat leesbaarder (en efficienter maar daar gaan we het niet over hebben :P)
 
Ongetwijfeld. Maar nu voor een tabel met 3 kolommen. Dan wordt het weer wat lastiger.. Ik heb dit bedacht, maar weer geld dat er geen xhtml is....

PHP:
<?php
//verbinding maken met de database
$mysql = mysql_connect("localhost","root","130048") or die("Fout: Er is geen verbinding met de MySQL-server tot stand gebracht!");
mysql_select_db("jtmovie",$mysql) or die("Fout: Het openen van de database is mislukt!");

// Alle namen uit de leden tabel halen
$querry = mysql_query("SELECT naam FROM leden",$mysql) or die("De toevoegquery op de database is mislukt!");

//kijken hoeveel rijen/gebuikers er zijn
$aantal = mysql_num_rows($querry);

// variable $a aanmaken met beginpositie -1
$a = -1;

//tabel aanmaken
print ("<table>");

//resultaten ophalen
while ( ($resultaat = mysql_fetch_array($querry,MYSQL_BOTH)) && ($a<=18)) {
	
//a komt per loop er 1 bij, vervolgens de drie dingen uitdraaien. Wat er gebeurd is dat er nu 6 keer een uitdraai wordt gemaakt. 
$a = $a+1;
if ($a === 0) {$x=0;}
if ($a === 3) {$x=1;}
if ($a === 6) {$x=2;}
if ($a === 9) {$x=3;}
if ($a === 12) {$x=4;}
if ($a === 15) {$x=5;}
if ($a === (0+(3*$x))) { naamprintenl($resultaat["naam"]);	}
if ($a === (1+(3*$x))) { naamprintenm($resultaat["naam"]);	}
if ($a === (2+(3*$x))) { naamprintenr($resultaat["naam"]);	}
}

//xhtml van maken, door de rij toch te sluiten met </tr> tenzij het een veelvoud is van 3
if ($aantal === 3||6||9||12||15||18) {} else {print "</tr>";}

//tabel eindigen
print ("</table>");

function naamprintenl($naam) {
print "<tr><td>$naam</td>"; }

// <div class=\"pagina\"><a href=\"leden/$naam.php\">$naam<a/></div><br />

function naamprintenm($naam) { 
print "<td>$naam</td>"; } 

function naamprintenr($naam) { 
print "<td>$naam</td></tr>"; }

//database verbinding afsluiten
mysql_close($mysql) or die("Het verbreken van de verbinding met de MySQL-server is mislukt!"); 
?>

Opzich werkt het, maar het is geen xhtml, omdat de rijen inderdaad niet worden afgesloten. Op 1 of andere manier werkt de manier waarop ik dat tackel niet.. Iemand enig idee hoe dit xhtml kan worden of waarom mijn tackel niet werkt? Bovendien, kan de code niet wat simpeler dan hierboven geschreven is?
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan