2012-07-29 72 views
0

我需要將這些值傳遞給頭部的javascript函數。問題是,當從數據庫中提取一些不止一個單詞時,使用href在使用javascript:function(vars)傳遞時將其切斷,我無法使用onclick工作。我已經嘗試過圍繞變量(「」,「',/」和{)的引號和括號的各種組合,並且在我通過傳遞之前將會有不止一個單詞的引號(見下文)這裏是PHP:將PHP變量傳遞給帶有引號的javascript函數

<?php 
    require('config/dbconfig.php'); 
    $query = "SELECT * FROM news ORDER BY id DESC LIMIT 4"; 
    if ($stmt = $mysqli->prepare($query)) { 
     /* execute statement */ 
     $stmt->execute(); 

     /* bind result variables */ 
     $stmt->bind_result($idn, $titlen, $categoryn, $descn, $postdaten, $authorn); 

     /* fetch values */ 
     while ($stmt->fetch()) { 
      //echo 'id: '. $id .' title: '. $title; 
      echo "<table border='0'>"; 
      $shortDescLengthn = strlen($descn); 
      if ($shortDescLengthn > 106) { 
       $sDCutn = 106 - $shortDescLengthn; 
       $shortDescn = substr($descn, 0, $sDCutn); 
      } else { 
       $shortDescn = $descn; 
      } 
         $titlenQuote = "'". $titlen ."'"; 
         $descnQuote = "'". $descn ."'"; 
         $authornQuote = "'". $authorn ."'"; 
      echo " 
       <h1>". $titlen ."</h1> 
       <tr><td>". $shortDescn ."...</td></tr> 
       <tr><td><a href='javascript:return false;' onclick='readMore(". $idn .",". $titlenQuote .",". $categoryn .", 
          ". $descnQuote .",". $postdaten .",". $authornQuote .")'>Read More</a></td></tr> 
       <tr><td>Written by: " . $authorn . "</td></tr> 
       <tr><td><img src='images/hardcore-games-newsbar-border.png' width='470px' /></td></tr> 
      "; 
     } 
     echo "</table><br />"; 

     /* close statement */ 
     $stmt->close(); 
    } 

    /* close connection */ 
    $mysqli->close(); 
?> 

而且它要在頭功能:

<script type="text/javascript"> 
    function readMore(id,title,cat,desc,post,auth) { 
     alert(id +","+ title +","+ cat +","+ desc +","+ post +","+ auth); 
     var $dialog = $('<div></div>').html('This dialog will show every time!').dialog({autoOpen: false,title: 'Basic Dialog'}); 
     $dialog.dialog('open'); 
     $dialog.title = title; 
     $dialog.html(desc); 
    } 
</script> 

這是一個使用頁面加載()在主索引頁我有問題與對話框,但它甚至沒有達到這一點,所以下一步。如果需要知道,所有jquery包括在主索引頁面上。load()將進入索引頁上的div,並且這可以工作目前爲止,罰款爲

+0

是的,我已經做到了。就像我的OP所說的那樣,它不一定是它傳遞變量的整個字符串的實際傳遞。它切斷。我是否應該將鏈接指向此頁面的頂部以供您重新閱讀? – Grant 2012-07-29 23:19:15

+2

很高興看到有人*最後*使用'MySQLi'而不是'mysql'! – 2012-07-29 23:25:52

回答

2

對屬性值分隔符和JavaScript字符串分隔符都使用相同類型的引號;不要這樣做。此外,json_encode值,而不是僅僅包裹它們引號,像這樣:

echo " 
    <h1>". $titlen ."</h1> 
    <tr><td>". $shortDescn ."...</td></tr> 
    <tr><td><a href='javascript:return false;' onclick='readMore(". $idn .",". json_encode($titlen) .",". json_encode($categoryn) .", 
    ". json_encode($descn) .",". json_encode($postdaten) .",". json_encode($authorn) .")'>Read More</a></td></tr> 
    <tr><td>Written by: " . $authorn . "</td></tr> 
    <tr><td><img src='images/hardcore-games-newsbar-border.png' width='470px' /></td></tr> 
"; 

&hellip;而且您還需要對它們進行HTML編碼。

echo "<h1>$titlen</h1>"; 
echo "<tr><td>$shortDescn...</td></tr>"; 
echo '<tr><td><a href="javascript:return false;" onclick="' 
    . 'readMore(' . $idn . ',' . htmlspecialchars(json_encode($titlen)) . ',' 
    . htmlspecialchars(json_encode($categoryn)) . ',' 
    . htmlspecialchars(json_encode($descn)) . ',' . htmlspecialchars(json_encode($postdaten)) . ',' 
    . htmlspecialchars(json_encode($authorn)) . ')">Read More</a></td></tr>'; 
echo "<tr><td>Written by: $authorn</td></tr>"; 
echo '<tr><td><img src="images/hardcore-games-newsbar-border.png" width="470px" /></td></tr>'; 

普羅蒂普™:<tr>不能<h1>後直接。

+0

非常感謝。我希望有什麼可以添加引號的,無論什麼原因都找不到它。像魅力一樣工作。 – Grant 2012-07-29 23:23:40

+2

如果標題是「下雨」,該怎麼辦? – icktoofay 2012-07-29 23:28:45

+2

或者更惡意地說,'onmouseover ='alert(document.cookie)'nothing =''? – icktoofay 2012-07-29 23:30:55

2

你目前正在做這樣的事情:

echo "<a href='#' onclick='doSomething('" . $someData . "');'>..."; 

正如你提到的,這是行不通的,因爲引號衝突。有一個快速的方法來解決這個問題,但是我認爲如果你改變一點點會更好。我怎麼逃脫title我把它放在那裏之前

echo "<a ... data-title=\"" . htmlspecialchars($title) . "\" ...>..."; 

注:

首先,把你的數據在屬性中啓動。你可以添加更多的屬性,但是你應該讓它們都以data-開頭。

接下來,應用class它。例如,read-more

echo "<a ... class=\"read-more\" data-title=\"" . htmlspecialchars($title) . "\" ...>..."; 

現在您可以將事件偵聽器綁定到它。說所有的項目都包含在dividitems。然後,你可以這樣做在JavaScript:

$("#items").on("click", ".read-more", function(e) { 
    var me = $(this); 
    var title = me.attr('data-title'); 
    alert("The title is:\n" + title); 
    e.preventDefault(); 
}); 

你可以再擴展,要彈出一個對話框,或任何你想要做的事。


爲什麼這種方式而不是'容易'的方式?

這種方式是分離內容,演示文稿和行爲的開始,這通常被認爲是一件好事。在此之前,您已將table用於佈局和演示,並將混合內嵌JavaScript的內容與行爲混合在一起;一大堆東西。

如果將常見的東西放入單獨的文件並通過瀏覽器進行緩存,將所有這些分離出來有助於提高可維護性,並且通常會帶來更好的加載時間。如果它是一大湯匙,那麼瀏覽器不能單獨緩存這些碎片。

0
<html> 
<head> 
<SCRIPT LANGUAGE="JAVASCRIPT" TYPE="TEXT/JAVASCRIPT"> 
function login(t) { 
alert(t); 
} 
</SCRIPT> 
</head> 
<body> 
<?php 
$id=$_GET['id']; 
print "<input type='button' name='button' value='button' onClick=login('$id')>"; 
?> 
</body> 
</html> 
相關問題