【问题标题】:JS object to PHP, then INSERT via PDOJS 对象到 PHP,然后通过 PDO 插入
【发布时间】:2016-06-02 21:21:56
【问题描述】:

我有这个 JS 对象:

var planet = {
owner: 4,
name: "Mars",
loc: [3, 4],
level: 4,
baseIncome: 1000
}

我用ajax把这个对象传给PHP

postPlanets: function(planet){

    planet = JSON.stringify(planet);

    $.ajax({
        type: "POST",
        url: "postGameData.php",
        datatype: "json",
        data: {planet: planet}, 
        error: ajax.error,
        success: ajax.success,
    });

我通过 php 在 php 上解码 JSON

if (isset($_POST["planet"]{
    $planet = JSON_decode($_POST["planet"]);
}

然后我尝试使用 PDO 进行 INSERT

public function insertPlanet($planet){

    $stmt = $this->connection->prepare("
        INSERT INTO planets
            (owner, name, x, y, level, baseIncome)
        VALUES
            (:owner, :name, :x, :y, :level, :baseIncome)
    ");

    $stmt->bindParam(":owner", $planet["owner"]);
    $stmt->bindParam(":name", $planet["name"]);
    $stmt->bindParam(":x", $planet["loc"][0]);
    $stmt->bindParam(":y", $planet["loc"][1]);
    $stmt->bindParam(":level", $planet["level"]);
    $stmt->bindParam(":baseIncome", $planet["baseIncome"]);

    $stmt->execute();

    if ($stmt->errorCode() == 0){
        return true;
    }
    else {
        return false;
    }
}

但它不起作用。 我知道它一旦尝试绑定 PDO 上的第一个参数就会中断,但我不知道任何一种方式,也不知道如何调试准备好的语句。

我做错了什么?

错误返回

object(stdClass)#3 (5) {
  ["owner"]=>
  string(3) "sdf"
  ["name"]=>
  string(3) "sdf"
  ["loc"]=>
  array(2) {
    [0]=>
    int(2)
    [1]=>
    int(4)
  }
  ["level"]=>
  string(3) "sdf"
  ["baseIncome"]=>
  string(1) "f"
}
<br />
<b>Fatal error</b>:  Cannot use object of type stdClass as array in <b>D:\SecureWAMP_Portable\htdocs\projectX\DBManager.php</b> on line <b>285</b><br />

285 是第一次 BIND 尝试。

【问题讨论】:

  • 您的 json 对象引用 location 并且您在 php.ini 中引用 loc。查看var_dump($planet) 以检查您要插入/绑定的内容。
  • 这个问题的错字。无论如何,这不是错误,因为尝试绑定第一个参数(“所有者”)时代码中断
  • 您能否发布var_dump($plant) 的输出 - 您仍然可能引用错误,因此绑定失败。
  • 查看 OP 编辑​​,我添加了它。
  • 如果要将其用作关联数组,则需要将 ,true 添加到您的 JSON_decode 调用中。见here

标签: javascript php mysql pdo


【解决方案1】:

如果它是对象,我认为您可以像 $planet-&gt;owner 那样调用而不是像数组 $planet['owner']。

【讨论】:

  • 天哪,这么明显的错误浪费了这么多时间。谢谢。
【解决方案2】:

您已将数据解码为stdObject 类型,如下所示:

if (isset($_POST["planet"]{
    $planet = JSON_decode($_POST["planet"], true);
}

这样您就可以将对象作为一个数组。 stdObject 表示您可以访问您的数据,例如:$planet-&gt;owner 而不是 $planet["owner"]。这就是 json_decode 的第二个 true 参数的用途。

【讨论】:

  • 谢谢。另一个人更快,但我给了你+1。谢谢!
  • 没问题,尽管我的解决方案无需修改任何代码即可工作。
猜你喜欢
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 2014-08-13
  • 2016-07-10
  • 1970-01-01
相关资源
最近更新 更多