【问题标题】:Php Update using PDO使用 PDO 进行 PHP 更新
【发布时间】:2015-12-27 15:00:59
【问题描述】:

我正在尝试构建一个自定义类来管理数据库操作。我是 OOP 的初学者,所以如果您有任何建议,请告诉我。顺便说一句,我有一个更新方法,它以表的名称、要更新的字段、要更新字段的值以及要放入查询的 where 子句的字段和值作为参数。 此时,我有两个不同的数组,一个用于 set 部分,一个用于 where 部分。 我像这样构建查询字符串PDOStatement Object ( [queryString] => UPDATE Ordini SET Nome=':Nome', Cognome=': Cognome', Telefono=': Telefono' WHERE ID=':ID' )

现在我想将参数绑定到变量并执行查询,这就是问题所在。我尝试这种方式,但查询不更新字段。 - 在 $values 中,我有我想要绑定到 SET 部分中的变量的值 - 在 $wv 中,我有我想要绑定到 WHERE 部分中的变量的值 - 在 $fieldsQuery 我有 SET 部分的占位符(例如“:Nome”) - 在 $fieldsWhere 我有 WHERE 部分的占位符

如何以正确的方式将占位符与变量绑定?

public function update($table=NULL, $fieldsQuery=NULL, $fieldsValues = NULL, $whereFields=NULL, $whereValues=NULL, $whereOperators = NULL)
{
    if($fieldsQuery != NULL)
        $fields = explode(",", $fieldsQuery);
    if($fieldsValues != NULL)
        $values = explode(",", $fieldsValues);
    if($whereFields != NULL)
        $wf = explode(",", $whereFields);
    if($whereValues != NULL)
        $wv = explode(",", $whereValues);

    $fieldsQuery = array_map(function($field) { return ":$field";}, $fields);
    $bindValuesSet = array_combine($fieldsQuery, $values);
    //return an array in which every field is => Fieldname=':Fieldname' 
    $bindSetInitial = array_combine($fields, $fieldsQuery);


    //transform every item in array from field to :field
    $fieldsWhere = array_map(function($field) { return ":$field";}, $wf);
    $bindValuesWhere = array_combine($fieldsWhere, $wv);
    $bindWhereInitial = array_combine($wf, $fieldsWhere);

    //implode an array mantaining both key and value
    $fieldsValues = implode(', ', array_map(function ($v, $k) { return sprintf("%s='%s'", $k, $v); }, $bindSetInitial, array_keys($bindSetInitial)));
    $fieldsWhere = implode(', ', array_map(function ($v, $k) { return sprintf("%s='%s'", $k, $v); }, $bindWhereInitial, array_keys($bindWhereInitial)));

    $query = $this->db->prepare('UPDATE ' . $table . ' SET ' . $fieldsValues . ' WHERE ' . $fieldsWhere);

    $query->bindParam(':Nome', $values[0]);
    $query->bindParam(':Cognome', $values[1]);
    $query->bindParam(':Telefono', $values[2]);
    $query->bindParam(':ID', $wv[0], PDO::PARAM_INT);

    $query->execute();
    print_r($query->debugDumpParams());
}

【问题讨论】:

  • ': Cognome' 等中不应有任何引号,并且那里有空格等。检查错误php.net/manual/en/pdo.error-handling.php
  • 我怀疑implode(', ', 中的空格和return sprintf("%s='%s'", 中的引号 - 您需要删除它们。
  • 首先感谢您的帮助!我删除了引号。现在查询字符串看起来像这样 UPDATE Ordini SET Nome=:Nome, Cognome=: Cognome, Telefono=: Telefono WHERE ID=:ID。我正在寻找空间问题
  • 准备。在您的构建中的某处添加了空间,我怀疑在 implode(', ', 中,所以在两者中尝试 implode(',',
  • 空格以explode 出现,而​​不是implode。用, 分解'Nome, Cognome' 得到Nome[space]Cognome

标签: php mysql pdo


【解决方案1】:

':Nome' 不是准备好的语句的占位符。只是一个字符串':Nome'

占位符是:Nome(不带`)并且不带任何空格、制表符等。 IE。 : Nome不是占位符

所以,你的查询应该是:

UPDATE Ordini SET Nome=:Nome, Cognome=:Cognome, Telefono=:Telefono WHERE ID=:ID

感谢@Fred-ii--阅读error handling section of PDO

【讨论】:

  • 当然,但这并不能解决问题。问题在于他们的构建中以某种方式添加了引号和空格,而我还没有弄清楚。
  • 这里sprintf("%s='%s'", $k, $v) 我想。空格来自explodetrim 不是我们的朋友。
  • 我在他们问题下的评论中说过。
  • 非常感谢!我修复了它和其他一些东西,它有效!现在我要改进它!
猜你喜欢
  • 1970-01-01
  • 2019-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
相关资源
最近更新 更多