onvindbare syntaxisfout

Status
Niet open voor verdere reacties.

renevanh

Gebruiker
Lid geworden
12 mrt 2005
Berichten
84
Deze vraag is niet puur Javascript, maar aangezien het Javascript stukje niet werkt door (volgens de foutconsole van Firefox) een syntaxisfout in de aanroep van de Javascriptcode zet ik hem toch bij Javascript.

Nuja, een syntaxisfout komen we allemaal wel eens tegen... alleen kan ik hem niet vinden.
Het is nogal een ingewikkeld zooitje geworden door de grote hoeveelheid diverse qoutes, maar in theorie moet het werken.
Het gaat om de echo regel. Firefox onderstreept de hele regel als 'syntaxisfout'.

Iemand die de fout wel ziet?

Mijn code:

PHP:
include("dbconnect.php");
$maincatquery = mysql_query("SELECT product_name FROM products WHERE product_category = 'maincategory' AND product_iscategory = 'true'");

if(!isset($_GET['cat'])) {
  while ($maincats = mysql_fetch_array($maincatquery)) {
    echo "<a href='#' onClick=\"javascript:showTree('".$maincats['product_name']."')\">" . $maincats['product_name'] . "</a><br />";
  }
}
 
En als je het nou eens zo probeerd:

Code:
include("dbconnect.php");
$maincatquery = mysql_query("SELECT product_name FROM products WHERE product_category = 'maincategory' AND product_iscategory = 'true'");

if(!isset($_GET['cat'])) {
  while ($maincats = mysql_fetch_array($maincatquery)) {
    echo '<a href='#' onClick="javascript:showTree('".$maincats['product_name']."')\">" . $maincats['product_name'] . "</a><br />';
  }
}
 
dat gaat denk ik niet werken, gezien de echo ook met een enkele begint, en je href ook.

In zo'n geval probeer ik het altijd in stukjes te hakken. Zo dus:
PHP:
$onclickJS = "javascript:showTree(\'" . $maincats['product_name'] . "\')";   //noot escaped enkele quotes
echo "<a href='#' onclick='" . $onclickJS . "'>" . $maincats['product_name'] . "</a><br />"; //zodat ik hier gewone single quotes kan gebruiken
zou moeten werken


:thumb:
 
Laatst bewerkt:
Persoonlijk zou ik het zo doen (Al gebruik ik geen inline javascript)

PHP:
<?php

include("dbconnect.php");
$maincatquery = mysql_query("SELECT product_name FROM products WHERE product_category = 'maincategory' AND product_iscategory = 'true'");

if(!isset($_GET['cat'])) {
  while ($maincats = mysql_fetch_array($maincatquery)) {
    $tempcats = $maincats['product_name'];
    ?>
    <a href='#' onClick='javascript:showTree("<?=$tempcats?>")'><?=$tempcats?></a><br />;
 <? }
}

?>
 
Laatst bewerkt:
Als er quotes of andere specifieke speciale tekens (zoals < of >) staan in $maincat['product_name'] dan krijg je in de inline javascript syntax fout. Die tekens zul je moeten vervangen. Daar heb ik ooit een functie voor geschreven. Dus alle strings die in inline javascript terecht moeten komen door deze functie halen:

