2010-12-02 90 views
4

我想调用在php区域顶部声明的Javascript函数。然而它不工作。谁能告诉我它的原因。除了这部分,其他所有部分都在工作。请帮帮我。用php代码调用javascript函数

<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
    <html> 
    <head> 
    <title>AES (Rijndael) Encryption Test in JavaScript</title> 
    <script src="aes-enc.js" type="text/javascript" language="JavaScript"></script> 
    <script src="aes-dec.js" type="text/javascript" language="JavaScript"></script> 
    <script src="aes-test.js" type="text/javascript" language="JavaScript"></script> 
    <script type="text/javascript"> 

    function doDecryption() 
      { 
      document.write("Inside Javascript"); 
      var ct, key; 

    ct = hex2s(<?php echo $myValue; ?>); 
    document.write("Inside Javascript"); 
    document.write(ct); 
// key = hex2s(theForm.key.value); 
// theForm.plaintext.value = byteArrayToHex(rijndaelDecrypt(ct, key, "ECB")); 


      } 


    </script> 
    </head> 

    <body> 
    <?php 
    mysql_connect("localhost","root",""); 
    mysql_select_db("encryption") or die(mysql_error()); 
    $userId = $_POST['userId']; 


    if (($_SERVER['REQUEST_METHOD'] == 'POST') && ($_POST['key'] == "")) 
    { 
    $query = mysql_query("select * from employee_details where id = '$userId'");      if($row=mysql_fetch_assoc($query)) 
       { 
        echo '<tr>'; 
        foreach($row as $value) 
        echo '<td>'.$value.'</td>'; 
        echo '</tr>'; 
       } 

      else { echo "No rows returned"; }} 
    else if (($_SERVER['REQUEST_METHOD'] == 'POST') && ($_POST['key'])) 
     { 

      $columname = "ciphertext"; 
      $tablename = "employee_details"; 



       function getField($field, $tbl_name, $condition) 
      { 

       $result = mysql_query("SELECT $field FROM $tbl_name WHERE id = ".$condition); 

       return @mysql_result($result, 0); 
      } 

       $myValue = getField($columname,$tablename,$userId); 

       echo "$myValue"; 
       [B]echo '<script type="text/javascript"> 
        doDecryption(); 
        </script>';[/B] 
       echo "whats happening"; 
       //doDecryption(); 

     } 

    ?> 
    </body> 
    </html> 
+0

是什么,输出什么样子时,添加周围的引号? – jensgram 2010-12-02 09:04:39

+0

我明白了为什么在我的脑海里运行代码后失败了。如果您提供了错误消息,解决起来会更容易。就此而言,作为一个经验法则,尝试将问题分解为“为什么JS不工作?”或者“为什么这个PHP不输出这个HTML/JS源代码?”而不是“为什么PHP生成的HTML/JS源代码不符合我的期望?” – Quentin 2010-12-02 09:08:03

+0

**危险**:您的SQL注入安全漏洞!不要通过将包含unsanitized`$ _POST`数据的字符串粘在一起来构建SQL查询! http://bobby-tables.com/ – Quentin 2010-12-02 09:11:04

回答

5

$myValue当您尝试在JS中使用它时没有值。

PHP在服务器上运行,输出带有嵌入式JavaScript的HTML文档,文档发送到客户端,然后运行JavaScript。

如果您不知道JavaScript变量在PHP到达文档结尾之前需要具备什么值,那么在此之前您无法生成JS的那部分内容。你可能想把它作为函数调用的参数来代替。

一旦你这样做,你有另一个问题 - 如果你的数据是一个字符串,那么它需要被引用(并且其中任何匹配的引号需要被转义)。

简而言之:PHP输出可能作为JS处理的文本,它不能调用JavaScript函数(除非您开始混合可以与服务器上的Rhino/Spidermonkey/etc进行对话的扩展)。

所有这一切,在这种情况下,似乎没有任何理由首先使用JavaScript,你最好把所有的逻辑移到PHP。顺便说一句,您选择的Doctype会在大多数浏览器中触发怪癖模式。这几乎总是非常不可取的。

一个更好的选择应该是:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
    "http://www.w3.org/TR/html4/strict.dtd"> 

或者,如果你真的想转型:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd"> 
-1

它看起来好,如果你不使用AJAX(如果你有可能是你需要给eval ()你的回应)

我试过你的代码的简化版本,它工作正常。

<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
<head> 
<title>AES (Rijndael) Encryption Test in JavaScript</title> 
<script src="aes-enc.js" type="text/javascript" language="JavaScript"></script> 
<script src="aes-dec.js" type="text/javascript" language="JavaScript"></script> 
<script src="aes-test.js" type="text/javascript" language="JavaScript"></script> 
<script type="text/javascript"> 

function doDecryption() 
{ 
    document.write("Inside Javascript"); 
} 

</script> 
</head> 

<body> 
<?php 
    echo '<script type="text/javascript"> 
    doDecryption(); 
    </script>'; 
    echo "whats happening"; 
?> 
</body> 
</html> 

,其结果是

Inside Javascriptwhats happening 

HTH,问候。

0

你能澄清一下这个问题吗?如果问题是:你可以在你的服务器端PHP代码中运行一个客户端JavaScript函数吗?答案是不。

如果您运行nodeJS服务器,则可以托管javascript服务器端并执行函数调用,只要JavaScript代码驻留在某个nodejs可以执行的地方即可。

总的来说,用例让我感到困惑。我猜测,原本设计用于在浏览器中执行解密客户端的应用程序确实如此,因为服务器没有执行解密的密钥。因此,如果这是其他人编写的应用程序,并且您正在尝试进行更改,则需要确保实际上拥有需要服务器端执行解密过程的密钥,因为它可能从未用于服务器有权访问解密密钥。此外,如果服务器有权访问密钥以执行解密,则可能有一种很好的方法可以使用php代码来执行此操作。 (我不是一个PHP开发人员,所以我无法确切地说出需要编写解密php脚本的PHP代码)。

希望这会有所帮助。 马克

2

更改您的javascript函数取一个参数($myValue值)

function doDecryption(param) 

然后改变ct = hex2s(<?php echo $myValue; ?>);ct = hex2s(param);

最后,你需要通过$myValue PHP变量javsacript函数函数,当你调用它时你可以做到这一点

echo '<script type="text/javascript"> 
       doDecryption('.$myValue;.'); 
       </script>'; 

如果你$myValue变量是stirng,那么你应该将其送入JavaScript的

echo '<script type="text/javascript"> 
       doDecryption("'.$myValue;.'"); 
       </script>';