<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>W3use.nl</title>
	<atom:link href="http://www.w3use.nl/feed" rel="self" type="application/rss+xml" />
	<link>http://www.w3use.nl</link>
	<description>Php, html en meer</description>
	<lastBuildDate>Sat, 28 Apr 2012 09:44:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Files veilig uploaden</title>
		<link>http://www.w3use.nl/beveiliging/files-veilig-uploaden.html</link>
		<comments>http://www.w3use.nl/beveiliging/files-veilig-uploaden.html#comments</comments>
		<pubDate>Wed, 18 May 2011 19:43:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Beveiliging]]></category>

		<guid isPermaLink="false">http://www.w3use.nl/?p=20</guid>
		<description><![CDATA[Inleiding Files uploaden is een feature die vaak nodig is op een site en toch vaak problemen met zich meebrengt. Mensen lopen tegen schrijf/lees restricties aan en zetten uit paniek alle deuren open (het bekende CHMOD 777 verhaal). Niet doen, hieronder een korte uitleg waarom niet en hoe het wel zou moeten. Basiskennis, de werking [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Inleiding</strong></p>
<p>Files uploaden is een feature die vaak nodig is op een site en toch vaak problemen met zich meebrengt. Mensen lopen tegen schrijf/lees restricties aan en zetten uit paniek alle deuren open (het bekende CHMOD 777 verhaal). Niet doen, hieronder een korte uitleg waarom niet en hoe het wel zou moeten.</p>
<p><strong>Basiskennis, de werking van een formulier</strong><br />
Als je dmv een html formulier een bestand upload dan blijft dat bestand slechts aanwezig totdat het script is afgelopen. Bij het versturen van het onderstaande formulier komt het bestand binnen op dezelfde pagina ($_SERVER[‘PHP_SELF’]) en wordt het bestand onder een tijdelijke naam even weggezet op de server.</p>
<div>
<table>
<tbody>
<tr>
<td valign="top">
<pre>001
002
003
004
005
006
007
008
009
010
011
012</pre>
</td>
<td valign="top">
<pre>&lt;?php
//hier staat je php script die iets met die file zal moeten gaan doen wil ie niet gedelete
//worden na het uitvoeren van het (dmv php) opbouwen van deze pagina
?&gt;
&lt;html&gt;
&lt;body&gt;
&lt;form enctype="multipart/form-data" action="&lt;?php <a title="php documentatie: echo" href="http://replay.web.archive.org/20050204222810/http://www.php.net/echo" target="_blank">echo</a> $_SERVER['PHP_SELF']; ?&gt;" method="post"&gt;
&lt;input type="hidden" name="MAX_FILE_SIZE" value="150000"&gt;
&lt;input type="file" name="mijn_bestand"&gt;&lt;br /&gt;
&lt;input type="submit" value="Upload"&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>Het php script op deze pagina zal wat met de file moeten doen anders is na het doorlopen van het script de file weg. De file moet worden verplaatst van de tijdelijke locatie/bestandsnaam naar een definitieve locatie/bestandsnaam.</p>
<p><strong>lees en schrijfrechten in linux</strong><br />
In Linux (hoogstwaarschijnlijk het besturingssysteem waarop je webserver draait) zijn mappen standaard beveiligd, niet iedereen mag er zomaar in schrijven/lezen/executen.<br />
Er zijn 3 soorten gebruikers die op schrijf/lees/execute niveau 3 verschillende rechten kennen.</p>
<div>
<table>
<tbody>
<tr>
<td valign="top">
<pre>001
002
003
004</pre>
</td>
<td valign="top">
<pre>		READ		WRITE		EXECUTE
USER		1		2		4
GROUP		1		2		4
ALL		1		2		4</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>Wie zijn user/group/all? Wat zijn veilige instellingen? <a href="http://replay.web.archive.org/20050204222810/http://82.150.156.163/artikelen.php?aid=65" target="_blank">uitgebreid artikel over CHMOD</a></p>
<p><strong>ftp </strong><br />
In eerste instantie gooi je de files van je website meestal met een ftp programma (zoals <a href="http://replay.web.archive.org/20050204222810/http://www.download.com/3000-2160-10018456.html" target="_blank">ws_ftp</a>, <a href="http://replay.web.archive.org/20050204222810/http://www.download.com/3000-2160-10018456.html" target="_blank">flashfxp</a> of bijv het gratis <a href="http://replay.web.archive.org/20050204222810/http://www.ghisler.com/download.htm" target="_blank">Total Commander</a>) naar je webserver. Ook kun je via een dergelijk programma snel een directory stuctuur opzetten.</p>
<p>Handig en snel, ware het niet dat je via een FTPverbinding een andere USER en GROUP bent/hebt dan dat je de server benadert via php. Gevolg: Je hebt via php geen schrijfrechten in de mappen die je via je FTP programma gemaakt hebt. Je kunt dus niet via de php functie <a href="http://replay.web.archive.org/20050204222810/http://nl2.php.net/manual/nl/function.move-uploaded-file.php" target="_blank">move_uploaded_file </a>je bestand verplaatsen naar een andere map. Ook kun je in met de functie <a href="http://replay.web.archive.org/20050204222810/http://nl2.php.net/manual/nl/function.mkdir.php" target="_blank">mkdir</a> geen mappen maken.</p>
<p>Je hebt geen rechten, wat moet je nu doen? Veel scripts geven aan dat je de rechten van de directories moet verruimen (ofwel ze zeggen: zet je CHMOD hoger, bijvoorbeeld naar 777). Gevolg: ander users/groups mogen in je directory komen en je kunt aan de slag. MAAR heel rest van de wereld kan OOK uploaden/deleten in je directories. Foute boel dus.</p>
<p><strong>ftp via php</strong><br />
Het alternatief is dat we via php een ftp connectie opzetten met de webserver, waarna we het bestand verplaatsen/wijzigen/deleten. Als we via een ftp connectie het bestand benaderen dan hebben we dezelfde USER/GROUP als dat we via het FTP programma zelf zouden doen.</p>
<p><strong>voordelen van deze methode</strong><br />
- je voorkomt het probleem dat je directories hebt van verschillende USER/GROUPS. Als je de zaak wilt backuppen dan kun je dit makkelijk en snel via je FTP programma doen en loop je niet tegen mappen aan waar je volgens de rechten niet aan mag komen.<br />
- Je hoeft je maprestricties niet te verruimen, de zaak blijft dus lekker veilig.</p>
<p><strong>voorbeeld van de toepassing van een ftp connectie in php</strong></p>
<div>
<table>
<tbody>
<tr>
<td valign="top">
<pre>001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063</pre>
</td>
<td valign="top">
<pre>&lt;?php
//definieer constanten
<a title="php documentatie: define" href="http://replay.web.archive.org/20050204222810/http://www.php.net/define" target="_blank">define</a> ('FTP_HOSTNAME','hier_de_hostname_van_je_ftp',true);
<a title="php documentatie: define" href="http://replay.web.archive.org/20050204222810/http://www.php.net/define" target="_blank">define</a> ('FTP_USERNAME','inlog_naam',true);
<a title="php documentatie: define" href="http://replay.web.archive.org/20050204222810/http://www.php.net/define" target="_blank">define</a> ('FTP_PASSWORD','wachtwoord',true);
<a title="php documentatie: define" href="http://replay.web.archive.org/20050204222810/http://www.php.net/define" target="_blank">define</a> ('FTP_PATH','hoofd_path_binnen_ftp',true);
$userdir='userdir_waar_je_de_zaak_wilt_inzetten/'; //deze moet reeds zijn aangemaakt!

//start building html
?&gt;
&lt;html&gt;&lt;body&gt;
&lt;?php
if (<a title="php documentatie: isset" href="http://replay.web.archive.org/20050204222810/http://www.php.net/isset" target="_blank">isset</a> ($HTTP_POST_FILES['mijn_bestand'])){
  //was a file uploaded?
  if ($_FILES['mijn_bestand']['error']&gt;0){
    switch ($HTTP_POST_FILES['mijn_bestand']['error']){
      case 1: <a title="php documentatie: echo" href="http://replay.web.archive.org/20050204222810/http://www.php.net/echo" target="_blank">echo</a> 'Error, file exceeded upload_max_filesize'; break;
      case 2: <a title="php documentatie: echo" href="http://replay.web.archive.org/20050204222810/http://www.php.net/echo" target="_blank">echo</a> 'Error, file exceeded maximum file size (150 kb)',1); break;
      case 3: <a title="php documentatie: echo" href="http://replay.web.archive.org/20050204222810/http://www.php.net/echo" target="_blank">echo</a> 'Error, file only partially uploaded'; break;
      case 4: <a title="php documentatie: echo" href="http://replay.web.archive.org/20050204222810/http://www.php.net/echo" target="_blank">echo</a> 'Error, no file uploaded'; break;
    }
}else{
  //make sure file is no bigger then limit of 150 kb (150.000 bytes)
  if ($_FILES['mijn_bestand']['size'] &gt; 150000){
    <a title="php documentatie: echo" href="http://replay.web.archive.org/20050204222810/http://www.php.net/echo" target="_blank">echo</a> 'Error, filesize is '.$_FILES['mijn_bestand']['size'].' bytes, maximum is 150000 bytes (150 kB)';
  }else{
    ftp_file_copy($_FILES['mijn_bestand']['tmp_name'],FTP_PATH.$userdir.$_FILES['mijn_bestand']['name']);
    if (<a title="php documentatie: is_file" href="http://replay.web.archive.org/20050204222810/http://www.php.net/is_file" target="_blank">is_file</a>($userdir.$_FILES['mijn_bestand']['name']))
    <a title="php documentatie: echo" href="http://replay.web.archive.org/20050204222810/http://www.php.net/echo" target="_blank">echo</a> 'file is here';
    else
    <a title="php documentatie: echo" href="http://replay.web.archive.org/20050204222810/http://www.php.net/echo" target="_blank">echo</a> 'file is not here';
    }
  }
}
//let op, de delete functie is nog niet veilig, iedereen die de url aanroept kan hier deleten
//bouw je eigen beveiliging in
if (<a title="php documentatie: isset" href="http://replay.web.archive.org/20050204222810/http://www.php.net/isset" target="_blank">isset</a> ($_GET['del']) &amp;&amp; $_GET['del']!=''){
  if (<a title="php documentatie: is_file" href="http://replay.web.archive.org/20050204222810/http://www.php.net/is_file" target="_blank">is_file</a>($userdir.'/'.$_GET['del']))
  <a title="php documentatie: ftp_delete" href="http://replay.web.archive.org/20050204222810/http://www.php.net/ftp_delete" target="_blank">ftp_delete</a>(FTP_PATH.$userdir.$_GET['del']);
}
?&gt;

&lt;form enctype="multipart/form-data" action="&lt;?php <a title="php documentatie: echo" href="http://replay.web.archive.org/20050204222810/http://www.php.net/echo" target="_blank">echo</a> $_SERVER['PHP_SELF']; ?&gt;" method="post"&gt;
&lt;input type="hidden" name="MAX_FILE_SIZE" value="150000"&gt;
&lt;input type="file" name="mijn_bestand"&gt;&lt;br /&gt;
&lt;input type="submit" value="Upload"&gt;
&lt;?php
if ($handle = <a title="php documentatie: opendir" href="http://replay.web.archive.org/20050204222810/http://www.php.net/opendir" target="_blank">opendir</a>($userdir)) {
  <a title="php documentatie: echo" href="http://replay.web.archive.org/20050204222810/http://www.php.net/echo" target="_blank">echo</a> '&lt;table cellspacing="0" cellpadding="3"&gt;
  &lt;tr&gt;&lt;td&gt;Filename&lt;/td&gt;&lt;td&gt;Width*Height&lt;/td&gt;&lt;td&gt;Preview&lt;/td&gt;&lt;td&gt;Delete&lt;/td&gt;&lt;/tr&gt;';
  $i=1;
  while (false !== ($file = <a title="php documentatie: readdir" href="http://replay.web.archive.org/20050204222810/http://www.php.net/readdir" target="_blank">readdir</a>($handle))) {
    ($i%2) ? $class='class="row1"' : $class='class="row2"';
    if ($file!='.' &amp;&amp; $file!='..' &amp;&amp; $file!='Thumbs.db'){
      <a title="php documentatie: echo" href="http://replay.web.archive.org/20050204222810/http://www.php.net/echo" target="_blank">echo</a> '&lt;tr '.$class.'&gt;&lt;td&gt;'.$file.'&lt;/td&gt;';
      <a title="php documentatie: echo" href="http://replay.web.archive.org/20050204222810/http://www.php.net/echo" target="_blank">echo</a> '&lt;td&gt;&lt;a href="'.$_SERVER['PHP_SELF'].'?del='.$file.'" &gt;delete&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;';
    }
    $i++;
  }
  <a title="php documentatie: echo" href="http://replay.web.archive.org/20050204222810/http://www.php.net/echo" target="_blank">echo</a> '&lt;/table&gt;';
  <a title="php documentatie: closedir" href="http://replay.web.archive.org/20050204222810/http://www.php.net/closedir" target="_blank">closedir</a>($handle);
}
?&gt;</pre>
</td>
</tr>
</tbody>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.w3use.nl/beveiliging/files-veilig-uploaden.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS styleswitcher</title>
		<link>http://www.w3use.nl/css/css-styleswitcher.html</link>
		<comments>http://www.w3use.nl/css/css-styleswitcher.html#comments</comments>
		<pubDate>Wed, 18 May 2011 18:45:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Css]]></category>

		<guid isPermaLink="false">http://www.w3use.nl/?p=11</guid>
		<description><![CDATA[Op sites waar vooruitstrevend gewerkt wordt, wordt content van opmaak gescheiden door middel van CSS. Op deze manier kan, als men dit wil, een visuele updates snel doorvoeren over de gehele site. Ook kan met de site in verschillende visuele vormen aanbieden. Zo kan er een aparte stylesheet zijn voor slechtzienden, mensen speciaal van de [...]]]></description>
			<content:encoded><![CDATA[<p>Op sites waar vooruitstrevend gewerkt wordt, wordt content van opmaak gescheiden door middel van CSS. Op deze manier kan, als men dit wil, een visuele updates snel doorvoeren over de gehele site. Ook kan met de site in verschillende visuele vormen aanbieden. Zo kan er een aparte stylesheet zijn voor slechtzienden, mensen speciaal van de phpvereniging of kunnen er gewoon voor de fun verschillende stylesheets aangeboden worden.</p>
<p>Voor mijn eigen site heb ik â€œgewoon voor de fun verschillende stylesheets gemaakt, een erg leuke extra feature. Wat ik in dit artikel wil beschrijven is het maken van een styleswitcher. Na het inladen van een standaard ingestelde stylesheet kan de bezoeker dmv een drop down select box de gewenste style te kiezen. Deze blijft bewaart in een cookie.</p>
<p>Omdat voor verschillende stylesheets verschillende files (css+plaatjes) nodig zijn<br />
is het van belang dat we een overzichtelijke directory structuur hanteren.<br />
Ik heb gekozen voor de volgende directory structuur op de server:</p>
<div>
<table>
<tbody>
<tr>
<td valign="top">
<pre>001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016</pre>
</td>
<td valign="top">
<pre>- [dir]style
  - [dir]1
    - [dir]css
      css.php
      index.css
      archief.css
      algemeen.css
    hier alle plaatjes voor stylesheet 1
  - [dir]2
    - [dir]css
      css.php
      index.css
      archief.css
      algemeen.css
    hier alle plaatjes voor stylesheet 2
  - enz</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>Zoals je ziet zijn de bestandnamen hetzelfde, alleen het nummer van de directory is verschillend.</p>
<p>Ik ben er vanuit gegaan dat je meer dan Ã©Ã©n pagina op je website hebt en dat je per pagina dusdanige andere content hebt dat je daar een aparte stylesheet voor hebt. Voor de globale layout (kolomstructuur, uitlijning of header) hanteren we een algemeen bestand (algemeen.css) wat op alle paginaâ€™s geldt.</p>
<p>Verschillende paginaâ€™s, (deels) verschillende stylesheets dus. Ik ga even voor het gemak uit van 2 paginaâ€™s, index.php en archief.php.<br />
Deze delen een gezamelijke html-kop (&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;), opgeslagen in top.php.<br />
Probleem: we gebruiken dezelfde &lt;head&gt; voor zowel archief.php als voor index.php, we moeten onderscheid maken in het aanroepen van de stylesheet (wat gebeurt in de &lt;head&gt;).</p>
<p>Hoe lossen we dit op:<br />
In de &lt;head&gt; wordt standaard maar 1 stylesheet ingeladen, namelijk css.php. Aan de hand van een doorgegeven GET variabele bepalen we welke extra stylesheet we moeten includen in css.php.</p>
<p>In archief.php en index.php moeten we een variabele doorgeven, we gebruiken de filenaam:<br />
<strong>archief.php en index.php</strong></p>
<div>
<table>
<tbody>
<tr>
<td valign="top">
<pre>001
002
003
004</pre>
</td>
<td valign="top">
<pre>&lt;?php
$thiscssfile=$_SERVER['PHP_SELF'];
include ('top.php');
?&gt;</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>in top.php is nu de variabele $thiscssfile aanwezig en die geven we door aan css.php door middel van een GET variabele:<br />
<strong>top.php</strong></p>
<div>
<table>
<tbody>
<tr>
<td valign="top">
<pre>001
002
003
004
005
006
007
008
009
010
011
012</pre>
</td>
<td valign="top">
<pre>&lt;body&gt;&lt;head&gt;
&lt;?php
echo '&lt;link href="style/'.$css_dir_nr.'/css/css.php';
if (isset ($thiscssfile)){
	//$thiscssfile bevat bijvoorbeeld "/subdirectory/index.php"
	$thiscssfile=str_replace('/subdirectory/','',$thiscssfile); //strip â€˜/subdirectory/â€™
	$thiscssfile=str_replace('.php','',$thiscssfile); //strip â€˜.phpâ€™
	echo '?file='.$thiscssfile;
}
echo '" rel="stylesheet" type="text/css" /&gt;';
?&gt;
&lt;/head&gt;&lt;body&gt;</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>we roepen nu in de &lt;head&gt; dus aan:<br />
&lt;link href=&#8221;style/&#8217;.$css_dir_nr.&#8217;/css/css.php?file=index&#8217; rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; /&gt;</p>
<p>We halen nu een php file aan als een css file, om aan de verwachtingen van de browser te voldoen, passen we de header aan in css.php</p>
<div>
<table>
<tbody>
<tr>
<td valign="top">
<pre>001</pre>
</td>
<td valign="top">
<pre>&lt;?php header("Content-type: text/css"); ?&gt;</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>In css.php gaan we nu aan de hand van de GET variabele de juiste stylesheet inladen:<br />
<strong>css.php</strong></p>
<div>
<table>
<tbody>
<tr>
<td valign="top">
<pre>001
002
003
004
005
006
007
008
009
010
011
012
013
014</pre>
</td>
<td valign="top">
<pre>&lt;?php
header("Content-type: text/css");
if (isset ($_GET['file'])){
	//eerst laden we het css bestand in wat de â€˜algemeneâ€™ opmaak bevat, wat geldt voor alle paginaâ€™s
	readfile('algemeen.css');
	//hierna kijken we welke paginaâ€™s we extra moeten inladen
	if ($_GET['file'] == 'index'){
		readfile('index.css');
	}
	if ($_GET['file'] == 'archief'){
		readfile('archief.css');
	}
}
?&gt;</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>Nu hebben we dus een systeem wat bij de juiste pagina de juiste stylesheet filenaam inlaadt. We hebben echter nog niet de juiste styledirectory geselecteerd.</p>
<p>Mensen die net goed opgelet hebben, hebben in top.php de variabele $css_dir_nr zien staan. Deze variabele bevat, zoals de naam zegt, het directorynummer van de geselecteerde stylesheet. Maar hoe wordt deze variabele gevuld? Aan de hand van de keuze van de bezoeker natuurlijk.</p>
<p>Deze keuze kan op 3 niveaus doorgegeven worden:<br />
1. mensen die via de style-kiezer net een nieuwe stylesheet geselecteerd hebben<br />
2. mensen die eerder hebben gekozen en een cookie hebben<br />
3. mensen die ingelogd zijn en die in hun preferences een voorkeur hebben ingesteld (variabele $aUserinfo[â€˜stylesheetidâ€™])</p>
<p><strong>De stylekiezer</strong><br />
Stylenaam &#8220;1&#8243; en &#8220;2&#8243; zeggen niet veel, dus in de dropdown select box willen we zinnige namen kunnen geven aan de stylesheets.<br />
Om de namen te koppelen aan de directory nummers gebruiken we een kleine mysql tabel:</p>
<div>CREATE TABLE `style` (<br />
  `styleid` int(11) NOT NULL AUTO_INCREMENT,<br />
  `name` varchar(50) DEFAULT NULL,<br />
  `active` tinyint(1) DEFAULT &#8217;0&#8242;,<br />
  PRIMARY KEY  (`styleid`)<br />
) TYPE=MyISAM;</div>
<p>Om de te kiezen stylesheets in de drop down selectbox weer te geven gebruiken we de volgende functie:</p>
<div>
<table>
<tbody>
<tr>
<td valign="top">
<pre>001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033</pre>
</td>
<td valign="top">
<pre>&lt;?php
function printstylechooser($returnadress){
	global $aUserInfo;
	global $css_dir_nr;

	if (isset ($css_dir_nr)){
		$q="SELECT * FROM style WHERE active=1";
		if (!$r=mysql_query($q))
		echo 'failed to select styles'.mysql_error();
		echo '&lt;select name="style" onchange="location.href=this.options[this.selectedIndex].value"&gt;';
		while ($a=mysql_fetch_assoc($r)){
			echo '&lt;option ';
			if (isset ($_GET['stylesheetid'])){
				if ($_GET['stylesheetid']==$a['styleid'])
				echo ' selected="selected" ';
			}elseif (isset ($_COOKIE['stylesheetid'])){
				if ($_COOKIE['stylesheetid']==$a['styleid'])
				echo ' selected="selected" ';
			}elseif (isset ($aUserInfo)){
				if ($aUserInfo['stylesheetid']==$a['styleid'])
				echo ' selected="selected" ';
			}elseif ($a['styleid']==1)  //DEFAULT STYLESHEET IS NR 1
			echo ' selected="selected" ';
			echo 'value="'.$returnadress.'?stylesheetid='.$a['styleid'].'"&gt;'.$a['name'].'&lt;/option&gt;';
		}
		echo '&lt;option ';
		if ((isset ($_GET['stylesheetid']) &amp;&amp; $_GET['stylesheetid']==0) || (isset ($_COOKIE['stylesheetid']) &amp;&amp; $_COOKIE['stylesheetid']==0) || (isset ($aUserInfo) &amp;&amp; $aUserInfo['stylesheetid']==0))
		echo ' selected="selected ';
		echo 'value="'.$returnadress.'?stylesheetid=0"&gt;Random&lt;/option&gt;';
		echo '&lt;/select&gt;';
	}
}
?&gt;</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>de laatste optie is optie 0: een random stylesheet. Het is een extratje wat waarschijnlijk niet gebruikt gaat worden, maar toch leuk voor de heb.</p>
<p>aan deze functie kun je een aantal dingen opmerken:<br />
- we hebben een variabele $css_dir_nr nodig om hem te laten werken<br />
- het gekozen style_dir_nr wordt voorgeselecteerd in de select box<br />
- na een keuze van de gebruiker wordt de gekozen stylesheet doorgegeven als nummer in de url. Dus na het klikken in de style-kiezer wordt men doorverwezen naar bijvoorbeeld index.php?stylesheetid=1.<br />
- de variabele $returnadress wordt gebruikt om de styleswitcher op verschillende pagina&#8217;s te kunnen weergeven en de gebruiker na keuze terug te laten keren naar deze specifieke pagina.</p>
<p><strong>$css_dir_nr</strong><br />
De variabele $css_dir_nr is de door de user gekozen stylesheet, deze moet bekend zijn voordat de pagina geladen wordt en wordt gebruikt om<br />
- in de stylesheet selector de huidige keuze te voorselecteren (zoals we net gezien hebben)<br />
- de juiste stylesheet te laden (duh)</p>
<p>Voor het bepalen van het juiste directory nummer gebruiken we de volgende functie:</p>
<div>
<table>
<tbody>
<tr>
<td valign="top">
<pre>001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036</pre>
</td>
<td valign="top">
<pre>&lt;?php
function stylesheetselector(){
	global $cssnr;
	global $aUserInfo;

	//set new stylesheet
	if (isset ($_GET['stylesheetid'])){
		if (isset ($aUserInfo)){
			$q="UPDATE account SET stylesheetid=".$_GET['stylesheetid']." WHERE account_id=".$aUserInfo['account_id'];
			if (!$r=mysql_query($q))
			die ('Failed to select stylesheet'.mysql_error().$q);
		$aUserInfo['stylesheetid']=$_GET['stylesheetid'];
		}
		setcookie('stylesheetid',$_GET['stylesheetid'],time()+60*60*24*7);
	}
	//which one should be loaded?
	if (isset ($_GET['stylesheetid']) &amp;&amp; $_GET['stylesheetid']!=0)
	$cssnr=$_GET['stylesheetid']; //this step is needed because the cookie is set but not available until next pageload
	elseif (isset ($_COOKIE['stylesheetid']) &amp;&amp; $_COOKIE['stylesheetid']!=0){
		$cssnr=$_COOKIE['stylesheetid'];
	}elseif (isset ($aUserInfo['stylesheetid']) &amp;&amp; $aUserInfo['stylesheetid']!=0)
	$cssnr=$aUserInfo['stylesheetid'];
	elseif ((isset ($_GET['stylesheetid']) &amp;&amp; $_GET['stylesheetid']==0) || (isset($_COOKIE['stylesheetid']) &amp;&amp; $_COOKIE['stylesheetid']==0) || (isset ($aUserInfo['stylesheetid']) &amp;&amp; $aUserInfo['stylesheetid']==0)){
		//stylesheet is set to random
		if (!$r=mysql_query("SELECT styleid FROM style WHERE active=1"))
		enot ('Failed to select stylesheet'.mysql_error(),1);
		else{
			$max=mysql_num_rows($r);
			$cssnr=rand(1,$max);
		}
	}else{
		//set stylesheet to default
		$cssnr=1;
	}
}
?&gt;</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>Beide hier besproken functies slaan we op in functions.php.</p>
<p><strong>Actie</strong><br />
Om nu de zaak in actie te zien hoeven we eigenlijk maar 2 dingen te doen:<br />
- verschillende stylesheets maken en deze in de bovenaan genoemde directorystructuur te zetten<br />
- de mysql tabel te updaten met de aanwezige stylesheets (en ze hier ook benamen)</p>
<p><strong>files</strong><br />
Hoe zien de files er nu uit na afloop.</p>
<p><span style="text-decoration: underline;">index.php &amp; archive.php</span></p>
<div>
<table>
<tbody>
<tr>
<td valign="top">
<pre>001
002
003
004
005
006</pre>
</td>
<td valign="top">
<pre>&lt;?php
$thiscssfile=$_SERVER['PHP_SELF'];
include ('top.php');
printstyleselector('index.php');
?&gt;</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p><span style="text-decoration: underline;">top.php</span></p>
<div>
<table style="width: 353px; height: 335px;">
<tbody>
<tr>
<td valign="top">
<pre>001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017</pre>
</td>
<td valign="top">
<pre>&lt;?php
include_once ('functions.php');
stylesheetselector();
?&gt;
&lt;head&gt;
&lt;?php
echo '&lt;link href="style/'.$css_dir_nr.'/css/1.php';
if (isset ($thiscssfile)){
	$thiscssfile=str_replace('/moraalridder/','',$thiscssfile);
	$thiscssfile=str_replace('.php','',$thiscssfile);
	echo '?file='.$thiscssfile;
}
echo '" rel="stylesheet" type="text/css" /&gt;';
?&gt;
&lt;/head&gt;
&lt;body&gt;</pre>
</td>
</tr>
</tbody>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.w3use.nl/css/css-styleswitcher.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mysql met Php</title>
		<link>http://www.w3use.nl/php/mysql-met-php.html</link>
		<comments>http://www.w3use.nl/php/mysql-met-php.html#comments</comments>
		<pubDate>Wed, 18 May 2011 18:36:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Php]]></category>

		<guid isPermaLink="false">http://www.w3use.nl/?p=4</guid>
		<description><![CDATA[Inleiding Mysql is handig voor berichten van een forum of gasten boek op te slaan of de van de gebruikers bij een leden systeem. De bases van php moet je wel kennen. Ik schrijf het hier doormiddel van een voorbeeld ( een gastenboek) De volgende dingen bespreek ik hier: - Verbinding maken - Tabel maken. [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Inleiding</strong></p>
<p>Mysql is handig voor berichten van een forum of gasten boek op te slaan of de van de gebruikers bij een leden systeem. De bases van php moet je wel kennen. Ik schrijf het hier doormiddel van een voorbeeld ( een gastenboek)</p>
<p><strong>De volgende dingen bespreek ik hier:</strong><br />
- Verbinding maken<br />
- Tabel maken.<br />
- Gegevens uit de tabel halen.<br />
- Gegevens uit de tabel veranderen.</p>
<p><strong>Verbinding maken</strong></p>
<p>Voor je begint met het werken met Mysql moet je altijd eerst een connectie met de database. Dan is hier het sript kun je de in de pagina verbinden.php zetten en alle pagina&#8217;s waar je met Mysql werkt include &#8220;verbinden.php&#8221;; zetten</p>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td valign="top">
<pre>001
002
003
004
005
006
007
008
009
010
011
012
013</pre>
</td>
<td valign="top">
<pre>&lt;?</pre>
<pre>$host = "localhost"; // de host van de DATABASE (meestal localhost).</pre>
<pre>$gebruikersnaam = "***"; // De gebruikersnaam van de DATABASE.</pre>
<pre>$wachtwoord = "****"; // Het wachtwoord van de DATABASE</pre>
<pre> </pre>
<pre>$db = "*****"; // de DATABASE naam.</pre>
<pre> </pre>
<pre>// en nu de verbinding maken.</pre>
<pre> </pre>
<pre>mysql_connect($host,$gebruikersnaam,$wachtwoord);</pre>
<pre>mysql_select_db($db) OR die(mysql_error);</pre>
<pre>?&gt;</pre>
</td>
</tr>
</tbody>
</table>
<p> <strong>Tabelen maken</strong></p>
<p>In een tabel wordt alle informatie opgeslagen en is die makkelijk er uit de halen te verwijderen en de veranderen. Voor ik een voorbeeld geef eerst de meest gebruikte data types.</p>
<p>De data types:</p>
<p>Getallen:<br />
TINYINT. getal tussen de -128 en 127 bevatten. Als je het. UNSIGNED maakt, dan is het een getal tussen de 0 en 255.<br />
SMALLINT. getal van -32768 tot 32767. UNSIGNED is het 0 tot 65535.<br />
MEDIUMINT. getal van -838860 tot 838860, UNSIGNED is dit 0 tot 16777215.<br />
INT. getal van -2147483648 tot 2147483647 en UNSIGNED is het 0 tot 4294967295.<br />
BIGINT. getal van -9223372036854775808 tot 9223372036854775807. En unsigned dus 0 tot 1844674407370955161<br />
FLOAT. Kommagetal van 32 tekens<br />
DOUBLE. Kommagetal van 64 tekens</p>
<p>Datum en tijd:<br />
DATE. Geeft de tijd aan van 1000-01-01 00:00:00 tot 9999-12-31 23:59:59<br />
TIMESTAMP. De tijd in seconden vanaf 1970-01-01 00:00:00 tot aan nu.<br />
TIME. De tijd van -838:59:59 tot 838:59:59<br />
YEAR. Dit kan in 2 of 4 tekens. Standaard is met 4 tekens. Dan is het van 1901 tot 2155 en 0000. In 2 tekens is het van 70 tot 69.</p>
<p>Strings:<br />
CHAR. is een string met een vast aantal tekens, van 0 tot 255.<br />
VARCHAR. (Variable Character). Je er strings in zetten met verschillend aantal karakters van 0 tot 255.<br />
TinyBLOB en TinyTEXT. Een BLOB (binairy large object) of TEXT met een maximale lengte van 255 tekens<br />
BLOB en TEXT. Een BLOB of TEXT met een maximale lengte van 65,535 tekens.<br />
MEDIUMBLOB en MEDIUMTEXT. Een BLOB of TEXT met een maximale lengte van 16,777,215 tekens.<br />
LONGBLOB en LONGTEXT. Een BLOB of TEXT met een maximale lengte van 4,294,967,295 tekens.<br />
ENUM(&#8216;value1&#8242;,&#8217;value2&#8242;,&#8230;). Een string object dat geen of 1 waarde kan hebben. De waarden moeten bij het maken van de tabel/kolom aangegeven worden, in het voorbeeldje<br />
dus value1 of value2. Er is een maximum van 65,535 mogelijkheden.<br />
SET(&#8216;value1&#8242;,&#8217;value2&#8242;,&#8230;). Hetzelfde als ENUM alleen hier met maximaal 64 tekens.</p>
<p>Dit zijn zo wat de meest gebruikte data types.</p>
<p>DEFAULT. Hiermee geef je een standaard waarde aan.</p>
<p>Vb.</p>
<p>CREATE TABLE `gastenboek` (<br />
`naam` VARCHAR( 10 ) DEFAULT &#8216;anoniem&#8217; NOT NULL<br />
);</p>
<p>AUTO_INCREMENT word er elke keer 1 bijgeteld zodat er elke keer een uniek getal komt gemaakt word.</p>
<p>Vb.</p>
<p>CREATE TABLE `gastenboek` (<br />
`id` INT NOT NULL AUTO_INCREMENT ,<br />
PRIMARY KEY ( `id` )<br />
);</p>
<p>Primaire sleutel. Hiermee word het zoeken in de ze kolom versneld. (geeft aan dat hier het meeste op gezocht moet worden).</p>
<p>Vb.</p>
<p>CREATE TABLE `gastenboek` (<br />
`id` INT NOT NULL AUTO_INCREMENT ,<br />
PRIMARY KEY ( `id` )<br />
);</p>
<p>Index. Wordt automatisch gesorteerd op de kolom die je index hebt gemaakt.</p>
<p>Vb.</p>
<p>CREATE TABLE `gastenboek` (<br />
`naam` VARCHAR(25) NOT NULL ,<br />
INDEX ( `naam` )<br />
);</p>
<p>Unique. In de hele kolom mag maar 1 keer de zelfde waarde voorkomen</p>
<p>Vb.</p>
<p>CREATE TABLE `gastenboek` (<br />
`naam` VARCHAR( 25 ) NOT NULL ,<br />
UNIQUE (<br />
`naam`<br />
)<br />
);</p>
<p>NOT NULL. Er moet iets worden ingevuld als er niets ingevuld hoeft te worden kies je NULL.</p>
<p>Vb.</p>
<p>CREATE TABLE `gastenboek` (<br />
`naam` VARCHAR( 25 ) NOT NULL ,<br />
UNIQUE (<br />
`naam`<br />
)<br />
);</p>
<p>Unsigned. Er zijn alleen positieve getallen mogelijk</p>
<p>Vb.</p>
<p>CREATE TABLE `gastenboek` (<br />
`id` INT UNSIGNED NOT NULL<br />
);</p>
<p>Je kan ook het maximaal aantal tekens van een kolom maken door achter het data type het max. tekens te zetten.</p>
<p>Vb.</p>
<p>CREATE TABLE `gastenboek` (<br />
`naam` VARCHAR( 25 ) NOT NULL ,<br />
);</p>
<p><strong>Tabel</strong><br />
en dan hier de voorbeeld tabel van een gastenboek</p>
<p>CREATE TABLE `gastenboek` (<br />
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,<br />
naam VARCHAR(50) NOT NULL,<br />
bericht TEXT NOT NULL,<br />
ip VARCHAR(20) NOT NULL<br />
);</p>
<p>Dat was de tabel de kan je dan invoegen in je Mysql database management bijvoorbeeld phpmyadmin.</p>
<p><strong>Gegevens uit tabel halen</strong></p>
<p>het script:</p>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td valign="top">
<pre>001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022</pre>
</td>
<td valign="top">
<pre>&lt;?</pre>
<pre>// Verbinding maken !!!!!</pre>
<pre> </pre>
<pre>$select = "SELECT * FROM gastenboek ORDER BY kolom DESC";</pre>
<pre>$query = mysql_query($select) OR die(mysql_error());</pre>
<pre>$aantal = mysql_num_rows();</pre>
<pre> </pre>
<pre>if ($aantal =0)</pre>
<pre>    {</pre>
<pre>    echo "Er zij geen berichte";</pre>
<pre>    }</pre>
<pre>else</pre>
<pre>    {</pre>
<pre>    while ($lijst = mysql_fetch_array($query));</pre>
<pre>            {</pre>
<pre>             echo "Bericht id: $lijst-&gt;id&lt;br&gt;";</pre>
<pre>             echo "van: $lijst-&gt;naam&lt;br&gt;";</pre>
<pre>             echo "Bericht: &lt;br&gt;$lijst-&gt;bericht&lt;br&gt;&lt;br&gt;";</pre>
<pre>             }</pre>
<pre>    }</pre>
<pre>?&gt;</pre>
</td>
</tr>
</tbody>
</table>
<p>* haalt alles uit de tabel maar kan je ook vervangen voor de kolomnaam bij meerdere kolommen zet je er komma tussen.</p>
<p>Vb.</p>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td valign="top">
<pre>001
002
003</pre>
</td>
<td valign="top">
<pre>&lt;?php</pre>
<pre>$select = "SELECT id, naam, bericht FROM gastenboek ORDER BY kolom DESC";</pre>
<pre>?&gt;</pre>
</td>
</tr>
</tbody>
</table>
<p>$aantal = mysql_num_rows(); telt het aantal gevonden rijen $aantal geeft dat het aantal rijen weer.</p>
<p>while ($lijst = mysql_fetch_array($query)); zorgt ervoor dat het gene tussen {} zo vaak word weergegevan als er gevonden kolomen zijn maar dan steeds met andere gegevens. Om een gegeven op te vragen typ je $lijst-&gt;kolomnaam vb. $lijst-&gt;naam. Voor maar een rij weer te geven gebruik je $lijst = mysql_fetch_array($query) dan word allen de eerst gevonden resultaat weergegeven</p>
<p>WHERE haalt de gegevens uit de database waar het aangegeven kolom het gegeven bevat.</p>
<p>Vb.</p>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td valign="top">
<pre>001
002
003</pre>
</td>
<td valign="top">
<pre>&lt;?php</pre>
<pre>$select = "SELECT * FROM gastenboek WHERE naam='pietje' ORDER BY kolom DESC";</pre>
<pre>?&gt;</pre>
</td>
</tr>
</tbody>
</table>
<p>Nu selecteert hij nog alleen de rijen waar de naam pietje is om nog een andere naam te selecteren kan je er achter plakken OR naam=&#8217;jantje&#8217; je kan ook nog zeggen dat een andere kolom een speciale waarde moet hebben door er AND ip=&#8217;192.424.234&#8242; achter te plakken dan kan je allen de berichten van de persoon met dat ip adres zien en pietje heet.</p>
<p>Om de gegevens in een bepaalde volgorde de plaatsen moet de het onderstaande achter WHERE kolom=&#8217;gegeven&#8217; zetten.<br />
- ORDER BY kolom DESC (voor volgorde op datum van kolom)<br />
- ORDER BY kolom ASC (voor volgorde van alfabetische volgorde van kolom)</p>
<p>vb.</p>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td valign="top">
<pre>001
002
003</pre>
</td>
<td valign="top">
<pre>&lt;?php</pre>
<pre>$select = "SELECT * FROM gastenboek WHERE naam='pietje' ORDER BY kolom DESC";</pre>
<pre>?&gt;</pre>
</td>
</tr>
</tbody>
</table>
<p>Dat was gegevens er uit halen, lijkt me zo ook allemaal duidelijk.</p>
<p><strong>Gegevens veranderen</strong></p>
<p>hier gebruik ik niet helemaal het script voor het gastenboek anders zou het te groot worden (het is al 8 bladzijdes).</p>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td valign="top">
<pre>001
002
003
004
005
006
007
008</pre>
</td>
<td valign="top">
<pre>&lt;?</pre>
<pre>// vebinding maken !!!</pre>
<pre> </pre>
<pre>$update = "UPDATE gastenboek SET bericht ='$nieuw_bericht' WHERE id ='$id'";</pre>
<pre>$query = mysql_query($update) OR die(mysql_error());</pre>
<pre> </pre>
<pre>?&gt;</pre>
</td>
</tr>
</tbody>
</table>
<p>$nieuw_bericht is de nieuwe waarde van bericht.<br />
En dan word gedaan waar id $id is, $id moet is dan meestal een getal.</p>
<p>SET verandert de inhoud van de kolom naar gegeven, je kan meerdere gegevens veranderen door er na AND naam=&#8217;$nieuwe_naam&#8217; aan toe te voegen.</p>
<p>Hier moet je wel WHERE gebruiken anders zou hij alles rijen veranderen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.w3use.nl/php/mysql-met-php.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