PHP:
$javascript_escape_map = array (chr(34) => "\\x22", chr(38) => "\\x26", chr(39) => "\\x27", chr(60) => "\\x3c", chr(62) => "\\x3e", chr(160) => "\\xa0", chr(161) => "\\xa1", chr(162) => "\\xa2", chr(163) => "\\xa3", chr(164) => "\\xa4", chr(165) => "\\xa5", chr(166) => "\\xa6", chr(167) => "\\xa7", chr(168) => "\\xa8", chr(169) => "\\xa9", chr(170) => "\\xaa", chr(171) => "\\xab", chr(172) => "\\xac", chr(173) => "\\xad", chr(174) => "\\xae", chr(175) => "\\xaf", chr(176) => "\\xb0", chr(177) => "\\xb1", chr(178) => "\\xb2", chr(179) => "\\xb3", chr(180) => "\\xb4", chr(181) => "\\xb5", chr(182) => "\\xb6", chr(183) => "\\xb7", chr(184) => "\\xb8", chr(185) => "\\xb9", chr(186) => "\\xba", chr(187) => "\\xbb", chr(188) => "\\xbc", chr(189) => "\\xbd", chr(190) => "\\xbe", chr(191) => "\\xbf", chr(192) => "\\xc0", chr(193) => "\\xc1", chr(194) => "\\xc2", chr(195) => "\\xc3", chr(196) => "\\xc4", chr(197) => "\\xc5", chr(198) => "\\xc6", chr(199) => "\\xc7", chr(200) => "\\xc8", chr(201) => "\\xc9", chr(202) => "\\xca", chr(203) => "\\xcb", chr(204) => "\\xcc", chr(205) => "\\xcd", chr(206) => "\\xce", chr(207) => "\\xcf", chr(208) => "\\xd0", chr(209) => "\\xd1", chr(210) => "\\xd2", chr(211) => "\\xd3", chr(212) => "\\xd4", chr(213) => "\\xd5", chr(214) => "\\xd6", chr(215) => "\\xd7", chr(216) => "\\xd8", chr(217) => "\\xd9", chr(218) => "\\xda", chr(219) => "\\xdb", chr(220) => "\\xdc", chr(221) => "\\xdd", chr(222) => "\\xde", chr(223) => "\\xdf", chr(224) => "\\xe0", chr(225) => "\\xe1", chr(226) => "\\xe2", chr(227) => "\\xe3", chr(228) => "\\xe4", chr(229) => "\\xe5", chr(230) => "\\xe6", chr(231) => "\\xe7", chr(232) => "\\xe8", chr(233) => "\\xe9", chr(234) => "\\xea", chr(235) => "\\xeb", chr(236) => "\\xec", chr(237) => "\\xed", chr(238) => "\\xee", chr(239) => "\\xef", chr(240) => "\\xf0", chr(241) => "\\xf1", chr(242) => "\\xf2", chr(243) => "\\xf3", chr(244) => "\\xf4", chr(245) => "\\xf5", chr(246) => "\\xf6", chr(247) => "\\xf7", chr(248) => "\\xf8", chr(249) => "\\xf9", chr(250) => "\\xfa", chr(251) => "\\xfb", chr(252) => "\\xfc", chr(253) => "\\xfd", chr(254) => "\\xfe", chr(255) => "\\xff",);
function escape_javascript($input)
{
  global $javascript_escape_map;
  $output = str_replace(array_keys($javascript_escape_map), $javascript_escape_map, $input);
  $output = str_replace(array("\r", "\n"), "", $output);
  $output	= trim($output);
  return $output;
}
 
Als er quotes of andere specifieke speciale tekens (zoals < of >) staan in $maincat['product_name'] dan krijg je in de inline javascript syntax fout.

Er is echter met zekerheid te zeggen dat die niet voorkomen.
zoals $maincat doet vermoeden gaat het om categorieën, in dit geval categorieën voor licht- en geluidsapparatuur. Speciale tekens komen dus niet voor.
 
laat dan eens de bron zien van de HTML pagina. Dat maakt het een stuk duidelijker. Overigens gebeurd het nog wel eens dat er een single-quote in een categorie-naam voorkomt.
 
Laatst bewerkt:
Ik heb de suggesties van JPromijn en Vegras nog niet geprobeerd (nog geen tijd voor gehad). Mochten die niet werken dan zal ik de html output er bij zetten ;)
 
Ik heb de code van JPromijn geprobeerd en ietsje aan moeten passen (zaten wat foutjes in).
Helaas... het werkt nog niet.
Waar ik echter eerder wel een vermoede had dat het met de quotes fout zat weet ik nu niet waar ik moet zoeken... ik zie de fout niet.

PHP:
<?php

include("dbconnect.php");
$maincatquery = mysql_query("SELECT product_name FROM products WHERE product_category = 'maincategory' AND product_iscategory = 'true'");

if(!isset($_GET['cat'])) {
  while ($maincats = mysql_fetch_array($maincatquery)) {
    $tempcats = $maincats['product_name'];
    ?>
    <a href="#"  onClick="javascript:showTree('<?php echo $tempcats; ?>')"><?php echo $tempcats; ?></a><br />
 <?php }
}
?>


En de html output van dit stuk:

HTML:
<div id="rechts_content">
        
     <a href="#"  onClick="javascript:showTree('Geluid')">Geluid</a><br />
     <a href="#"  onClick="javascript:showTree('Licht')">Licht</a><br />
     <a href="#"  onClick="javascript:showTree('Overige')">Overige</a><br />
     <a href="#"  onClick="javascript:showTree('Stroom')">Stroom</a><br />

