Archief - opmaak klopt niet

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Neww

Legacy Member
Hoi,

ik ben onlangs begonnen met het maken van een eigen site.
Deze is bedoeld als een grote schooltaak en moet een flinke code php bevatten... Nu ben ik juist begonnen en krijg ik al meteen een fout.
Ik werk met sessies om in te loggen en wanneer men niet ingelogd is dan krijg je een register knop in navigatie te zien, ben je wel ingelogd dan krijg je een beheer knop te zien.
Het probleem is dat die beide knoppen toont...

code:
PHP:
<?php

	if(isset($_SESSION['Ingelogd']))
	{
?>
		<div class=\"menuitem\"><a href=\"beheer.html\">Beheer</a></div>
<?php
	}

	else
	{
?>
		<div class=\"menuitem\"><a href=\"registreren.html\">Registreren</a></div>
<?php	
	}
?>

Ik hoop dat iemand de fout vind... Zelf mijn leraar vond het niet na een half uur vanalles zitten te proberen >.>

Albireo

Legacy Member
Staat die code wel in een PHP-bestand? Als dit in een HTML-bestand staat, krijg je inderdaad beide knoppen te zien omdat de PHP-code dan niet uitgevoerd wordt.

Neww

Legacy Member
Bedankt allemaal om zo snel te antwoorden.
Het was dus zoals Albireo zei: extensie was verkeerd.
Een beginnersfout neem ik aan? :p

@Tyfius: ja, die had mijn leraar daartussengefoefeld. Die moeten dus daadwerkelijk weg of hij neemt de opmaak van de css niet aan.

@Curahee Q: ik zal die site eens grondig bekijken. Ik kan er nog uit leren.

Als iemand goeie sites heeft om mijn kennis van php wat bij te schaven mag je deze altijd doorsturen ^^

Curahee Q

Legacy Member
Even uitleggen wanneer je wel de \ moet zetten.

Wanneer je je html gaat echo'en in php en je double quotes gebruikt moet je ze daar zetten

PHP:
<?php 
    if(isset($_SESSION['Ingelogd'])) 
    { 
        echo "<div class=\"menuitem\"><a href=\"beheer.html\">Beheer</a></div>";
    } 
    else 
    { 
        echo "<div class=\"menuitem\"><a href=\"registreren.html\">Registreren</a></div>";    
    } 
?>

Hier moeten ze dan weer wel staan. Echter is het afgeraden om double quotes te gebruiken en in plaats moet men single quotes gebruiken.
De reden die hierachter zit is ten eerste dat we dan niet moeten escapen (dus de \ moeten gebruiken).

PHP:
<?php 
    if(isset($_SESSION['Ingelogd'])) 
    { 
        echo '<div class="menuitem"><a href="beheer.html">Beheer</a></div>';
    } 
    else 
    { 
        echo '<div class="menuitem"><a href="registreren.html">Registreren</a></div>';    
    } 
?>

Je merkt dan ook meteen dat wanneer je een hele lap html tekst in je php echo zet waar allemaal escapecharacters staan, dit vrij onoverzichtelijk wordt.

Nu is hier wel een klein addertje onder het gras. Wanneer we variabele tussen single quotes zetten gaat php deze niet parsen (= omzetten naar zijn waarde). Wanneer deze tussen double quotes staan gaat php deze wel parsen.

PHP:
<?php
$hello = "Hello";

echo "$hello World!";     // Hello World!
echo '$hello World!';      // $hello World!
?>

Dit moet je oplossen door de variabele buiten de quotes te halen.

PHP:
<?php
$hello = "Hello";

echo "$hello World!";     // Hello World!
echo '$hello World!';      // $hello World!
echo $hello . ' World!';   // Hello World!
?>

Buiten quotes halen raad ik trouwens ook aan wanneer je double quotes gaat gebruiken. Veel minder kans op fouten en met syntax highlighting zie je meteen wat de variabele zijn. Nog een klein voordeel van single quotes is dat php sneller zal zijn. Dit komt omdat de parser niet over alle lappen tekst moet gaan op zoek naar variabelen.

Hopelijk heb je hier nog wat aan ;).

Neww

Legacy Member
@ Curahee Q: mooi uitgelegd. Het is nu zeker wat duidelijker.

@Unrach: heb al wat rondgekeken, ziet er een goeie site uit.

Ik ben vandaag wat bezig geweest met php en heb al een simpele login gemaakt (die werkt met sessies). Ook een pagina waar ik gebruikers kan toevoegen en waar ik alle gegevens uit een tabel kan opvragen. Allemaal verbonden met elkaar. Dus wanneer je inlogd geeft die via sessies door aan de andere paginas dat ik ingelogd ben en dan pas word de code uitgevoerd etc.

Nu er zijn nog enkele dingen die ik niet voor de volle honderd procent snap..

zoals: mysql_fetch_array, mysql_fetch_asoc en mysql_query (die voert een sql statement uit dacht ik?)

Wat doen die functies precies?

Curahee Q

Legacy Member
mysql_fetch_array is in principe hetzelfde als mysql_fetch_assoc. Er zijn echter wel verschillen in snelheid. *_assoc is sneller dan *_array daarom wordt *_assoc aangeraden.

