Page 1 sur 1

Erreur lors de l'eval(). Escape, Unescape ?

Posté : 07 août 2007, 09:52
par drannh
Bonjour à tous,

Cela fait 2 jours que je cherche une solution introuvable à un problème..
Alors voici, j'ai une procedure AJAX dont le script php récupère le code-source d'un fichier htm pour le renvoyer au script JS qui fait un "eval()" dessus, afin d'afficher la page. Je passe par php pour faire ca car ca me permet de convertir en ISO mais aussi de renvoyer d'autres données en plus du code source de la page. Cependant, ça ne fonctionne pas, je reçoit cette erreur-ci (dans une console debug de Firefox) :

unterminated string literal
document.getElementById("Main").innerHTML = "<!DOCTYPE html PUBLIC \"-//W3C//DTD...

Le message qui provoque cette erreur et a été envoyé du PHP vers le JS :

Code : Tout sélectionner

document.getElementById("Main").innerHTML = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN \" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"> <html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"fr\" lang=\"fr\"> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-15\"> <title>Pseudo</title> <script language=\"JavaScript\" type=\"text/javascript\" src=\"jsScripts/Login/ValidNewUser.js\"></script > <script language=\"JavaScript\" type=\"text/javascript\" src=\"jsScripts/Useful.js\"></script> <script language=\"JavaScript\" type=\"text/javascript\" src=\"jsScripts/Engine.js\"></script> <script language=\"JavaScript\" type=\"text/javascript\" src=\"jsScripts/LoadPage.js\"></script> </head> <body onLoad=\"IsJsEnabled()\"> <div id=\"divFrmNewUser\"> <form action=\"javascript:EngineInit(\'NewUser\')\" onSubmit=\"return ValidForm()\" method=\"post\" name=\"frmNewUser\"> <br><br><br> <table width=\"100%\" border=\"0\"> <tr> <td width=\"95\" align=\"right\" valign=\"middle\"><font size=\"1\" face=\"Verdana\">Login é</font></td> <td width=\"129\"><input type=\"text\" name=\"T1\" size=\"20\" onblur=\"Validation(this) ;javascript:EngineInit(\'CheckUser\');\" /></td> <td width=\"18\"><div id=\"errT1icon\" style=\"vertical-align:middle;font-size:0px\"></div></td> <td width=\"100%\"><div id=\"errT1\" style=\"font-family: Verdana; font-size: 10px; color :#FF0000; font-style:italic;vertical-align:middle;\"></div></td> </tr> <tr> <td align=\"right\" valign=\"middle\"><font size=\"1\" face=\"Verdana\">Password</font>< /td> <td><input type=\"password\" name=\"T2\" size=\"20\" onblur=\"Validation(this)\" /></td> <td><div id=\"errT2icon\" valign=\"middle\"></div></td> <td><div id=\"errT2\" valign=\"middle\" style=\"font-family: Verdana; font-size: 10px; color :#FF0000; font-style:italic\"></div></td> </tr> <tr> <td align=\"right\" valign=\"middle\"><i><font face=\"Verdana\" style=\"font-size: 10px\" >Confirmation</font></i></td> <td><input type=\"password\" name=\"T3\" size=\"20\" onblur=\"Validation(this)\" /></td> <td valign=\"middle\"><div id=\"errT3icon\" valign=\"middle\"></div></td> <td><div id=\"errT3\" valign=\"middle\" style=\"font-family: Verdana; font-size: 10px; color :#FF0000; font-style:italic\"></div></td> </tr> <tr> <td align=\"right\" valign=\"middle\"><font face=\"Verdana\" size=\"1\">E-mail</font></td > <td><input type=\"text\" name=\"T4\" size=\"20\" onblur=\"Validation(this);javascript:EngineInit (\'CheckMail\')\" /></td> <td valign=\"middle\"><div id=\"errT4icon\" valign=\"middle\"></div></td> <td><div id=\"errT4\" valign=\"middle\" style=\"font-family: Verdana; font-size: 10px; color :#FF0000; font-style:italic\"></div></td> </tr> <tr> <td align=\"right\" valign=\"middle\"><font face=\"Verdana\" size=\"1\">Ville</font></td > <td><input type=\"text\" name=\"T5\" size=\"20\" onblur=\"Validation(this)\" /></td> <td valign=\"middle\"><div id=\"errT5icon\" valign=\"middle\"></div></td> <td><div id=\"errT5\" valign=\"middle\" style=\"font-family: Verdana; font-size: 10px; color :#FF0000; font-style:italic\"></div></td> </tr> <tr> <td align=\"right\">&nbsp;</td> <td><input type=\"hidden\" name=\"FieldJsEnabled\" value=\"false\" /></td> <td valign=\"middle\">&nbsp;</td> <td>&nbsp;</td> </tr> </table> <br><br> <p><input type=\"submit\" value=\"Submit\" name=\"B1\"><input type=\"reset\" value=\"Reset\" name= \"B2\"></p> </form></div> </body> </html>";document.getElementById("StatusPhp").innerHTML = "<fieldset><legend>PHP_Status</legend><p><font style=\"color:#999999\">Transfert des données : 0ms</font><br></p></fieldset>";document.getElementById ("StatusPage").innerHTML = "<fieldset><legend>Page_Loading_Time</legend><p><font style=\"color:#009900 \">1ms</font><br></p></fieldset>";

