【问题标题】:PHP with JSON issue带有 JSON 问题的 PHP
【发布时间】:2018-10-17 15:41:46
【问题描述】:

我是 PHP 新手,遇到了一个让我发疯的问题。也许这里有人可以让我知道我做错了什么。

我有一个用户填写的信息。以下脚本使用输入到 mysql 数据库的日期来生成 json 数据:

<?php
    include("../includes.php");
    $sq = new SQL();

    $TableName = "permissions";
    $Fields = $_POST["Fields"];
    $FieldsSTR = "`" . str_replace("*;*","`,`", $Fields) . "`";
    $Join = "AND";
    $Start = 0;
    $Limit = $_POST["Limit"];
    if($Limit == "")$Limit = 1000;
    $Where = $_POST["Where"];
    $WhereSTR = "";
    if($Where !== "")$WhereSTR = str_replace("*;*"," $Join ", $Where);

    $q = "SELECT $FieldsSTR FROM `$TableName` $WhereSTR";
    $data = $sq->sqlQuery($q);
    if(sizeof($data)>0)array_shift($data);
    header("Content-Type: application/json");
    echo "[";
    foreach($data as $k=>$line){
        echo "[";
        echo "\"" . str_replace("*;*","\",\"",$line) . "\"";
        echo "]";
        if($k < sizeof($data) - 1)echo ",";
    }
    echo "]";
    exit;
?>

我遇到的问题是它已停止工作。一天还好,第二天就不行了。我在想这个问题的原因可能是疯狂的用户数据已输入数据库。在我的 foreach 语句中,我尝试替换“;”带有“
”标签,但这不起作用。

以前有人遇到过这个问题吗?也许有人可以为我指明正确的方向!

谢谢

杰森

【问题讨论】:

  • 您会在上面进行编辑以将提交到$_POST 的 HTML 表单发布吗?这看起来像是直接从表单 POST 构建 SQL,这非常危险并且容易被篡改。我还看到似乎是使用字符串操作手动构建 JSON。真的,您应该使用json_encode(),这将为您省去正确格式化和循环的所有麻烦。从您的 SQL 输出中生成有效的 JSON 真的可能像 echo json_encode($data); 一样简单。
  • 这不是您问题的答案,但您正在做的事情看起来 very insecure。我不确定您是否使用 SQL 对象包装 PDO 或 MySQLi,但您可能需要查看 prepared statements 以稍微强化您的代码。
  • "...generate json data" -- 创建所需的数据结构并使用json_encode() 生成 JSON。
  • 这就是您在那里编写的 SQL 注入。 stackoverflow.com/questions/60174/…
  • “它停止了”对我们毫无帮助。你需要做更多的调试。同样,foreach 循环也是错误的。正如其他人在您想要的结构上提到的json_encode()

标签: php json


【解决方案1】:

感谢大家的意见。我偶然发现了一个解决我眼前问题的方法。我将 foreach 循环更改为以下内容:

foreach($data as $k=>$line){
       $parts = explode("*;*",$line);
        $NEWLINE = array();
        for($i = 0;$i < sizeof($parts);$i++){
            $value = $parts[$i];
            $value = str_replace("\r","&lt;br&gt;",str_replace("\n","&lt;br&gt;",$value));
            $NEWLINE[] = "\"" . $value . "\"";
        }
        $FINDATA[] = "[" . implode(",",$NEWLINE) . "]";
    }

但我现在将研究使用 cmets 中提到的 json_encode()。

谢谢,

杰森

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    相关资源
    最近更新 更多