Resources

Lots of resources related to internet applications can be found on the internet. This is a collection of some useful resources.

1. Style Sheets

To have all browser's behave similarly, always use a reset style sheet to remove the browser's default styles. Here is a reset CSS, reset.css.

2. Validators

2.1 W3C HTML Validator

http://validator.w3.org/ Check that your HTML follows the specification.

2.2 W3C CSS Validator

http://jigsaw.w3.org/css-validator/ Check that your CSS follows the specification.

2.3 XML Validator

http://xmlvalidation.com/index.php Checks that an XML document is well-formed and conforms to a schema.

3. Tutorials

There is a lot of online instruction on the different languages covered in this course. Some useful sites are listed here.

3.1 W3Schools

http://www.w3schools.com/ Simple tutorials on all languages covered in the course.

3.2 W3C

http://www.w3.org/community/webed/wiki/Main_Page HTML, CSS and JavaScript resources from the W3C

3.3 PHP Manual at php.net

http://www.php.net/manual/en/ Much more complete than the tutorial at W3Schools.

3.4 Mozilla JavaScript Guides

JavaScript reference, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference

JavaScript guide, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide

3.5 Responsive Web Design

There are many sites with CSS files for responsive design. The chat application uses this, http://www.responsivegridsystem.com/

3.6 Can I use?

http://caniuse.com/ Which browsers support which parts of the HTML, CSS and JavaScript specifications.

3.7 Caching

http://www.mnot.net/cache_docs/ A good overview of how to utilize caches.

https://httpd.apache.org/docs/current/mod/mod_expires.html How to configure Apache to set cache related HTTP headers.

4. Browser Usage Statistics

It is good to know market shares of different browser versions when deciding which browser should be able to display your site. Be aware that such shares vary a lot depending on region and user category. Here are some sites for browser usage statistics.

5. Specifications

https://www.w3.org/TR/CSS/#css CSS specifications.

http://www.w3.org/TR/WCAG10/ Web Content Accessibility Guidelines 1.0

6. Frameworks and APIs

6.1 jQuery

http://jquery.com/ JavaScript API that provides a simpler syntax than plain JavaScript for reading and manipulating HTML elements.

6.2 Knockout

http://knockoutjs.com/ JavaScript framework that manages model-view separation using the MVVM architectural pattern. Such a framework is required by pages that do not reload HTML with hard-coded values but instead update values in the current page.

6.3 id1354-fw

  • id1354-fw-version6.zip Very small PHP framework that manages some tasks common for web projects, namely routing, class loading, HTTP parameters and sessions. The id1354-fw framework also helps give the application a MVC structure. Since the framework is developed for this course, there is not much use to google for help. Instead, a readme file is  included, and you are welcome to post questions and report bugs here on KTH Social.
  • Here is a video tutorial explaining the framework, id1354-fw-tutorial.ogv
  • Here is the program written in the video above, id1354-fw-example.zip

7. Programs

7.1 Web Servers

7.2 IDEs

7.3 Browser Plugins

You need these! It is strongly recommended that you install these plugins, go through some online tutorials and play around a bit to familiarise yourself with them.

7.3.1 Web Developer

https://addons.mozilla.org/en-US/firefox/addon/web-developer/ Firefox Plug-in providing lots of support for HTML, CSS and JavaScript development.

7.3.2 Firefox Developer Tools

Firefox Developer Tools Very useful, for example for writing CSS and for inspecting HTTP requests/responses.

7.4 jsFiddle

http://jsfiddle.net/ Online editor where you can test HTML, CSS and JavaScript.

7.5 JSLint

http://jslint.com/ Online tool for testing JavaScript code quality.

7.6 Evaluate HTTP Response Headers

http://redbot.org/  Evaluates HTTP response headers for servers with a public IP address.

7.7 ApiGen

http://apigen.org/ A tool to generate code documentation for PHP (like Javadoc for Java)

8. Designs

8.1 Test the Application on Different Browsers

http://browsershots.org/ http://turbo.net These sites can be used to test your application in different browsers.

8.2 Responsive Web Design

There are many sites with CSS files for responsive design. The chat application uses this, http://www.responsivegridsystem.com/

8.3 User Interface Guidelines

http://www.nngroup.com/articles/ten-usability-heuristics/ Basic principles for interaction design. Also check http://www.nngroup.com/articles/top-10-mistakes-web-design/ and other lists related to user interface design that are linked from that page.

8.4 Design Templates

Free design templates is a good source of inspiration even if you do not find any appropriate to use.

9. Images and Icons

Some sites with free images and icons.

10. Sample Programs

All zip files below contain a NetBeans project.

10.1 Chat

The following applications are different versions of a simple chat web site.

10.1.1 Seminar One Version

chat-nojs-noserver.zip This application is completely static, it contains only a user interface.

10.1.2 Seminar Two Version

chat-nojs-unstruct-php.zip This application has HTML/CSS user interface and PHP server. The server code is not object-oriented and does not follow MVC or any other architectural pattern. Apart from this, the code is well written.

10.1.3 Seminar Three Versions

10.1.4 Seminar Four Versions

  • chat-jquery-ajax-mvc-php-version2.zip This application has HTML/CSS user interface, JavaScript client-side behaviour and PHP server. The server code follows the MVC pattern.
  • chat-jquery-ko-ajax-id1354fw-version2.zip This application has HTML/CSS user interface, JavaScript viewmodel implemented with the Knockout framework, and PHP server. The server code uses the id1354-fw framework. This program has a bug, a deleted entry disappears only in the browser from which it is deleted. To fix this, clicking the Load Entries button should make the client load not only new entries, but also which entries are deleted.
  • chat-jquery-ko-comet-id1354fw-version4.zip This application has HTML/CSS user interface, JavaScript viewmodel implemented with the Knockout framework, and PHP server. The server code uses the id1354-fw framework. Long polling is used to make the view reflect the server's state. This program has a bug, a deleted entry disappears only in the browser from which it is deleted. To fix this, the long polling request should make the client load not only new entries, but also which entries are deleted.

10.2 Database Access

id1354-php-db-version2.zip A very small program that reads and updates a person database. The program assumes there is already a database called persons.

Teacher Leif Lindbäck created page 31 March 2014

commented 31 August 2015

A tip worth considering adding to resources (for windows):
http://www.uniformserver.com/

"Windows: Apache + MySQL + PHP & more.

The Uniform Server is a lightweight server solution for running a web server under the WindowsOS. Less than 10MiB, it includes the latest versions of Apache2, Perl5, PHP5, MySQL5, phpMyAdmin and more. No installation required! No registry dust! Just unpack and fire up!"

Very easy to get started. Just extract and click the executable, then click "Start apache".

commented 7 September 2015

Hur kan jag testa min sida på modern.ie om den körs lokalt?

Teacher commented 8 September 2015

Ta reda på din ip-adress, till exempel på http://whatismyip.org/ och ange den istället för localhost när du skriver in url:en på modern.ie.

commented 23 September 2015

Hur hanterar man länkar med framework? Dvs hur ska man göra med menyer och länkar till andra sidor?

Teacher commented 23 September 2015

En länk ska innehålla en url som kan tolkas av ramverket och peka ut en fil, klass eller metod enligt ramverkets regler. Om du till exempel i chat-programmet med id1354-fw vill göra en länk till sidan med hela konversationen, ska länken peka på Chat/GetEntries

commented 23 September 2015

Är det fel på koden eller på min server?
Jag laddade ner chat-nojs-id1354fw.zip packade upp sedan försökte jag använda den. När jag skriver in ett användarnamn och sedan trycker OK 
får jag
Internal Server Error.

Id1354fw\Core\InternalServerErrorException: Function Chat\DefaultRequestHandler->setNickName is missing, but request has parameter nickName

#0 <SÖKVÄG>\chat-example\chat-nojs-id1354fw\classes\Id1354fw\View\AbstractRequestHandler.php(38): Id1354fw\View\AbstractRequestHandler->validateFuncName('setNickName', 'nickName')
#1 <SÖKVÄG>\chat-example\chat-nojs-id1354fw\classes\Id1354fw\View\AbstractRequestHandler.php(61): Id1354fw\View\AbstractRequestHandler->setParams()
#2 <SÖKVÄG>\chat-example\chat-nojs-id1354fw\classes\Id1354fw\Core\Router.php(89): Id1354fw\View\AbstractRequestHandler->execute()
#3 <SÖKVÄG>\chat-example\chat-nojs-id1354fw\classes\Id1354fw\Core\Start.php(80): Id1354fw\Core\Router->routeRequest() 
#4 <SÖKVÄG>\chat-example\chat-nojs-id1354fw\classes\Id1354fw\Core\Start.php(60): Id1354fw\Core\Start->routeRequest() 
#5 <SÖKVÄG>\chat-example\chat-nojs-id1354fw\index.php(38): Id1354fw\Core\Start->startFramework() #6 {main}

commented 23 September 2015

Hej!

Jag har också problem med chat-nojs-id1354fw.zip. Får en blank sida och i loggen följande meddelande:

[:error] [pid 4232:tid 1864] [client ::1:61329] PHP Parse error:  syntax error, unexpected 'finally' (T_STRING), expecting catch (T_CATCH) in <SÖKVÄG>\\chat-nojs-id1354fw\\classes\\Id1354fw\\Core\\ClassLoader.php on line 104

Använder Uniserver.

commented 23 September 2015

@Martin Soto
Jag vet inte vad ditt felmeddelande betyder men det skulle kunna vara att du har fel PHP version aktiverad. För ramverket var det krav att använda som minst PHP version 5.5.

Här kan du läsa hur man byter PHP version på UniformServer 

Här kan du ladda ner olika versioner av php

Sen får du packa upp de till UniformServer mappen. Starta UniForm, välj version, starta Apache.

Testa det, om du har fel version.

commented 23 September 2015

Snyggt!

Jag hade 5.4 och nu uppgraderade jag till 5.6. Sidan kommer upp men nu har jag istället samma fel som du :-)

Tack för hjälpen!

commented 23 September 2015

Kul att det löste sig! :-)
Kan någon som använder en annan lösning än Uniform kanske kan ge input på hur chat-nojs-id1354fw fungerar för er?


Teacher commented 24 September 2015

Det kan bero på att ni har fel katalogstruktur. Katalogen chat-nojs-id1354fw ska ligga direkt i webserverns rotkatalog. I chat-nojs-id1354fw ska följande filer och kataloger finnas:

  • classes
  • conversation.txt
  • index.php
  • resources
  • views
  • .htaccess
commented 24 September 2015

När vi försöker logga in med ett användarnamn kommer vi till sidan localhost/chat-nojs-id1354fw/Chat/Login som inte hittas. Detta då katalogen ligger i root för webservern.

Teacher commented 24 September 2015

Det verkar som requestet inte har nått index.php, och därmed inte hanteras alls av ramverket. Kolla om filen .htaccess finns i katalogen chat-nojs-id1354fw. Det är den som säger åt apache att skicka alla request till index.php istället för till den angivna url:en.

.htaccess ska ha detta innehåll:

Options All -Indexes

<FilesMatch "(config|.+\.html)\.php">
    deny from all
</FilesMatch>

<IfModule mod_rewrite.c>
    RewriteEngine on

    RewriteCond %{REQUEST_URI} !\.(bmp|cgi|css|flv|gif|ico|jpe?g|js|png|html|php|swf|xml)$
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule (.*) index.php [L,QSA]
</IfModule>

Teacher commented 24 September 2015

Det kan också vara så att apache inte läser .htaccess. Kolla till exempel på http://tildemark.com/enable-htaccess-on-apache/ för att se hur det kan åtgärdas.

commented 24 September 2015
  • Jag skickas till url "http://localhost/Chat/Login"
  • Jag har samma .htaccess som du skriver Leif.
  • Jag ha kollat att alla filerna som du nämnde finns. Förutom conversation.txt
  • Jag har kontrollerat att modulen mod_rewrite är igång
  • Jag har tittat så att mod_rewrite inte är kommenterad i httpd.conf
  • Jag har testat att köra ett simpelt .htaccess exempel (se nedan), den fungerade