Hetgeen deze functies doen is totaal anders dan wat mysql_query() doet. mysql_query() voert namelijk echt een query uit en geeft een resultset terug (die correspondeert met de query die jij hebt opgegeven).
De mysql_fetch_* functies gaan deze resultset rij per rij behandelen. Ze geven false terug wanneer er geen rijen meer zijn.

PHP:
<?php
$resultset = mysql_query("SELECT iets FROM tabel WHERE tabelID>50") or die(mysql_error());

while($data = mysql_fetch_assoc($resultset)) {
       echo $data['iets'];
}
?>

Hoe deze functies gemakkelijk op te zoeken ;)
1. Typ in je adresbalk www.php.net
2. Voeg er een / aan toe dus -> www.php.net/
3. Voeg de naam van de functie toe -> www.php.net/mysql_fetch_assoc
4. Druk op enter

Neww

Legacy Member
Alweer een mooie uitleg...

mysql_query voert dus gewoon een sql statement uit, indien niet dan "killt" hij de mysql error die hij normaal zou geven.

dan ga je via while en myqsl_fetch_assoc rij per rij controleren?
en indien er een waarden zijn gevonden zal hij die tonen?

Curahee Q

Legacy Member
mysql_query() voert inderdaad het sql statement uit, als er echter een fout zit in de SQL-syntax zal hij de mysql_error() geven. Hierin staat dan redelijk deftig uitgelegd wat er fout is in je query. Dus de die() gebeurt enkel als er een fout zit in je query.

Met mysql_fetch_assoc() ga je rij per rij overlopen. Zolang er rijen zijn KAN men deze tonen, de data die er getoond wordt hangt af van de programmeur. Je kan namelijk
SELECT * FROM tabel
doen. Dit wilt zeggen dat je elke kolom ophaalt. In de while lus is het dan aan de programmeur welke data hij laat zien.

Maar let hier mee op. Het is namelijk zo dat men meestal niet alles wilt laten zien of alles nodig heeft uit de database. Haal dus enkel op wat je nodig hebt. Heb je enkel het id nodig, gebruik dan niet het '*' om ALLES op te halen. Dit is gewoon overkill en extra communicatie met de database.

Hopelijk staat hier zowat je antwoord in. Indien je nog met vragen zit hierover (of in het algemeen met php), stel ze gerust. Ik doe niks liever dan dingen uit te leggen, weet zelf ook hoe moeilijk het is in het begin ;).

Neww

Legacy Member
Ik snap het nu volledig, bedankt hiervoor :). Vandaag een sb hierover gehad, ging wel wat minder wegens tijdsgebrek maarja. Na de examens zal ik verder werken aan mijn website. Ben vrij zeker dat er nog vragen zullen komen ;)

Neww

Legacy Member
2 maanden later...
Ondertussen heb ik wat gewerkt aan men site. Nu probeer ik de site online te zetten maar heb een probleem... Ik krijg deze foutmelding:
PHP:
 Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\inetpub\vhosts\ib08.sint-rembert.be\httpdocs\home.php:2) in C:\inetpub\vhosts\ib08.sint-rembert.be\httpdocs\home.php on line 4

Scrimrage

Legacy Member
is da niet omdat je eerst output doet alvorens nog eens een header te sturen (session_start() in dit geval).

Neww

Legacy Member
Ik heb wat rondgekeken en een oplossing gevonden.
Ik moest alles van html code wat voor session_start() stond erachter plaatsen. En dan werkte het :)

Curahee Q

Legacy Member
Is een zeer veel voorkomende fout en vind je miljoenen vragen van op google. Gewoon session_start() helemaal vanboven zetten.

De opbouw van mijn document is meestal (indien session_start() gebruikt wordt).

PHP:
<?php
session_start();
include('...');
include('...');

# nog meer php
?>
<!DOCTYPE ...>
<html>
<head>
...

Neww

Legacy Member
@scrimage, ja wist niet wat je met output bedoelde :P

@Curahee Q, zo heb ik het kunnen oplossen ^^

Mijn website is nu zo goed als af. Nog een paar kleine dingen maar dat is het.
Url: Aim 2 Kill - review site
account naam: test, pass: test

De opdracht was om een soort game review te maken. Dit is mijn eerste site zowel hmtl als de php is volledig door mijzelf geschreven. (Buiten banner is niet van mij & de reviews).
Alle commentaar is welkom :) ik ben er me van bewust dat er waarschijnlijk nog vele fouten inzitten.

adrianhates

Legacy Member
Neww zei:
Ik heb wat rondgekeken en een oplossing gevonden.
Ik moest alles van html code wat voor session_start() stond erachter plaatsen. En dan werkte het :)

merk op dat zelfs een spatie output is.. Het is dus zeker niet alleen html dat ge er onder moet zetten, maar eender welke character of reeks van characters.

Neww

Legacy Member
@adrianhates, ja ik heb alles na session_Start() gezet.

Let wel degene die mijn site testen om de test account (admin) niet te veranderen in een normale gebruiker (nummer veranderen in wijzigen). Want dit is zojuist gebeurd en dan moet ik die gebruiker admin maken in database...
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan