9

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

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);我们如何使这个功能一起工作。

4

5 回答 5

20

您正在分配$pro给准备,而不是执行语句。

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

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

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

编辑:这个 mysql 语法适用于存在键(主键或另一个唯一键)的情况,并且会导致插入失败。

于 2012-09-05T14:31:30.833 回答
2

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

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

于 2012-09-05T14:34:06.970 回答
0

您首先需要执行它。

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

于 2012-09-05T14:31:03.337 回答
0

尝试,

    PDO::exec() 

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

对于准备好的陈述,

    PDOStatement::execute() 

你可以试试,

    PDOStement::rowCount()
于 2012-09-05T14:36:48.790 回答
0

以下是 PHPPDO帮助函数INSERTUPDATE

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;
}

}
于 2021-08-13T07:46:30.390 回答