MySQL / PHP / Javascript - 回声文本中的撇号导致错误

时间:2014-09-13 12:38:39

标签: javascript php mysql

我目前使用mysql / php / javascript / googlecharts制作图表。

我的文字'然而,当我在Google Charts的Javascript中回显它时,该列会继续转义。 我需要在哪里放入一个真正的转义字符串来解决这个问题?

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>

1 个答案:

答案 0 :(得分: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>