Här exemplet jag testade (källa: http://www.workingwith.me.uk/articles/scripting/mod_rewrite )

A simple mod_rewrite example

So, let’s write a simple mod_rewrite example. This isn’t going to be anything fancy; we’re just going to redirect people who ask for alice.html to the pagebob.html instead. First, let’s create the Alice and Bob pages. Below is Alice’s webpage - create a similar one for Bob.

<html>
   <head>
      <title>Alice's webpage</title>
   </head>
   <body>
      <p>
         This is Alice's webpage
      </p>
   </body>
</html>

Upload both of these to your web server, and check that you can view both of them. Now comes the fun - we’re going to add a couple of lines to your .htaccess file. The .htaccess file is a text file which contains Apache directives. Any directives which you place in it will apply to the directory which the .htaccess file sits in, and any below it. To ours, we’re going to add the following:

RewriteEngine on
RewriteRule ^alice.html$ bob.html

Upload this .htaccess file to the same directory as alice.html and bob.html, and reload Alice’s page. You should see Bob’s page being displayed, but Alice’s URL. If you still see Alice’s page being displayed, then check you’ve followed the instructions correctly (you may have to clear your cache). If things still aren’t working for you, then contact your technical support people and ask them to enable mod_rewrite and the FileInfo override in their httpd.conf file for you

Teacher commented 25 September 2015

Nu har jag sett att det funkar på mac och linux, men det verkar som alla med windows har problem. Om någon kör windows och det funkar, kan inte den tala om vad som krävdes för att få igång det? Säg gärna också vilken server  (uniformserver eller någon annan) det funkar på.  Det vore också bra om någon med problem på windows kan tala om ifall det står något felmeddelande i error.log

commented 25 September 2015

Hej! För er som använder Mac och inte fått fw att funka kommer det förslag på hur ni kan göra. Jag använder Macs inbyggda apache server och jag kunde komma åt index sidan, matade in nickname, men mitt problem var att jag aldrig kom till log-in-sidan, utan fick ett felmeddelande som talade om att det inte gick att hittta URLet. Lyckligtvis funkade det för mig efter följande åtgärder:

 I filen /etc/apache2/httpd.conf, aktivera den bortkommenterade raden:

LoadModule rewrite_module libexec/apache2/mod_rewrite.so

I samma fil, längre ner har vi taggen <Directory/>. Där ska man ha följande rader:

<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>

Observera att ytterligare rader som är förslagna i URLet: http://tildemark.com/enable-htaccess-on-apache/ kan orsaka problem:

 I serverns root directory, se till att attributet med AllowOverride är satt till all, och inte none.

 Kommentera bort sista raden i samma element där det står "Required all granted". Vet inte riktigt om den raden har påverkan eller ej, men det visade sig fungera med den bortkommenterad. Elementet ska, alltså, se ut så här:

 

<Directory "/väg/till/server-root/directory">
.
.
.
AllowOverride all
.
.
# Required all granted
</Directory>

 Se också till att du har gömda filen .htaccess i samma mapp där du tänker implementera ditt projekt, alltså i samma mapp där index.php ligger.

Om det fortfarande är problematiskt så kan ni kolla att ni har rätt behörighet på alla filer och mappar. Projektmappen ska gå att exekvera och index.php ska gå att läsa.

 Innehållet i .htaccess ska se ut så här:

 Options All -Indexes
<FilesMatch "(config|.+\.html)\.php">
       deny from all
</FilesMatch>
<IfModule mod_rewrite.c>
       RewriteEngine on
       RewriteCond %{REQUEST_URI} !\.(bmp|cgi|css|flv|gif|ico|jpe?g|js|png|html|php$
       RewriteCond %{REQUEST_FILENAME} !-f
       RewriteCond %{REQUEST_FILENAME} !-d

       RewriteRule (.*) index.php [L,QSA]
</IfModule>

commented 26 September 2015

Jag förstår inte riktigt det här med länka till andra views, har suttit och testat en rad olika grejor men ingenting fungerar som det ska. Det jag kommit fram till är att länka till en klass som extends AbstractRequestHandler och innehåller en doExecute() som bara returnernar Constans::SIDAN_JAG_VILL_TILL;

Så från startsidan kan jag ta mig till Calendar genom att länka till TastyRecipes/Model/Calendar där Calendar klassen tar mig till calendar view. Nu har min URL gått från http://localhost:8888/TastyRecipesRoot/ till http://localhost:8888/TastyRecipesRoot/TastyRecipes/Model/Calendar

När jag väl är inne på calendar och vill gå till pancakessidan så gör jag samma grej, länkar till en Pancakes klass som sen tar mig till pancakes view och det är här det slutar fungera. Min URL blir nu http://localhost:8888/TastyRecipesRoot/TastyRecipes/Model/TastyRecipes/Model/Pancakes vilket inte leder någonstans alls och jag tas tillbaka till startsidan.

Teacher commented 28 September 2015

För det första är det ingen bra idé att lägga klassen med doExecute i model. Den bör ligga i View eftersom den tar emot ett http-anrop och ska anropa controllern. Ett annat alternativ, som jag använt i chat-exemplet, är att lägga den direkt i namnrymden Chat. Det gjorde jag för jag tyckte inte det såg snyggt ut att serverns lager (View, Model osv) ingår i url:en.

Ovanstående löser inte ditt problem, som för övrigt är ett typiskt problem oavsett ramverk, nämligen hur man ska ge en url som pekar in i ramverket till en nyanländ användare. Jag föreslår att du skriver en DefaultRequestHandler som bara innehåller raden \header("Location: <path to the welcome page in tasty recipies>");
Den raden kommer redirecta användaren till din förstasida, inklusive rätt url. Om du redirectar till sidan
/TastyRecipiesRoot/TastyRecipes/Model/Calendar kommer url:en bli  
http://localhost:8888/TastyRecipesRoot/TastyRecipes/Model/Calendar

Då kan du i alla sidor ange sista delen av url:en (Calendar, Pancakes, etc) som länk.

Teacher commented 28 September 2015

Nu har jag fixat buggen som gjorde att chatten med ramverket inte fungerade på windows. Det var förstås en slash som var vänd åt fel håll, mycket dålig idé att provköra bara på linux...

För säkerhets skull har jag börjat med versionsnumrering. Det  är chat-nojs-id1354fw-version2.zip och id1354-fw-version2.zip som fungerar.

commented 28 September 2015

Ändrade min DefaultRequestHandler's doExecute till bara \header("Location: views/login"); och nu blir det en oändlig loop av redirects och safari visar det här felmeddelandet.

Safari felmeddelande

Teacher commented 28 September 2015

Det går tyvärr inte att redirecta till en relativ url. Du måste ha med hela sökvägen från roten: 
\header("Location: /TastyRecipiesRoot/TastyRecipes/views/login")
Egentligen ska du till och med ta med "http://localhost:8888" först i url:en, men ovanstående brukar fungera bra.

För övrigt ska du inte redirecta till en fil i mappen views. Alla klasser, även de som ärver AbstractRequestHandler, måste ligga under classes.

commented 1 October 2015

Om man har en klass Login som ligger under classes/TastyRecipes/Login.php och som anropas av ramverket för att sköta inloggningen och sedan returnera namnet på nästa vy som ska visas t.ex. "start" så kommer rätt sida visas men via URL <domain>/ID1354-website/TastyRecipes/Login istället för <domain>/ID1354-website/TastyRecipes/Start. Eftersom jag kommer till vyn via Login.php istället för klassen Start.php så är inte alla variablar satta vilket gör att sidan inte innehåller allt den ska.

Hur kan man lösa det så att Start.php anropas efter att Login.php är klar istället för att bara returnera vyn "start" från Login.php?

commented 1 October 2015

om jag har förstått rätt så kan du använda addVariable för att lösa det problemet. Läs README.txt.

commented 1 October 2015

Det fungerar inte att använda addVariable i Login.php eftersom vilka variabler jag ska lägga till kan variera beroende på vilken vy jag loggar in från. Dessutom vill jag komma ifrån att URLn slutar på /TastyRecipes/Login istället för exempelvis /TastyRecipes/Start ifall jag loggar in från startsidan.

Teacher commented 2 October 2015

Kan du inte göra en ny klass som innehåller koden som är gemensam för Login och Start? Då kan den anropas av både Start och Login. Det är sällan en bra idé att lita på url:en, det blir väldigt svårt att förhindra att du kan komma olika vägar till en och samma request handler.

commented 2 October 2015

Blir inte det dålig sammanhållning samt om man ska kunna logga in från varje sida så behöver det finnas en klass för gemensam kod mellan start och login, en klass för gemensam kod mellan login och calendar, etc ?

Går det inte på någon sätt att låta klassen Login kalla på Start eller vilken annan vy man kommer ifrån så att sidan laddas på rätt sätt och sedan returnera det till ramverket?

Teacher commented 2 October 2015

Jag tycker inte det blir dålig sammanhållning, det blir bara en till klass i vyn (klassen med den gemensamma koden). Måste du verkligen ha en ny klass för varje kombination av nu existerande klasser, räcker det inte med en enda (eller i alla fall ett fåtal) ny klass som innehåller all gemensam kod från alla request handlers?

Det går förstås att göra som du föreslår också, i sådana fall skriver du helt enkelt new Start() i Login och anropar sedan metoder i Start-objektet. Jag är dock mer tveksam till den lösningen eftersom klasser som ärver request handler är avsedda att ta emot http-anrop, inte att anropas lokalt. Det skulle säkert funka att göra så, men det känns som det blir onödigt svårförstådd kod på det viset (eftersom request handlern Start anropas på "fel sätt").

commented 3 October 2015

Om jag förstått ditt problem rätt kan du testa redirecta till Start-klassen i slutet av din Login-klass med \header(<domain>/ID1354-website/TastyRecipes/Start) istället för att använda return. Då körs Login-klassen och sedan Start-klassen om that makes sense. Alltså kommer alla variabler som läggs till i Login och även Start ha lagts till. Dessutom kommer URLn sluta på Start istället för Login. 

Philippe Tillheden removed his/her comment
commented 3 October 2015

Jag får inte ctype_print till att fungera på saker som skickats genom $_POST
T.ex om jag skriver name\n\t\r så ska den ju bli false efter ctype_print har gjort sin grej men den blir true...
Testa gå in på hemsidan http://phpfiddle.org och kör följande kod för att se vad jag menar

<html> 
<body> 
        <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>"> 
                Name: <input type="text" name="name" value="asdf\n\r\t"> 
                <input type="submit"> 
        </form> 

<?php 
        if (isset($_POST['name'])) {
                echo "ctype_print på _POST som borde bli false: ";
                $name = $_POST['name']; 
                if (ctype_print($name)) { 
                        echo "True";
                } else { 
                        echo "False"; 
                }
                
                echo "<br>"; 
                
                echo "ctype_print på asdf\n\r\t som borde bli false: ";
                $name = "asdf\n\r\t";
                if (ctype_print($name)) { 
                        echo "True"; 
                } 
                else { 
                        echo "False"; 
                } 
        }
?>
</body>
</html>

commented 4 October 2015

Interesting problem, I don't know the hard facts but when trying this code:

<!-- START  -->

<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="name" value="asdf\n\r\t">
<input type="submit">
</form>
<?php
if (isset($_POST['name'])) {
$trueMsg = "True (only printable characters)";
$falseMsg= "False (contains non-printable characters)";

echo '<h2>ctype_print - Check for printable character(s)</h2>';
$name = $_POST['name'];
echo $name . ': ';
echo ( ctype_print($name) ? $trueMsg : $falseMsg );

echo "<br /><br />";

$name = "asdf\n\r\t";
echo $name . ': ';
echo ( ctype_print($name) ? $trueMsg : $falseMsg );

echo "<br /><br />";

$name = 'asdf\n\r\t';
echo $name . ': ';
echo ( ctype_print($name) ? $trueMsg : $falseMsg );
}
?>
</body>
</html>

<!-- END -->

I also came to the conclusion that the php $_POST field must use single quoted strings, which means that all characters which are will be treated as the literal character. I you check the last assignment of name you can see that I use single quotes. This will give the same result as the $_POST['name']

Read more about difference between single quoted and double quoted strings here

This might be due to Magic Quotes which in short escapes incoming data to the PHP script.
Here you can read about Magic Quotes 

The odd thing is that Magic Quotes should've been removed. At the moment I am using PHP 5.5. But the $_POST field is still escaped and not treated as partly non-escapable characters. 

I tried to find a setting for the Magic Quotes on my server but was unable to find it.

Maybe it has something to do with how you set the value of the form. If you replace the value with
value='<?="asdf\n\r\t"?>'
Then the characters which are set to the value is asdf  (plus additional characters) 
This will infact generate a False, it will contain non-printable characters.

So all in all it seems that the problem is with how you set the value.
It might be some feature of HTML to literally interpret what is set to the value.

Feedback News