How to fix “Headers already sent” error in PHP does not solve the issue because I'm not getting any headers set error.
The cookie is being set, the problem is the link going to main page ('/'). It does not seem to go to the main page anymore and even on the trace logs, I do not see entries that spash.php is being reloaded.
Its almost like after redirection from index.php (when typing http://domain), the browser/server recognizes http://domain/splash.php as the main page.
PHP Version: 7.0.22
Apache Version: 2.4.27
OS: linux
I have 2 pages, index.php and spash.php.
index.page checks first for authenticated cookie. If false or not found, page redirects to splash.php
spash.php then sets the authenticated cookie and have anchor tag with "/" href value.
But after clicking the link button, the page only reloads spash.php.
I added trace error_logs on the 2 pages, from the logs, I can see that on first load, it passes through the index.php page, then loads the spash.php page but after that even after multiple clicks on the link button, no logs that accesses the index.php page anymore.
here is my code:
index.php
<?php if(!isset($_COOKIE['authenticated'])){
error_log("This is Index, Redirect to Splash Page");
header("Location: /splash.php" );
die();
exit();
}else{
echo "meron";
}
?>
<html>
<head>
<title>Index Page</title>
</head>
<body>
<h1>Hello</h1>
<?php var_dump($_COOKIE); ?>
</body>
</html>
splash.php
<?php setcookie('authenticated', 1, 0, '/');
error_log("This is Splash, set the cookie");
echo $_SERVER['SCRIPT_FILENAME'];
?>
<html>
<head>
<title>Splash Page</title>
</head>
<body>
GO!
</body>
</html>
NOTE:
After loading the splash page, if i type [domain]/index.php, I get to see the main page.
This issue only happens on the host, tried the code locally, everything works
If I change the href of the link button from spash.php (GO!), it is working. But I need that value to be just the domain.
When you are using header location, there should not be any echo or space before.
OK I found an Indirect solution.
Instead of handling the redirection from the server-side code (PHP) I used javascript and now its working.
see updated code below:
index.php
<html>
<head>
<title>Index Page</title>
<script>
document.addEventListener('DOMContentLoaded', onLoad());
function onLoad(){
if(getCookie('astig') == ''){
window.location.href = "/splash.php";
}
}
function getCookie(cname) {
var name = cname + "=";
var decodedCookie = decodeURIComponent(document.cookie);
var ca = decodedCookie.split(';');
for(var i = 0; i <ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}
</script>
</head>
<body>
<h1>Hello</h1>
<?php var_dump($_COOKIE); ?>
</body>
spash.php
<html>
<head>
<title>Splash Page</title>
<script>
document.addEventListener('DOMContentLoaded', onLoad());
function onLoad(){
document.cookie = "astig=true;0;path=/";
}
</script>
</head>
<body>
GO!
</body>
Got the solution from the hosting provider's support.
He disabled the mod expires caching. So now I can have the redirection through pure server-side script.
Just not sure what the overall effect of this option and which approach would be better.
re this post AJAX Post to self in PHP
When using exit() doesn't something have to be printed before this call?
I have written markup/ph with references to external css php scripts. The script uses print (or echo) and a
call to header('type: text/css'). Isn't this useful or necessary in self processing php pages? I find
them endlessly useful. A whole site can be displayed in any state by one page using get queries and posts
from forms. I remember the text I was reading early on when beginning to learn php asserted that when
the page submits to itself, the browser will automatically use asynchronous requests. But in certain situations
an explicit ajax call is useful.
Here is what I am doing and what I am trying to do.
I have a text field and a button in a page
I write text to the text field and click the button
The javascript click event handler for the button gets the text field value
and appends it to a get query attached to the url in the request. The method is get
edit: to specify the environment in which this has been successful.
I am using Firefox v12.0 On Mac OSX with pre-installed apache server on local machine.
(anyone with a Mac running OSX, there is a pre installed apache server, but activating php requires
editing the httpd.com file to un comment the line(s) that load the php module. Also, there is a line
that tells Apache what extensions to use to look for and execute php code. You also must tell it
to take index.php as an index file to run the php in it and have it act as a directory index file)
the javascript code:
function _FETCH()
{
this.init = function(oName, elem, txt)
{
var but = document.getElementById(elem);
but.addEventListener('click', function(){ oName.req('GET', self, '', null, oName, txt) } )
}
this.req = function(method, url, type, msg, oName, txt)
{
var field = document.getElementById(txt);
url+="?ajxTst="+encodeURIComponent(field.value);
var it = new XMLHttpRequest();
it.open(method, url, type);
it.setRequestHeader('Content-Type', 'text/plain');
it.onreadystatechange = function()
{
var elem = document.getElementById('well');
switch(it.readyState)
{
case 0:
case 1:
break;
case 2:
case 3:
elem.childNodes[0].data = " waiting";
break;
case 4:
oName.handleResponse(it.responseText);
break;
default:
alert('ajax processing error');
break;
}
}
it.send(msg);
}
this.handleResponse = function(resp)
{
var elem = document.getElementById('well');
elem.childNodes[0].data = " "+resp;
}
}
The php, javascript and markup in the page:
<?php
/*
created 11/4/2014
*/
$_self = basename($_SERVER['PHP_SELF']);
if($_POST || $_GET)
{
if($_GET['ajxTst'])
{
header("Content-Type: text/plain");
print $_GET['ajxTst'];
exit();
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>JS lab 2</title>
<link rel="stylesheet" type="text/css" href="local.css" media="screen" />
<script type="text/javascript" src="local.js">
</script>
<script type="text/javascript">
//<![CDATA[
var self = "<?php print $_self; ?>";
window.onload = function()
{
var ajx = new _FETCH();
ajx.init(ajx, 'send', 'tlk');
}
//]]>
</script>
</head>
<body>
<div class="panel">
<p class="title">Js Lab 2</p>
<p class="norm">Lab 3 home</p>
<p class="norm">Work with ajax and self processing page (this)</p>
<hr />
<p class="norm" id="well"> idle </p>
<p class="norm">
<input type="text" id="tlk" value="" /><input type="button" id="send" value="send" />
</p>
</div>
</body>
</html>
I hope That someone looking for this will find it. It took me a while to get it right
Consider an AJAX call that writes to a div:
recent_req=$.post('result.php', { d: data }, function(returnData) {
$('#content').html(returnData);
});
The PHP script at result.php performs some functions that take time, about 5-20 seconds per step. I am using PHP's flush() function to get the info to the browser as soon as each step starts and ends, but how can I get the Javascript to write the data to the #content div as it comes in?
Thanks.
EDIT:
To clarify: Assume result.php looks like the following and due to constraints cannot be practically refactored:
<?php
echo "Starting...<br />";
flush();
longOperation();
echo "Done with first long operation.<br />";
flush();
anotherLongOperation();
echo "Done with another long operation.<br />";
flush();
?>
How might the AJAX be structured to call result.php such that the echo statements are appended to the #content div as they come in? Any solution with / without jQuery is welcome. Thanks!
There's a technique using an iframe which you could use to achieve this.
Similar to other suggestions involving frames but it doesn't involve sessions or polling or anything, and doesn't need you to display the iframe itself. It also has the benefit of running any code you want at any point in the process, in case you're doing something more sophisticated with your UI than just pushing text to a div (e.g. you could update a progress bar).
Basically, submit the form to a hidden iFrame then flush javascript to that frame, which interacts with functions in the iFrame's parent.
Like this:
HTML:
<form target="results" action="result.php" method="post">
<!-- your form -->
<input type="submit" value="Go" />
</form>
<iframe name="results" id="results" width="0" height="0" />
<div id="progress"></div>
Javascript, in your main page:
function updateProgress(progress) {
$("#progress").append("<div>" + progress + "</div>");
}
result.php:
<?php
echo "<script language='javascript'>parent.updateProgress('Starting...');</script>";
flush();
longOperation();
echo "<script language='javascript'>parent.updateProgress('Done with first long operation.');</script>";
flush();
anotherLongOperation();
echo "<script language='javascript'>parent.updateProgress('Done with another long operation.');</script>";
flush();
?>
You cannot 'stream' data using regular ajax calls, for you can't make your user's browser 'listen' to server requests. Your 'success' function will only be called when data's done processing.
There's, though, much discussion on 'Ajax Push' on the internet and apparently HTML5 has websocket objects that can be used to make your user's browser listen to server requests. The syntax definition is not quite stable yet, so you don't want to mess with it, as it may change soon.
What you may want to do is dispatch a request for step1, wait for its return and then dispatch a request for step2. It'll add some overhead to your overall processing time (and will make it much more verbose), but it should work fine if you only have a few big steps. If your steps don't take too much processing, you shouldn't do it (as the communication time will become greater than your 'effective processing time').
EDIT: What you can also do is write the progress on the user's session, for example. That way, you can periodically ping the server with a request for an update on the status. This way, even if you have many small steps, you'll only have to dispatch requests every 10 seconds or so, that being an improvement over dispatching for every step.
As an alternative solution, you could submit a hidden form into an iframe, as shown in the following example:
<?php
function output_data($data) {
echo str_pad($data, 4096, ' ', STR_PAD_RIGHT) . "\n";
flush();
}
function long_runner() {
output_data("");
output_data(date("H:i:s").' - Starting...<br />');
sleep(10);
output_data(date("H:i:s").' - Done with first long operation.<br />');
sleep(10);
output_data(date("H:i:s").' - Done with another long operation.<br />');
return("<script>parent.task_complete()</script>");
}
if (isset($_REQUEST["status"])) {
die(long_runner());
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Write to IFRAME as data streams in</title>
<style>
#myform { display: none }
#frm { width: 50% }
</style>
<script language="javascript" type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script>
function task_complete() {
alert('Task completed');
}
$(document).ready(function() {
$('#starter').click(function() {
$('#myform').submit();
});
});
</script>
</head>
<body>
<form id="myform" method="get" target="frm" action="<?= $_SERVER['SCRIPT_NAME'] ?>">
<input type="hidden" name="status" value="0">
</form>
Start<br />
<iframe id="frm" name="frm" frameborder="0"></iframe>
</body>
</html>
Writing a dynamic data stream to a div:
Here goes.. you asked specifically how to dynamically write data streams to a "div". As many have said it is possible to write dynamically to an iframe and we just need to go one step further. Here is a complete solution to your issue, which will bring that data back to your div with a maximum delay of .5 seconds. It can be adapted if you need a more prompt update.
<!DOCTYPE html>
<html>
<head>
<title>dynamic listener</title>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script type="text/javascript">
var count;
$(function(){
$('#formx').submit(function(){
setTimeout(function(){ check_div(); }, 500);
count = 0;
return true;
});
});
function check_div()
{
var $iframetxt = $('#iframex').contents().text();
var $div = $('#dynamic');
if( $iframetxt != $div.text() )
{
console.log('rewritten!');
$div.text( $iframetxt );
setTimeout(function(){ check_div(); }, 500);
count = 0;
}
else
{
count++;
if(count < 40) setTimeout(function(){ check_div(); }, 500);
else console.log('timed out');
}
}
</script>
</head>
<body>
<div>
Form
<form id="formx" action="result.php" method="post" target="iframex">
<input type="submit" />
</form>
</div>
<div id="dynamic"></div>
<iframe id='iframex' name="iframex" style="display:none" ></iframe>
</body>
</html>
1. On form submit, the streaming data is sent to the iframe.
For this we just set the target attribute in the form tag to the iframe name.
2. check_div() runs every .5 seconds to compare the text of #dynamic div to the text contents of the iframe.
If there is a difference between them, the data is written to the div and the timeout is called again. If there is no difference, the timeout counter increments. If the count is less than 40 (40 x .5 sec = 20 seconds), it calls the timeout again. If not, we assume the stream has completed.
Here is a solution using polling with a session:
HTML:
<!DOCTYPE html>
<html>
<body>
<div id="content"></div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script>
var pollTimeout;
function pollResult(){
$.get('poll.php', function(response) {
// Update #content with partial response
$('#content').html(response);
pollTimeout = setTimeout(pollResult, 1000);
});
}
$.post('result.php', function(response) {
// Result is loaded, stop polling and update content with final response
clearTimeout(pollTimeout);
$('#content').html(response);
});
// Start polling
pollResult();
</script>
</body>
</html>
Result PHP:
<?php
class SemiStream{
public function __construct(){
#session_start();
$_SESSION['semi_stream'] = '';
}
public function write($data){
#session_start();
$_SESSION['semi_stream'] .= $data;
// We have to save and close the session to be
// able to read the contents of it in poll.php
session_write_close();
}
public function close(){
echo $_SESSION['semi_stream'];
unset($_SESSION['semi_stream']);
}
}
$stream = new SemiStream();
$stream->write("Starting...<br />");
sleep(3);
$stream->write("Done with first long operation.<br />");
sleep(3);
$stream->write("Done with another long operation.<br />");
$stream->close();
echo 'Done.';
Poll PHP:
<?php
session_start();
echo $_SESSION['semi_stream'];
This works, without the use of PHP's output buffering.
Check out the Pusher service, seems like it could do exactly what you want: http://pusher.com/
Probably, the question is about how to implement Push technology in your app. I would suggest you to look this question which has great answer with example
How to append to textarea with PHP and then refresh the textarea?
THANK YOU
edit:
It should be server triggered from PHP code
The simplest approach would be to have a javascript function that polls the php script using ajax - say every 10 seconds. You could add a timestamp as a parameter to the php function so it only returns the latest log entries.
When the ajax call returns you can append the resulting text to your textarea using javascript.
I could fish out some sample code if you like?
So, here's an HTML file - it has a function to make an AJAX call to a script - log.php that returns some stuff (in this example it's a very simple line of text) and then append this to the text area.
When the script loads we set up a timer to fire every 1000 milliseconds (obviously change this according you your needs).
We've also got a "cancel updates" function and a "start updates".
So - put the html file and the php file (which you need to call log.php - or call it what you like and change the code) into the same directory on your web server and see what happens!.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript">
var http = createRequestObject();
var updateInt=self.setInterval("updateLog()",1000);
function startAutoUpdate(){
if(updateInt==""){
updateInt=window.setInterval("updateLog()",1000)
}else{
stop_Int()
}
}
function stopAutoUpdate(){
if(updateInt!=""){
window.clearInterval(updateInt)
updateInt=""
}
}
function createRequestObject() {
var objAjax;
var browser = navigator.appName;
if(browser == "Microsoft Internet Explorer"){
objAjax = new ActiveXObject("Microsoft.XMLHTTP");
}else{
objAjax = new XMLHttpRequest();
}
return objAjax;
}
function updateLog(){
http.open('get','log.php');
http.onreadystatechange = updateNewContent;
http.send(null);
return false;
}
function updateNewContent(){
if(http.readyState == 4){
document.getElementById('log').innerHTML = document.getElementById('log').innerHTML + http.responseText;
}
}
</script>
</head>
<body>
<h2>Log</h2>
<textarea cols="80" rows="10" name="log" id="log"></textarea>
<span onclick="updateLog()">Update</span><br>
<span onclick="stopAutoUpdate()">Cancel Auto Update</span><br>
<span onclick="startAutoUpdate()">Start Auto Update</span><br>
</body>
</html>
Here's the php script (very simple)...
<?PHP
/* Log responder script
*
* When invoked this script returns log entries
* as this is a sample it just returns a couple of random items
*
*/
echo "Log Entry ".date("d/m/y h:i:s")."\n";
?>
Is there a way to check if JavaScript is enabled with PHP? If so, how?
perhaps a more simple option...
<html>
<head>
<noscript>
This page needs JavaScript activated to work.
<style>div { display:none; }</style>
</noscript>
</head>
<body>
<div>
my content
</div>
</body>
</html>
No, that is not possible, because PHP is a server side language, it does not access the client's browser in any way or form (the client requests from the PHP server).
The client may provide some meta info through HTTP headers, but they don't necessarily tell you whether the user has JavaScript enabled or not and you can't rely on them anyway,
Technically no because as the other answers have said, PHP is strictly server-side, but you could do this...
In the PHP page on the server, output (a lot of HTML has been deleted for brevity)
<html>
<head>
<script type="text/javascript" src="jquery1.4.4.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$.get("myPage.php");
});
</script>
</head>
</html>
Then in myPage.php set a session variable to indicate the client supports JS
<?php
session_start();
$_SESSION['js'] = true;
?>
But really, just use <script></script><noscript></noscript> tags, much, much less effort...
//Here is a solution:
//it works perfect
<?php
if(!isset($_SESSION['js'])||$_SESSION['js']==""){
echo "<noscript><meta http-equiv='refresh' content='0;url=/get-javascript-status.php&js=0'> </noscript>";
$js = true;
}elseif(isset($_SESSION['js'])&& $_SESSION['js']=="0"){
$js = false;
$_SESSION['js']="";
}elseif(isset($_SESSION['js'])&& $_SESSION['js']=="1"){
$js = true;
$_SESSION['js']="";
}
if ($js) {
echo 'Javascript is enabled';
} else {
echo 'Javascript is disabled';
}
?>
//And then inside get-javascript-status.php :
$_SESSION['js'] = isset($_GET['js'])&&$_GET['js']=="0" ? "0":"1";
header('location: /');
You can't tell if a browser has JS enabled, but you can tell if the browser supports JS http://php.net/manual/en/function.get-browser.php
$js_capable = get_browser(null, true)=>javascript == 1
Having said this, that's probably not of much use. You should reconsider detecting JS from PHP. There should be no need for it if you use progressive enhancement, meaning that JS only adds functionality to what's already on the page.
<noscript>
<?php if(basename($_SERVER['REQUEST_URI']) != "disable.html"){ ?>
<meta http-equiv="Refresh" content="0;disable.html">
<?php } ?>
</noscript>
Place above code in your header file after title tag and set appropriate like[disable.html] for redirection.
before try you have to disable your browsers javascript...
after then
Try This code :
<html>
<head>
<noscript><meta http-equiv="refresh"content="0; url=script-disabled.html">
</noscript>
<h1>congrats ! Your Browser Have Java Script Enabled </h1>
</head>
</html>
Write something in script-disabled.html
its work
You can try with 2 metod:
setting cookies with JS and detecting them from PHP
creating a form with a hidden field and an empty value; and then assigning some value to it with JS, if the field gets the value – JS is ON, otherwise it’s off. But the form had to be submitted first before PHP can request that hidden field’s value.
if you want detect if JS enable enable setting before the loading of the page you can try this (I don't konw if it works):
<?php
if (isset($_POST['jstest'])) {
$nojs = FALSE;
} else {
// create a hidden form and submit it with javascript
echo '<form name="jsform" id="jsform" method="post" style="display:none">';
echo '<input name="jstest" type="text" value="true" />';
echo '<script language="javascript">';
echo 'document.jsform.submit();';
echo '</script>';
echo '</form>';
// the variable below would be set only if the form wasn't submitted, hence JS is disabled
$nojs = TRUE;
}
if ($nojs){
//JS is OFF, do the PHP stuff
}
?>
there is a fine tutorial on this issue on address http://www.inspirationbit.com/php-js-detection-of-javascript-browser-settings/
Here is a small include I made up that I have on top of my pages to detect if js is enabled. Hope this helps out...
<?php
//Check if we should check for js
if ((!isset($_GET['jsEnabled']) || $_GET['jsEnabled'] == 'true') && !isset($_SERVER['HTTP_X_REQUESTED_WITH'])){
//Check to see if we already found js enabled
if (!isset($_SESSION['javaEnabled'])){
//Check if we were redirected by javascript
if (isset($_GET['jsEnabled'])){
//Check if we have started a session
if(session_id() == '') {
session_start();
}
//Set session variable that we have js enabled
$_SESSION['javaEnabled'] = true;
}
else{
$reqUrl = $_SERVER['REQUEST_URI'];
$paramConnector = (strpos($reqUrl, "?"))? "&" : "?";
echo "
<script type='text/javascript'>
window.location = '" . $reqUrl . $paramConnector . "jsEnabled=true'
</script>
<noscript>
<!-- Redirect to page and tell us that JS is not enabled -->
<meta HTTP-EQUIV='REFRESH' content='0; " . $reqUrl . $paramConnector . "jsEnabled=false'>
</noscript>
";
//Break out and try again to check js
exit;
}
}
}
?>
<html>
<head>
<?php
if(!isset($_REQUEST['JS'])){?>
<noscript>
<meta http-equiv="refresh" content="0; url='<?php echo basename($_SERVER['PHP_SELF']);?>?JS='"/>
</noscript><?php
}
?>
</head>
<body>
<?php
if(isset($_REQUEST['JS'])) echo 'JavaScript is Disabled';
else echo 'JavaScript is Enabled';
?>
</body>
</html>
PHP can't be used to detect whether javascript is enabled or not. Instead use <noscript> to display an alternate message / do something.
To get rid of bots with JS disabled:
<?php
session_start();
#$_SESSION['pagecount']++;
?>
<html>
<head>
<?php
if (!isset($_COOKIE['JSEnabled']) || strlen($_COOKIE['JSEnabled'])!=32 ) {
$js_cookie=md5(md5(#$_SESSION['pagecount']) . $_SERVER['REMOTE_ADDR']);
echo '<script language="javascript">';
echo 'document.cookie="JSEnabled=' . $js_cookie . '"';
echo '</script>';
echo '<meta http-equiv="refresh" content="0;url=http://example.com"/>';
}
?>
<?php
$js=$_COOKIE['JSEnabled'];
if ($js!=md5(md5(#$_SESSION['pagecount']-1) . $_SERVER['REMOTE_ADDR'])) {
$js_cookie=md5(md5(#$_SESSION['pagecount']) . $_SERVER['REMOTE_ADDR']);
echo '<script language="javascript">';
echo 'document.cookie="JSEnabled=' . $js_cookie . '"';
echo '</script>';
echo "</head><body>Sorry, this website needs javascript and cookies enabled.</body></html>";
die();
} else {
$js_cookie=md5(md5(#$_SESSION['pagecount']) . $_SERVER['REMOTE_ADDR']);
echo '<script language="javascript">';
echo 'document.cookie="JSEnabled=' . $js_cookie . '"';
echo '</script>';
}
?>
No one can use for example curl -H "Cookie: JSEnabled=XXXXXXXXXXXXXXXXXX"
because they don't know your algo of computing the hash.
This is the way I check whether javascript and cookies are enabled or not http://asdlog.com/Check_if_cookies_and_javascript_are_enabled
I copy/paste it here
<?
if($_SESSION['JSexe']){ //3rd check js
if($_COOKIE['JS']) setcookie('JS','JS',time()-1);//check on every page load
else header('Location: js.html');
} //2nd so far it's been server-side scripting. Client-side scripting must be executed once to set second cookie.
//Without JSexe, user with cookies and js enabled would be sent to js.html the first page load.
elseif($_COOKIE['PHP']) $_SESSION['JSexe'] = true;
else{ //1st check cookies
if($_GET['cookie']) header('Location: cookies.html');
else{
setcookie('PHP','PHP');
header('Location: '.$_SERVER['REQUEST_URI'].'?cookie=1');
}
}
?>
<head>
<script type="text/javascript">document.cookie = 'JS=JS'</script>
</head>
Recently, I had the following dilemma:
I use a PHP function that generates a QR image related to the current URL, which is very useful for mobile devices. The function works fine, but having my site on a shared hosting, there are some limits for CPU and RAM usage. This function is to heavy and it consumes a lot of CPU time and RAM, so the hosting guys asked me to decrease the usage.
After some tries, I finally reached the idea that I can save some CPU & RAM usage from search engine bots. It is difficult to recognize a bot by browser identification, but all the bots have no JS enabled and that's the main criteria I used to detect if it is a real browser or it is a bot. To explain how significant it is to prevent executing code which will not give anything more for Search Engines (QR, in my case, does not affect search engines), I can say that just Google bot for example makes about 16000 crawls a day on my site.
So I've made this very simple thing which helped a lot:
<script language="javascript"><!--
document.write('<?php echo drawQR($_SERVER["REQUEST_URI"]);?>');
//--></script>
This code uses JS to write a line of PHP code, so this line will be written only when JS is enabled.
Of couse you can use 'noscript' tag if you want to show something when JS is disabled, but this method shows how to execute some PHP only when JS is enabled.
Hope this helps.
Create a cookie using JavaScript and read it using PHP.
With this basic ajax you can separate data that the client see based on javascript or not.
index.php
<!DOCTYPE html>
<html>
<body>
<script>
function jsCheck() {
var xhttp;
if (window.XMLHttpRequest) {
// code for modern browsers
xhttp = new XMLHttpRequest();
} else {
// code for IE6, IE5
xhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xhttp.onreadystatechange = function() {
if (xhttp.readyState == 4 && xhttp.status == 200) {
document.getElementById("demo").innerHTML = xhttp.responseText;
}
};
xhttp.open("GET", "jscheckCon.php", true);
xhttp.send();
}
jsCheck();
</script>
<div id="demo">
no javascript
</div>
</body>
</html>
jscheckCon.php
<?php
echo 'we have javascript!';//you can do that you like to do with js!
?>
Please despite all the people telling you cant check for a client-side scripting technology. If the target technology has http functions, you can do ALWAYS, just write out a verify step. That means literally, the way to check javascript is to run javascript. If javascript is disabled on the browser side it's not possible to check if the client is Javascript capable (like Dillo with it's default config or others)
UPDATED: I've develop this script because i test some of the examples here and seems that everybody does copypasting without any sort of tests. Code is also on the Gist https://gist.github.com/erm3nda/4af114b520c7208f8f3f (updated)
//function to check for session after|before PHP version 5.4.0
function start_session() {
if(version_compare(phpversion(), "5.4.0") != -1){
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
} else {
if(session_id() == '') {
session_start();
}
}
}
// starting the function
start_session();
// create a script to run on the AJAX GET request from :P Javascript enabled browser
echo
'<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$.get(document.URL.substring(0, document.URL.length-1) + "?sessionstart=1");
console.log(document.URL.substring(0, document.URL.length-1) + "?sessionstart=1")}
</script>;
// Ajax GET request handle
if ($_REQUEST['sessionstart'] == 1){
$_SESSION['js'] = 1; // save into session variable
} else {
session_destroy(); // force reset the test. otherwise session
}
// If the session variable has not saved by the AJAX call, loads again.
if (!isset($_SESSION['js'])){
header("Refresh: 1"); // thats only for the first load
echo "Javascript is not enabled <br>"; // Return false
} else {
echo "Javascript is enabled <br>"; // Return true
}
This solution do not need more files, just a iteration if you run a Javascript capable browser. The value is passed back to PHP using a GET with a simple variable but anyone can fake the output doing cURL to url + ?sessionstart=1 unless you add more logic to it.
Make your main php page assume jscript is off, and add a <script> to redirect to the jscript-enabled app in the <head>. If the user actually uses your first page, assume jscript is off.
Other option:
If you dont' have to check if JS is enabled at the visitors first view (mainpage) you can set a cookie with js. On the next page you can check with php if the cookie is there...
You can use logic the logic (default/switch) - is this example I printed the variable in php:
PHP:
$js = 'No';
print 'Javascript Enabled: <span id="jsEnabled">'.$js.'</span>';
JS: (in my document ready)
jQuery('#jsEnabled').text('Yes'); or $('#jsEnabled').text('Yes');
You can set a cookie using Javascript and then reload the page using Javascript. Then using PHP you shall check if the cookie is setted, if it is Javascript is enabled!
Its 2013. Simply have your script render the non-js templates inside a body > noscript tag, then inside your CSS keep your main js site container div display: none; After that just put something like <script>$('#container').show();</script> immediately after you close you main #container div and before your noscript tag. (if you're using jquery of course).
Doing it this way will show the HTML for the non-js enabled browsers automatically, and then the js enabled browsers will only see the js site.
If you're worried about over-bloating the page size with too much mark up, then you could do the same but instead leave <div id="content"></div> empty, then with the js code instead of just showing the div use an ajax call to fetch the content for it.
On a side note, I would probably include additional css files for the non-js site within the noscript tag to save on bandwidth.
Since PHP is server side you can't know in PHP whether the client has Javascript enabled unless you use sessions (or some other way to store data across requests) and first send some code to which the client responds.
If you put the following at the start of your PHP file the client is redirected to the same URL with either 'js=0' or 'js=1' appended to the query string, depending on whether they have Javascript enabled or not. Upon receiving the redirected request the script records the result in a session variable and then redirects back to the original URL, i.e. without the appended 'js=0' or 'js=1'.Upon receiving this second redirect the script proceeds as normal, now with the session variable set according to the clients Javascript capability.
If you don't care about how your query string looks in the user's address bar you can skip the second redirect and just set the session variable. While these redirects are taking place the user is shown a short informative message (also something you could skip if you don't care about that).
<?php
session_start();
if (!isset($_SESSION['js']) && !isset($_GET['js'])) {
$url=$_SERVER['SCRIPT_URI'];
$qry='?'.($q=$_SERVER['QUERY_STRING']).($q?'&':'').'js';
die('<!DOCTYPE html><html lang="en"><head><meta charset="utf-8" /><title>js check</title>'.
'<script type="text/javascript">window.location.href="'.$url.$qry.'=1";</script>'.
'<noscript><meta http-equiv="refresh" content="0; url='.$url.$qry.'=0" /></noscript>'.
'</head><body>Hold on while we check whether you have Javascript enabled.</body></html>');
} elseif (isset($_GET['js'])) {
$_SESSION['js']=$_GET['js'];
$qry = preg_replace('%&?js=(0|1)$%', '', $_SERVER['QUERY_STRING']);
$url = $_SERVER['SCRIPT_URI'].($qry?'?':'').$qry;
die('<!DOCTYPE html><html lang="en"><head><meta charset="utf-8" /><title>js check</title>'.
'<meta http-equiv="refresh" content="0; url='.$url.$qry.'" />'.
'</head><body>Hold on while we check whether you have Javascript enabled.</body></html>');
}
if ($_SESSION['js']) {
//Javascript is enabled
} else {
//Javascript is disabled
}
?>
Yes.
Ensure you have the latest jQuery.js
//javascript
$(function(){
$('#jsEnabled2').html('Yes it is')
})
//php
$js - 'No';
$jscheck = 'Javascript Enabled: ';
$jscheck .= '<span id="jsEnabled">'.$js.'</span>';
print $jscheck;