【问题标题】:PHP PDO simple insert or update functionPHP PDO 简单插入或更新函数
【发布时间】:2012-08-30 07:25:18
【问题描述】:

在尝试创建一个简单的 PHP PDO 更新函数,如果找不到该字段会插入它,我创建了这个小 sn-p。

function updateorcreate($table,$name,$value){
    global $sodb;
    $pro = $sodb->prepare("UPDATE `$table` SET value = :value WHERE field = :name");
    if(!$pro){
        $pro = $sodb->prepare("INSERT INTO `$table` (field,value) VALUES (:name,:value)");
    }
    $pro->execute(array(':name'=>$name,':value'=>$value));
}

虽然更新功能是否适用于if(!$pro);,但它不会检测到我们如何使这个功能起作用。

【问题讨论】:

  • 我还在适应它,但不会回到 mySQL
  • 您首先需要 execute() 它,然后才能判断更新是否导致使用 numRows() 更新行,但如果该字段已经存在且具有相同的值,您也可能会得到意想不到的结果.
  • 更新查询没有报错,它是一个有效的查询,不会更新任何记录。
  • @Lex 但他只在底部执行他的第一个查询,所以 if 条件没用。

标签: php pdo insert-update


【解决方案1】:

以下是 INSERTUPDATE 的 PHP PDO 辅助函数

INSERT函数:

function basicInsertQuery($tableName,$values = array()){

/*
//
USAGE INSERT FUNCTİON
    $values = [
        "column" => $value,               
    ];
    $result =  basicInsertQuery("bulk_operations",$values);
*/

try {
    global $pdo;

    foreach ($values as $field => $v)
        $vals[] = ':' . $field;

    $ins = implode(',', $vals);
    $fields = implode(',', array_keys($values));
    $sql = "INSERT INTO $tableName ($fields) VALUES ($vals)";

    $rows = $pdo->prepare($sql);
    foreach ($values as $k => $vl)
    {
        $rows->bindValue(':' . $k, $l);
    }
    $result = $rows->execute();
    return $result;
} catch (\Throwable $th) {
   return $th;
}    
}

UPDATE函数:

function basicUpdateQuery($tableName,  $values = array(), $where = array()) {

/*
*USAGE UPDATE FUNCTİON

    $valueArr = [ column => "value",  ];
    $whereArr = [ column => "value",  ];
    $result = basicUpdateQuery("bulk_operations",$valueArr, $whereArr);
*/
try {        
    global $pdo;

    //set value
    foreach ($values as $field => $v)
        $ins[] = $field. '= :' . $field;
    $ins = implode(',', $ins);

    //where value
    foreach ($where as $fieldw => $vw)
        $inswhere[] = $fieldw. '= :' . $fieldw;
    $inswhere = implode(' && ', $inswhere);


    $sql = "UPDATE  $tableName SET $ins WHERE $inswhere";    
    $rows = $pdo->prepare($sql);
    foreach ($values as $f => $v){
        $rows->bindValue(':' . $f, $v);
    }
    foreach ($where as $k => $l){
        $rows->bindValue(':' . $k, $l);
    }
    $result = $rows->execute();

    return $result;
} catch (\Throwable $th) {
    return $th;
}

}

【讨论】:

    【解决方案2】:

    您将$pro 分配给prepare,而不是execute 语句。

    话虽如此,如果您使用的是 mysql,则可以使用 insert... on duplicate key update 语法。

    insert into $table (field, value) values (:name, :value) on duplicate key update value=:value2
    

    您不能两次使用相同的绑定参数,但可以将两个绑定参数设置为相同的值。

    编辑:此 mysql 语法在存在键(主键或其他唯一键)的情况下有效,并会导致插入失败。

    【讨论】:

    • 这是我试过的:function updateorcreate($table,$name,$value){ global $sodb; $pro = $sodb->prepare("INSERT INTO $table (field, value) values (:name, :value) ON DUPLICATE KEY update value = :value2"); $pro->execute(array(':name'=>$name,':value'=>$value,':value2'=>$value)); }
    • @RobinKnight 抱歉,我应该马上提到它,您确实在表上为 field 列设置了唯一约束@ 是吗?
    • 不,也许我应该这样做,因为他们没有理由重复
    • @RobinKnight 对不起那个伙伴,是的,语法只有在列受到约束时才有效。抱歉,应该从一开始就提到这一点:(
    • PDO 确实需要允许你使用相同的参数两次。
    【解决方案3】:

    试试,

        PDO::exec() 
    

    如果插入则返回 1。 2 如果行已更新。

    对于准备好的语句,

        PDOStatement::execute() 
    

    你可以试试,

        PDOStement::rowCount()
    

    【讨论】:

      【解决方案4】:

      如果是 mysql-only,你可以尝试 INSERT INTO ... ON DUPLICATE KEY UPDATE

      http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

      【讨论】:

        【解决方案5】:

        您首先需要执行它。

        除此之外,这是一种狡猾的做法。最好先启动一个事务,执行一个 SELECT,然后确定要做什么(INSERT 或 UPDATE)。仅仅检查 UPDATE 查询是否成功是不够的,当没有找到行时它也成功。

        【讨论】:

        • 好的,我想看看我们是否可以绕过这一步,但如果它不安全,那么我不会
        • SELECT 也是一种相当狡猾的方式。最好在字段上有一个唯一键,然后使用INSERT ... ON DUPLICATE KEY UPDATE ...
        • 我从未读过他想完全避免重复。他只是在这种特殊情况下不想要它。
        猜你喜欢
        • 2015-07-28
        • 2011-04-15
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 2017-04-21
        • 2014-12-06
        • 2017-11-04
        相关资源
        最近更新 更多