</div>

De gehele link wordt als een syntaxis error gezien, FireFox geeft dat aan zoals in de bijlage te zien is.
 

Bijlagen

  • fout.PNG
    fout.PNG
    26,2 KB · Weergaven: 56
Laatst bewerkt:
Hmm, de pijl naar de <br />. Is het wel een xhtml document (dus staat je doctype goed)? Wie weet is het een html syntaxfout en is er iets anders mis met de javascript.
 
HTML:
<!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" xml:lang="en" lang="en">

Lijkt mij in orde...
 
Dan ligt het aan de rest van de pagina. Dit geeft geen syntaxfout:

HTML:
<!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" xml:lang="en" lang="en">
<head>
<title>Test</title>


</head>
<body>
<div id="rechts_content">
        
     <a href="#"  onClick="javascript:showTree('Geluid')">Geluid</a><br />
     <a href="#"  onClick="javascript:showTree('Licht')">Licht</a><br />
     <a href="#"  onClick="javascript:showTree('Overige')">Overige</a><br />
     <a href="#"  onClick="javascript:showTree('Stroom')">Stroom</a><br />

</div>
</body>
</html>

Wel een showTree is not defined, maar dat valt te verwachten. Als je de volledige HTML bron laat zien kunnen we meer zeggen. En je kunt het ook meteen even door de W3C markup validator halen.
 
Laatst bewerkt:
Op een paar missende alt attributen na is het documenten valide...

Ik dump de hele code waar het hier om gaat eventjes, dat maakt het voor anderen vast makkelijker om de fout te helpen vinden:

offertes.php:

PHP:
<?php
session_start();
?>
<!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" xml:lang="en" lang="en">
  <head>
    <title>BASS backend</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    <link rel="Stylesheet" type="text/css" href="Scripts/bass2.css" />
    <script type="text/javascript" src="Scripts/script.js"></script>
    <script type="text/javascript" src="Scripts/ajax.js"></script>
    <script type="text/javascript">
    
        var ajax = new Array();
    
        function showTree(maincat)
        {
        	if(maincat.length>0){
        		var index = ajax.length;
        		ajax[index] = new sack();
        		
        		ajax[index].requestFile = 'producttree.php?cat='+maincat;	// Specifying which file to get
        		ajax[index].onCompletion = function(){ createSubCat(index) };	// Specify function that will be executed after file has been found
        		ajax[index].runAJAX();		// Execute AJAX function
        	}
        }
        
        function createSubCat(index)
        {
        	var obj = document.getElementById('rechts_content');
        	eval(ajax[index].response);	// Executing the response from Ajax as Javascript code	
        }
    </script>
  </head>
  <body>
    <div id="main_container">
    
      <div id="header_container">
        <div id="header_left_content"><img src="http://www.bangingsoundsofsilence.nl/Afbeeldingen/DJorig.png" alt="BASS :: BAnging Sounds of Silence" width="100%" height="100%"/>
        </div>
        <div id="header_center_content"><img src="http://www.bangingsoundsofsilence.nl/Afbeeldingen/banner.png" alt="BASS :: BAnging Sounds of Silence"/>
        </div>
      </div>
    
      <div id="links_container" class="column">
        <div id="menu_content">
        <?php
        include("loggedin.php");
        include('menu.php');
        ?>
        
        </div>
      </div>
      <div id="rechts_container" class="column">

        <div id="rechts_content">
        <?php
          include("producttree.php");
        ?>
        </div>

      </div>

      <div id="content_container" class="column">
        <div id="content_content">
        <?php
          if (isset($_SESSION['login_name']) && $_SESSION['loggedin'] == 'yes') {
                if($_SESSION['user_type'] == 'admin') {
                  
                  include("dbconnect.php");
                }
                else {
                  echo "<p class=\"text\">Je moet ingelogd zijn als beheerder om dit te kunnen doen.</p>";
                }
          }
          else {
            echo "<p class=\"text\">Je moet ingelogd zijn om dit te kunnen doen.</p>";
            echo $_SESSION['user_type'];
          }
        ?>
        </div>
      </div>
    
    </div>
    <div id="footer_container">
      <div id="footer_left_content"><span class="footerred">Aangeraden resolutie: <br />1024*786 of hoger</span>
      </div>
      <div id="footer_right_content"><span class="footerlinks"><a href="Javascript:algvoorw()">Algemene Voorwaarden</a></span>
      </div>
      <div id="footer_center_content"><span class="footer">BASS drive-in show is gevestigd in Driebergen.
        tel: 06-36260306 &nbsp;&nbsp; e-mail: info@bangingsoundsofsilence.nl <br />
        Alle inhoud van deze website is eigendom van BASS &nbsp;&nbsp; &copy; 2007-2009</span>
      </div>
    </div>
  </body>
