2014-09-13 83 views
-2

我目前正在使用mysql/php/javascript/googlecharts製作一個圖表。MySQL/PHP/Javascript - 在回顯文本中引起錯誤的撇號

但是,當我在Google Charts的Javascript中回顯時,我的't_text'列不斷轉義。 我需要在哪裏放置一個真正的轉義字符串來解決這個問題?

Example of Problem: 
Tweet 1) "He'll be the last one there" 
Tweet 2) "It's her pen" 

解決辦法是無視'(撇號)與mysqli_real_escape_string聲明,但我不知道要實現它

<?php 

    $tablequery = mysqli_query($dbc,"SELECT handle,t_text, t_date,t_time,sentiment, score FROM tweets "); 

    while ($r=mysqli_fetch_assoc($tablequery)) 
    { 
    $handle = $r["handle"]; 
    $t_text= $r["t_text"]; 
    $t_date= $r["t_date"]; 
    $t_time= $r["t_time"]; 
    $sentiment = $r["sentiment"]; 
    $score= $r["score"]; 
    $tablechart[] = "['".$handle."','".$t_text."','".$t_date."','".$t_time."','".$sentiment. "','".$score."']"; 
    } 
?> 

    <script type="text/javascript"> 
    google.load("visualization", "1", {packages:["table"]}); 
    google.setOnLoadCallback(drawTable); 

    function drawTable() { 
    var data = new google.visualization.DataTable(); 
    data.addColumn('string', 'User'); 
    data.addColumn('string', 'Text'); 
    data.addColumn('string', 'Date'); 
    data.addColumn('string', 'Time'); 
    data.addColumn('string', 'Sentiment'); 
    data.addColumn('string', 'Score'); 

    data.addRows([ 
     <?php echo(implode(",",$tablechart));?> 
    ]); 

    var table = new google.visualization.Table(document.getElementById('table_div')); 

    table.draw(data, {showRowNumber: true}); 
    } 
</script> 
+0

你必須將其插入查詢之前逃脫你的文字。如果你不逃避,不僅你會得到錯誤,而且你也容易受到SQL注入攻擊。 – 2014-09-13 12:41:14

+0

不要*刪除*單引號*,而是*轉義*他們。另外*返回蜱*不一樣*單引號* – 2014-09-13 12:42:48

+0

謝謝洛倫茲 - 所以,如果我逃避隨機文本將無所謂? – Zachary 2014-09-13 12:42:55

回答

1

如果我理解這個問題,這是不是SQL查詢的問題打破插入到數據庫,而輸出到JavaScript的數據是打破你的JavaScript?

如果是這樣,那麼這不是您需要使用add_slashes或DB層轉義方法(如mysqli_real_escape_string)的問題。

從不如果存在可用的數據序列化方案,則試圖通過在字符串中「編寫」代碼來爲另一種語言中的一種語言構建數據結構。在這種情況下,JSON是完美的。

所以,簡單地建立與數據的PHP數據結構,你的願望:

// takes $r and makes an indexed array of the values, then adds it to $tablechart 
$tablechart[] = array_values($r); 

// if $r holds more than you want to send, you could weed it out some: 
$tablechart[] = array(
    $r["handle"], 
    $r["t_text"], 
    $r["t_date"], 
    $r["t_time"], 
    $r["sentiment"], 
    $r["score"] 
); 

然後,用它來輸出到您的JS,而不是:

data.addRows(<?php echo(json_encode($tablechart);?>); 

PHP函數,json_encode(),將PHP數據序列化爲JSON。 JSON可以直接輸出到JavaScript中,因爲它使用JavaScript文字語法的子集。

永遠記住你的「代碼邊界」 - 也就是「我在哪裏,我有什麼數據,它從哪裏去?」考慮到這一點,確定數據準備方法適用於數據的目的地並使用它。在這種情況下,您需要將PHP數據結構轉換爲JS。 JSON和PHP的json_encode是爲這類事情設計的。

已經提出那些建議,這裏是我會親自重構你貼什麼:

<?php 
    $tablequery = mysqli_query($dbc,'SELECT handle, t_text, t_date, t_time, sentiment, score FROM tweets'); 

    $tablechart = array(); 

    // using mysqli_fetch_row to get indexed array since that's what the JS was wanting 
    while ($r = mysqli_fetch_row($tablequery)) { 
     $tablechart[] = $r; 
    } 
?> 

<script> 
    (function (scope, tablechart) { 
     'use strict'; 

     var document = scope.document, 
      google = scope.google; 

     google.load('visualization', '1', { 
      packages: ['table'] 
     }); 

     google.setOnLoadCallback(function() { 
      var data = new google.visualization.DataTable(), 
       table = new google.visualization.Table(document.getElementById('table_div')); 

      data.addColumn('string', 'User'); 
      data.addColumn('string', 'Text'); 
      data.addColumn('string', 'Date'); 
      data.addColumn('string', 'Time'); 
      data.addColumn('string', 'Sentiment'); 
      data.addColumn('string', 'Score'); 

      data.addRows(tablechart); 

      table.draw(data, { 
       showRowNumber: true 
      }); 
     }); 
    }(
     this, 
     <?= json_encode($tablechart) ?> 
    )); 
</script>