2010-12-02 92 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>';