views:

140

answers:

3

I am trying to insert php variables into javascript.

Here is the broken code:

 var tokens = [<?
 $result = mysql_query("SELECT * FROM accounts ORDER BY id DESC") or die (mysql_error()); 
 while ($row = mysql_fetch_array($result)) { 
 $user_name = $row['user'];
 $user_id = $row['id'];
 echo "['$user_name','$user_id'],";
 }
 ?>]
A: 

PHP runs on the server. JavaScript runs on the client.

You can generate JavaScript from PHP, but you cannot run PHP in JavaScript.

(It is worthwhile reading up on how the various components of the web work, specifically HTTP, to understand all this better.)

If you want to perform PHP actions in response to client actions in the browser without reloading the whole page, investigate 'ajax', for example w3schools have a tutorial.

Peter Boughton
+2  A: 

You do this:

 echo "['$user_name','$user_id'],";

... meaning that it will generate this:

[ ['a','b'], ['a','b'], ['a','b'], ['a','b'], ]

Notice that it will always end with a "," and this is an incorrect syntax.

Correct syntax is :

[ ['a','b'], ['a','b'], ['a','b'], ['a','b'] ]

I'm not a PHP guy, but I'd say something like this would fix it :

 var tokens = [<?
 $result = mysql_query("SELECT * FROM accounts ORDER BY id DESC") or die (mysql_error()); 
 $i = 0;
 while ($row = mysql_fetch_array($result)) { 
 $i++;
 $user_name = $row['user'];
 $user_id = $row['id'];
 echo "['$user_name','$user_id']";
 if($i < sizeof($result)-1 ) // incorrect syntax, but you get the point
   echo ","
 }
 ?>]
marcgg
Ah, I think I missed that the question is about serializing PHP variables to JavaScript. There should be a built-in PHP function that does that (but I'm not a PHP guy either, so don't know what it might be).
Peter Boughton
Yeah I made the same error at first when reading the question ^^ True there must be a function doing this somewhere, but this should do the trick as well.
marcgg
Just remembered that there's an `implode` function that converts an array to a delimited list - coping with the trailing comma issue - but that requires an array to work with, which would probably be more work to create than your existing counter method anyway.
Peter Boughton
why the downvote?
marcgg
+4  A: 

Use PHP's json_encode + Javascript's eval(), e.g:

$fruit = array("banana", "apple", "strawberry", "raspberry", "orange");
$json_fruit = json_encode($fruit);

echo "var fruit = eval('(' + '$json_fruit' + ')');";

JSON can be parsed directly into Javascript using eval(). Only use eval() if you are using a trusted data source, in your case it should be fine since you've probably sanitized the data before it was put in the database. Parentheses need to be included to avoid Javascript confusing itself.

Klinky
eval isn't necessary unless youa re trying to pass it back as a response via ajax (in that case it should go on the js side anyway). json_encode spits out a valid js object/value.
Kevin Peno