【问题标题】:PHP PDO, Object, bindParamPHP PDO、对象、bindParam
【发布时间】:2014-06-17 13:41:35
【问题描述】:

我无法用 PDO 的 PHP 对象和从 JSON 文件创建的对象填充表。你看到错误来自哪里了吗? 我使用 PHP5 和 PostgreSQL

我写的代码成功添加了行,但是每行只有第一列(字段)被填充,其他保持白色。

我的表结构如下:

CREATE TABLE ' . $infoTableName . ' (field text,type text,expefactor boolean,iduser boolean,idcontext boolean,idaction boolean,params boolean,comment text)

我的对象如下所示:

object(stdClass)[3]
  public 'timestamp' => 
    object(stdClass)[4]
      public 'idagent' => boolean false
      public 'idcontext' => boolean false
      public 'idaction' => boolean false
      public 'comment' => string 'ffff' (length=4)
  public 'order' => 
    object(stdClass)[5]
      public 'idagent' => boolean false
      public 'idcontext' => boolean false
      public 'idaction' => boolean false
      public 'comment' => string 'none' (length=4)
  public 'test' => 
    object(stdClass)[6]
      public 'idagent' => boolean false
      public 'idcontext' => boolean true
      public 'idaction' => boolean false
      public 'comment' => string 'y' (length=1)

最后是 PHP 代码:

$structure = json_decode($_POST['structure']);
$query = "INSERT INTO " . $infoTableName . " (field, iduser, idcontext, idaction, comment) VALUES (:field, :idagent, :idcontext, :idaction, :comment)"; //Prequery
            $stmt = $db->prepare($query);
            $stmt->bindParam(':field', $key);
            $stmt->bindParam(':idagent', $value->idagent);
            $stmt->bindParam(':idcontext', $value->idcontext);
            $stmt->bindParam(':idaction', $value->idaction);
            $stmt->bindParam(':comment', $value->comment);


            foreach ($structure as $key => &$value) {
                try {
                    var_dump($stmt->execute());
                } catch (PDOException $e) {
                    var_dump($e->getMessage());
                }
            }

你看到错误了吗? 非常感谢。

编辑:看起来我对绑定函数中的对象提出了太多要求,不过,这里有一个小解决方法:

$stmt->bindParam(':field', $key);
            $stmt->bindParam(':idagent', $idagent);
            $stmt->bindParam(':idcontext', $idcontext);
            $stmt->bindParam(':idaction', $idaction);
            $stmt->bindParam(':comment', $comment);


            foreach ($structure as $key => &$value) {
                $idagent = $value->idagent;
                $idcontext = $value->idcontext;
                $idaction = $value->idaction;
                $comment = $value->comment;
                try {
                    var_dump($stmt->execute());
                } catch (PDOException $e) {
                    var_dump($e->getMessage());
                }
            }

bindParam() 不起作用的原因是当我遍历 $structure 时,$value 被重新实例化,导致引用被更改...我首先认为 &$value 会有所帮助,但看起来没有。

【问题讨论】:

  • 你试图在$value 被定义之前使用$value->......!?
  • 就像他们在这里做的那样:link 这是官方的 php 手册。也许这不适用于对象?

标签: php postgresql pdo


【解决方案1】:

就像他们在这里做的那样:...

不,他们没有。再看一遍:

$stmt->bindParam(':name', $name);
$name = 'one';
$stmt->execute();

他们通过引用绑定变量$name,然后为$name赋值。
另一方面,你正在做:

$stmt->bindParam(':idagent', $value->idagent);
foreach ($structure as $key => &$value) {
    $stmt->execute();
}

您正在通过引用绑定$value->idagent(我实际上不确定这是否有效,创建一个隐式对象...?!),然后您正在引用覆盖$value。如果有的话,您应该为绑定的$value->idagent 分配一个值。仅仅替换 $value 对象根本不是一回事。 PHP 并不那么智能,它会跟踪您绑定了该对象的idagent 属性,并在您切换基础对象后重新构建该属性。这有点太元了。

我认为在这种情况下,在 foreach 循环中使用 bindValue 并在其中绑定现有值是最有用的。

$stmt = $db->prepare($query);
foreach ($structure as $key => $value) {
    $stmt->bindValue(':field', $key);
    $stmt->bindValue(':idagent', $value->idagent);
    $stmt->bindValue(':idcontext', $value->idcontext);
    $stmt->bindValue(':idaction', $value->idaction);
    $stmt->bindValue(':comment', $value->comment);
    $stmt->execute()
}

【讨论】:

  • 是的,我对绑定对象值的要求太多了......但它也不能按照你的方式工作,我之前尝试过,每次都得到这个错误:“SQLSTATE [22P02]:无效的文本表示”。尽管如此,我还是做了一些解决方法。
  • 而且我不确定每次迭代时重新定义 bindValue/bindParam 是否有意义(记录方式)。
  • IMO 这是最直接的方法。除了语法之外,它几乎没有任何区别。
  • 是的,而且,实例化之前的绑定乍一看有点奇怪。
【解决方案2】:

看起来我对绑定函数中的对象提出了太多要求,不过,这里有一个小解决方法:

$stmt->bindParam(':field', $key);
            $stmt->bindParam(':idagent', $idagent);
            $stmt->bindParam(':idcontext', $idcontext);
            $stmt->bindParam(':idaction', $idaction);
            $stmt->bindParam(':comment', $comment);


            foreach ($structure as $key => &$value) {
                $idagent = $value->idagent;
                $idcontext = $value->idcontext;
                $idaction = $value->idaction;
                $comment = $value->comment;
                try {
                    var_dump($stmt->execute());
                } catch (PDOException $e) {
                    var_dump($e->getMessage());
                }
            }

bindParam() 不起作用的原因是当我遍历 $structure 时,$value 被重新实例化,导致引用被更改...我首先认为 &$value 会有所帮助,但看起来没有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-14
    • 2014-08-11
    • 2012-05-03
    • 2016-04-14
    • 2013-02-15
    • 2014-08-20
    • 2021-02-13
    • 2015-05-31
    相关资源
    最近更新 更多