</html>

de geinclude producttree.php:

PHP:
<?php

include("dbconnect.php");
$maincatquery = mysql_query("SELECT product_name FROM products WHERE product_category = 'maincategory' AND product_iscategory = 'true'");

if(!isset($_GET['cat'])) {
  while ($maincats = mysql_fetch_array($maincatquery)) {
    $tempcats = $maincats['product_name'];
    ?>
    <a href="#"  onclick="javascript:showTree('<?php echo $tempcats; ?>')"><?php echo $tempcats; ?></a><br />
 <?php }
}



if(isset($_GET['cat'])) {
  $maincat = $_GET['cat'];
  $subcatquery = mysql_query("SELECT product_name FROM products WHERE product_category = '".$maincat."' AND product_iscategory = 'true'");
  while ($maincats = mysql_fetch_array($maincatquery)) {
    $tempcats = $maincats['product_name'];
    ?>
    <a href="#"  onclick="javascript:showTree('<?php echo $tempcats; ?>')"><?php echo $tempcats; ?></a><br />
    <?php
    while($subcats = mysql_fetch_array($subcatquery)) {
      $tempcats = $subcats['product_name'];
      ?>
      &nbsp;&nbsp;<a href="#"  onclick="javascript:showTree('<?php echo $tempcats; ?>')"><?php echo $tempcats; ?></a><br />
      <?php
    }
  }
}

?>

En de HTML output van het hele grapje:

