JavaScript Object Notation (JSON) for PHP to JavaScript Conversions
JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate. It is based on a subset of the JavaScript Programming Language. But best of all for our purposes, it makes PHP to JavaScript conversions a snap which would otherwise be nearly impossible! Below, we convert a PHP array to a JavaScript array. Fat chance you'll pull this one off without JSON! (For more on this issue, see PHP-to-JavaScript-String-Conversion-with-No-JSON.html. Many people assume you can convert PHP strings to JavaScript without JSON just because numbers convert well. It ain't so. However, at the bottom of this page you'll find many things you can do with PHP that avoid any conversion needs. PHP can do more than most people think!) This JSON stuff is especially useful for pulling data from MySQL databases and making it available to JavaScript.
<?php
$temperatures=array('hot','cold','lukewarm');
echo "PHP array of 3 values";
echo "<br><br>";
echo $temperatures[0]." ";
echo $temperatures[1]." ";
echo $temperatures[2];
?>
<script language="javascript">
var temperatures = <?php echo json_encode($temperatures); ?>;
alert("JavaScript array of 3 values: "+temperatures);
alert("JavaScript array of 3 values: \n"+temperatures[0]+"\n "+temperatures[1]+"\n "+temperatures[2]);
</script>
PHP to JavaScript conversion of strings requires JSON unless you use a very crude solution. Note that the same JSON encode function that works on arrays works on strings. But lots of luck making the standard non-JSON method work!
<?php
$temperatures="hot";
echo "PHP string value";
echo "<br><br>";
echo $temperatures;
$temp_hotter="now is the time for all good men to come to the aid of the party now is the time for all good men to come to the aid of the party now is the time for all good men to come to the aid of the party now is the time for all good men to come to the aid of the party now is the time for all good men to come to the aid of the party now is the time for all good men to come to the aid of the party now is the time for all good men to come to the aid of the party";
echo "<br><br>";
echo "PHP string value";
echo "<br><br>";
echo $temp_hotter;
?>
<script language="javascript">
var temperatures = <?php echo json_encode($temperatures); ?>;
var temp_hotter = <?php echo json_encode($temp_hotter); ?>;
alert("JavaScript string values: "+temperatures+" \n\n"+temp_hotter);
document.write("<br><br><br>But if you try to declare this string in PHP:<br><br><b>$temp=\"cold\";</br><br><br>and convert it in JavaScript with:<br><br><b>var temp = <?php echo $temp; ?>;</br><br><br>IT WON'T WORK, AND NEITHER WILL ANY OTHER STRINGS WITHOUT JSON!");
</script>
PHP to JavaScript conversion of numbers requires JSON for accuracy if the number has over 16 digits. Note that the same JSON encode function that works on arrays works on numbers. But lots of luck making the standard non-JSON method work if your number has 17 or more digits! Of course, you can always break the number in half and send 2 numbers the standard way, then join (concatenate) them back up once you're in JavaScript. We've tried this—it's crude but it works.
<?php
$temperatures="12345678901234567890";
echo "PHP 20-digit numeric value";
echo "<br><br>";
echo $temperatures;
echo "<br><br>";
$humidity="1234567890123456";
echo "PHP 16-digit numeric value";
echo "<br><br>";
echo $humidity;
?>
<script language="javascript">
var temperatures = <?php echo json_encode($temperatures); ?>;
alert("JavaScript numeric value--note no rounding off of the last 4 digits of a 20-digit numeric value using JSON: "+temperatures);
var temp = <?php echo $temperatures; ?>;
alert("JavaScript numeric value--note the rounding off of the last 4 digits of a 20-digit numeric value without JSON: "+temp);
var humid = <?php echo $humidity; ?>;
alert("JavaScript numeric value--note no rounding off--numbers up to 16-digits don't need JSON: "+humid);
</script>
PHP to JavaScript conversion of floating point numbers requires JSON for accuracy if the number has over 16 digits. Note that the same JSON encode function that works on arrays works on floating point numbers. But lots of luck making the standard non-JSON method work if your floating point number has over 17 digits!
<?php
$temperatures="1234567890.1234567890";
echo "Convert PHP Decimal/Floating Point Number to JavaScript Decimal/Floating Point Number";
echo "<br><br>";
echo "PHP 20-digit numeric decimal value";
echo "<br><br>";
echo $temperatures;
echo "<br><br>";
$humidity="1234567890.1234567";
echo "PHP 17-digit numeric decimal value";
echo "<br><br>";
echo $humidity;
?>
<script language="javascript">
var temperatures = <?php echo json_encode($temperatures); ?>;
alert("JavaScript numeric value--note no rounding off of the last 3 digits of a 20-digit numeric value using JSON: "+temperatures);
var temp = <?php echo $temperatures; ?>;
alert("JavaScript numeric value--note the rounding off of the last 3 digits of a 20-digit numeric value without JSON: "+temp);
var humid = <?php echo $humidity; ?>;
alert("JavaScript numeric value--note no rounding off--numbers up to 17-digits don't need JSON: "+humid);
var humider=2+humid;
alert("JavaScript numeric value--we added 2 to it--see--it\'s real: "+humider);
</script>
Insert, Not Convert!
As you can see below, PHP inserts are easier than messing with PHP-to-JavaScript conversions. You can stick blocks of PHP code into query strings in URLs which are in JavaScript window.location objects which are in PHP echo statements. Or put blocks of PHP code into action attributes in form tags, adding query strings to the URLs. Or put blocks of PHP code into query strings in URLs in HTML links or even have them be the whole URL. You need not use stripslashes() functions, of course, but if you added the slashes with mysql_real_escape_string() before storing the data in MySQL tables, it's a good precaution to take. The JSON function json_encode() will allow you to convert strings to JavaScript seamlessly, but only numbers convert nicely without JSON, as shown above.
You can stick blocks of PHP into HTML text statements, in forms, in tables, and all this seamlessly, as long as you avoid the urge to convert the PHP to anything. Note the use of htmlentities() and stripslashes() both when using values freshly pulled out of MySQL databases. See security-levels-from-javascript-and-php-input-filtering.html for security issues at stake that prompt the use of htmlspecialchars() and htmlentities().
You can put a block of PHP code in the value attribute of an HTML form input tag.
echo '<script language="javascript">alert("You must be the topic author to edit this topic.");window.location = "cms-view-topic.php?id='.$id.'&username='.$U.'"; </script>'; //THIS WILL WORK
<form id="form1" name="form1" method="post" action="cms-edit-topic.php?id=<? echo stripslashes($id); ?>&username=<? echo stripslashes($U); ?>"> //THIS WILL WORK
<a href="cms-view-topic.php?username=<? echo stripslashes($U); ?>&id=<? echo stripslashes($id); ?>">Return to Topic-don't edit</a> //THIS WILL WORK
<a href="<? echo stripslashes($CoolURL); ?>">Go somewhere</a> //THIS WILL WORK
var c = <?php echo json_encode($detail); ?>; //THIS WILL WORK
var c = <?php echo $detail; ?>; //THIS WILL NOT WORK
The best ballpark is <?php echo $parks; ?>. //THIS WILL WORK
var c = <?php echo $parks; ?>; "The best ballpark is "+c+"."; //THIS WILL NOT WORK
var c = <?php echo $parks; ?>; "The best ballpark is ".c."."; //THIS WILL NOT WORK
<?php
$c="Yankee Stadium"; echo "The best ballpark is ".$c."."; //THIS WILL WORK
?>
THE CODE BELOW WILL WORK
<table><tr><td><b><? echo htmlentities(stripslashes($rows['topic']), ENT_QUOTES); ?></b></td></tr></table>
THE CODE BELOW WILL WORK
<form method="post" action=" " name="whatever">
<table><tr><td><input name="id" type="hidden" value="<? echo htmlentities(stripslashes($id), ENT_QUOTES); ?>"></td></tr></table></form>
THE CODE BELOW WILL WORK
<tr><td><b>Email :</b> <? if($U=="xyz_secret_stuff"){echo htmlentities(stripslashes($rows['email']), ENT_QUOTES);}else{echo "(private)";}
?></td></tr>
THE CODE BELOW WILL WORK
<tr><td><b>Topic is: </b><? $open="Open";if($rows['open']=="0"){$open="Closed";}; echo $open; ?></td></tr>
THE CODE BELOW WILL WORK
<?php
$j=$j+10; if($i<$num_topics){echo "<div class='over2'><a href='cms-blog.php?username=".stripslashes($U)."&j=".$j."&mode=-2'><B>More . . .</B></a></div>";}
?>