Et le code PHP :
<?php
 
header('Content-Type: text/html; charset=ISO-8859-15');
  
require_once ('phpScripts/Useful.php');
$dummy1 = BenchmarkFullPage();
$dummy2 = Benchmark('dummy');
 
extract($_POST);
$url = htmlentities(trim(utf8_decode($url)));
$log = SetErrColor(Benchmark('Transfert des données'),'Grey'); 

echo 'document.getElementById("Main").innerHTML = "'. addslashes(get_document($url)) . '";';
 
$FullPageTiming = SetFullPageTiming(BenchmarkFullPage());
echo 'document.getElementById("StatusPhp").innerHTML = "<fieldset><legend>PHP_Status</legend><p>' . $log . '</p></fieldset>";';
echo 'document.getElementById("StatusPage").innerHTML = "<fieldset><legend>Page_Loading_Time</legend><p>' . $FullPageTiming . '</p></fieldset>";';
?>

Est-ce que ce problème pourrait venir du fait que je n'utilise pas les escape() et unescape() ?? A cause des espaces dans le source ? Franchement je ne sais plus du tout par où chercher... je désespère.. il y a un dicton qui dit que si un informaticien bute sur un problème, qu'il doit partir promener le chien, et qu'à son retour il trouvera la solution... hum, comment dire.. je n'ai pas de chien

Je vous remercie d'avance !
Seb.

Posté : 07 août 2007, 10:11
par Ryle
En javascript, un retour à la ligne est considéré comme une fin d'instruction (équivalente au point virgule). Du coup, il tente juste d'exécuter l'instruction

Code : Tout sélectionner

document.getElementById("Main").innerHTML = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN
Et te dis que celle-ci ne se termine pas correctement :)

Posté : 07 août 2007, 10:22
par drannh
ok...

reste à savoir pourquoi j'ai ces retours à la ligne...
voici ma fonction qui récupère le code source d'un fichier :
function get_document($url) {
    $file = fopen ($url,"r");
    if (!$file) {
        return null;
    }
    $doc = "";
    while (!feof ($file))
       $doc .= fgets ($file, 1024);
    fclose($file);
    return $doc;
}
Ce serait dû aux 1024 octets ?

Posté : 07 août 2007, 13:33
par Ryle
Du tout, c'est tout simplement du au fait qu'ils sont présents dans le fichier que tu ouvres, et comme php est pas du genre contrariant, il les gardes quand tu le lis :)

Tu peux faire un str_replace() sur ta variable php pour supprimer les \r\n et \n, et ainsi dans ton code javascript n'avoir qu'une seule ligne.. c'est pas gégé, mais ça t'évitera au moins ce problème :)