HTML:
<!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" xml:lang="en" lang="en">
  <head>
    <title>BASS backend</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    <link rel="Stylesheet" type="text/css" href="Scripts/bass2.css" />
    <script type="text/javascript" src="Scripts/script.js"></script>
    <script type="text/javascript" src="Scripts/ajax.js"></script>

    <script type="text/javascript">
    
        var ajax = new Array();
    
        function showTree(maincat)
        {
        	if(maincat.length>0){
        		var index = ajax.length;
        		ajax[index] = new sack();
        		
        		ajax[index].requestFile = 'producttree.php?cat='+maincat;	// Specifying which file to get
        		ajax[index].onCompletion = function(){ createSubCat(index) };	// Specify function that will be executed after file has been found
        		ajax[index].runAJAX();		// Execute AJAX function
        	}
        }
        
        function createSubCat(index)
        {
        	var obj = document.getElementById('rechts_content');
        	eval(ajax[index].response);	// Executing the response from Ajax as Javascript code	
        }
    </script>
  </head>
  <body>
    <div id="main_container">
    
      <div id="header_container">
        <div id="header_left_content"><img src="http://www.bangingsoundsofsilence.nl/Afbeeldingen/DJorig.png" alt="BASS :: BAnging Sounds of Silence" width="100%" height="100%"/>
        </div>
        <div id="header_center_content"><img src="http://www.bangingsoundsofsilence.nl/Afbeeldingen/banner.png" alt="BASS :: BAnging Sounds of Silence"/>

        </div>
      </div>
    
      <div id="links_container" class="column">
        <div id="menu_content">
        <p class="text">&nbsp;&nbsp;Welkom renevanh</p>&nbsp;&nbsp;<span class="textlinks"><a href="index.php">Home</a></span>&nbsp;&nbsp;<img src="Afbeeldingen/green_check.png" height="16px" width="16px" alt="Voltooid" /><br />&nbsp;&nbsp;<span class="textlinks"><a href="offertes.php">Offertes</a></span>&nbsp;&nbsp;<img src="Afbeeldingen/red_check.png" height="16px" width="16px" alt="In Ontwikkeling" /><br />&nbsp;&nbsp;<span class="textlinks"><a href="agenda.php">Agenda</a></span>&nbsp;&nbsp;<img src="Afbeeldingen/red_check.png" height="16px" width="16px" alt="In Ontwikkeling" /><br /><br />&nbsp;&nbsp;<span class="textlinks"><a href="profiel.php">Profiel</a></span>&nbsp;&nbsp;<img src="Afbeeldingen/green_check.png" height="16px" width="16px" alt="Voltooid" /><br />&nbsp;&nbsp;<span class="textlinks"><a href="logout.php">Uitloggen</a></span>&nbsp;&nbsp;<img src="Afbeeldingen/green_check.png" height="16px" width="16px" alt="Voltooid" /><br /><br /><br /><br />&nbsp;&nbsp;<span class="textlinks"><a href="users.php">Gebruikersbeheer</a></span>&nbsp;&nbsp;<img src="Afbeeldingen/green_check.png" height="16px" width="16px" alt="Voltooid" /><br />&nbsp;&nbsp;<span class="textlinks"><a href="categories.php">Categoriebeheer</a></span>&nbsp;&nbsp;<img src="Afbeeldingen/green_check.png" height="16px" width="16px" alt="Voltooid" /><br />&nbsp;&nbsp;<span class="textlinks"><a href="products.php">Productbeheer</a></span>&nbsp;&nbsp;<img src="Afbeeldingen/green_check.png" height="16px" width="16px" alt="Voltooid" /><br /><br />&nbsp;&nbsp;<img src="Afbeeldingen/green_check.png" height="16px" width="16px" alt="Voltooid" />--> Voltooid<br />&nbsp;&nbsp;<img src="Afbeeldingen/red_check.png" height="16px" width="16px" alt="In Ontwikkeling" />--> In Ontwikkeling        
        </div>

      </div>
      <div id="rechts_container" class="column">

        <div id="rechts_content">
        
    <a href="#"  onclick="javascript:showTree('Geluid')">Geluid</a><br />
     <a href="#"  onclick="javascript:showTree('Licht')">Licht</a><br />
     <a href="#"  onclick="javascript:showTree('Overige')">Overige</a><br />
     <a href="#"  onclick="javascript:showTree('Stroom')">Stroom</a><br />

         </div>

      </div>

      <div id="content_container" class="column">
        <div id="content_content">
                </div>
      </div>
    
    </div>
    <div id="footer_container">

      <div id="footer_left_content"><span class="footerred">Aangeraden resolutie: <br />1024*786 of hoger</span>
      </div>
      <div id="footer_right_content"><span class="footerlinks"><a href="Javascript:algvoorw()">Algemene Voorwaarden</a></span>
      </div>
      <div id="footer_center_content"><span class="footer">BASS drive-in show is gevestigd in Driebergen.
        tel: 06-36260306 &nbsp;&nbsp; e-mail: info@bangingsoundsofsilence.nl <br />
        Alle inhoud van deze website is eigendom van BASS &nbsp;&nbsp; &copy; 2007-2009</span>

      </div>
    </div>
  </body>
</html>
 
Geen syntaxfout als ik dat kopieer & plak in een html bestand :eek: De enige fout die ik krijg is "sack is not defined" (ik heb de externe javascript ebstanden bijgevoegd).
 
Inderdaad, en het is nog eens XHTML valide ook...

FireFox is het daar niet mee eens en heeft wat mij betreft nog gelijk ook, want het werkt niet, ook niet als ik er enkele testalerts tussengooi om er zeker van te zijn dat het niet aan het script ligt.

Voer ik het script uit zonder attribuut dan werken alerts wel (na wat kleine aanpassingen in het script natuurlijk) en wordt het dus wel aangeroepen.
 
Je hebt

PHP:
onclick="javascript:showTree('Geluid')"

Maar dat moet waarschijnlijk zijn:

PHP:
onclick="showTree('Geluid')"

'javascript:' ervoor zetten is gebruikelijk als je het in het href attribuut van de link zet.
 
Nee, dat mag gewoon. Sterker nog, als je geen standaard taal opgeeft is het eigenlijk verplicht. Maar aangezien javascript de standaard is werkt het ook zonder.
 
We blijven proberen... :(

Chrome zegt wanneer je op een link klikt:

Code:
Uncaught SyntaxError: Unexpected token < http://backend.bangingsoundsofsilence.nl/offertes.php# (line 2)

Dat is nogal een aparte foutmelding... maar schijnt een bug te zijn binnen Chrome (het staat tenminste overal en nergens onder "bugreports").

IE8 probeert wat te zeggen maar die Javascript Console is hopelijk nog in beta fase, want die crasht meteen...
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan