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

Petit nouveau ! | 2 Messages

07 août 2007, 09:52

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.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

07 août 2007, 10:11

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 2 Messages

07 août 2007, 10:22

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 ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

07 août 2007, 13:33

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...