PDO 插入重复密钥更新

2024-03-02

发布此问题后MySQL 更新或插入或死亡查询 https://stackoverflow.com/questions/6074557/mysql-update-or-insert-or-die-query我已更改为使用 PDO,但在使用重复密钥更新短语时遇到一些问题。

这是我的数组数据的示例

array(114) {
["fname"]=>
string(6) "Bryana"
["lname"]=>
string(6) "Greene"
["m080"]=>
string(1) "c"
["t080"]=>
string(1) "-"
["w080"]=>
string(1) "-"
["r080"]=>
["notes"]=>
string(4) "yoyo"}

实际上有 113 个字段,但我不想浪费空间在这里展示它们。我目前正在尝试通过以下代码插入/更新到我的数据库中

try {
    $dbh = new PDO('login info here');
    $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    $stmt = $dbh->prepare(
        'INSERT INTO fhours ('.implode(",", array_keys($faculty)).')'.
        ' VALUES (:'.implode(",:", array_keys($faculty)).')'.
        ' ON DUPLICATE KEY UPDATE :fieldlist');

    $stmt->bindParam(':field_list', $field_list);

    foreach($faculty as $key=>$val){
        $stmt->bindParam(':'.$key, $val);
        $fields[] = sprintf("%s = :%s", $key, $key);
    }
    $field_list = join(',', $fields);
    //echo $stmt->debugDumpParams();
    $stmt->execute();
}
catch(PDOException $e){
    echo $e->getMessage();
    exit(); 
}

我收到无效参数号:参数未定义错误消息。我很确定我的问题在于ON DUPLICATE KEY UPDATE :fieldlist');但我做了很多不同的尝试,但没有一个成功。我应该使用ON DUPLICATE KEY UPDATE不再了吗?

另外,我是 : 和 :: 语法的新手,确实:name意味着它是一个命名变量,类似于$name并且确实PDOStatement::bindValue就像PDOStatement->bindValue?

Edit

为了响应下面的前两条评论,我已更新了代码(但仍然无济于事,debugDumpParams 说我没有参数)。另外,为什么要创建$array_of_parameters当它变成与完全相同的数组时$faculty首先?

  //grab form data
$faculty = $_POST;
$fname = $_POST['fname'];
$lname = $_POST['lname'];
//delete the submit button from array
unset($faculty['submit']);
$array_of_parameters = array();
foreach($faculty as $key=>$val){
        $array_of_parameters[$key] = $val;
        $fields[] = sprintf("%s=?", $key);
}
$field_list = join(',', $fields);

try {
    $dbh = new PDO('mysql:host=localhost;dbname=kiosk', 'kiosk', 'K10$k');
    $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

    $update =   'UPDATE fhours SET '.$field_list. 'WHERE fname="'.$fname.'" AND '.
                        'lname="'.$lname.'"';
    $stmt = $dbh->prepare($update);
    //echo $stmt->debugDumpParams();
    $stmt->execute(array($array_of_parameters));

    if($stmt->rowCount() == 0){
        $insert = 'INSERT INTO fhours ('.implode(",", array_keys($faculty)).')'.
                    ' VALUES (:'.implode(",:", array_keys($faculty)).')';
        $stmt = $dbh->prepare($insert);
        $stmt->execute(array($array_of_parameters));
    }
}
catch(PDOException $e){
    echo $e->getMessage();
    exit(); 
}

$dbh=null;

您尝试做的是动态构建一个将被参数化的 SQL 字符串。这:paramname参数应该是映射到列值、where 子句参数等的单个值。相反,您使用了$fields[] = sprintf("%s = :%s", $key, $key);创建一个字符串:paramname字段以便插入查询。这在参数化语句中不起作用。

而不是做ON DUPLICATE KEY UPDATE :fieldlist,您应该先构建整个 sql 字符串,然后再将其传递给prepare().

然后而不是使用bindParam()方法来单独绑定每个,您可以使用替代语法execute()传入预期参数值的数组。它们的顺序必须正确,或者数组键的名称与:paramSQL 中的参数。请参阅文档以获取更多信息和示例。 http://php.net/manual/en/pdostatement.execute.php

$array_of_parameters = array();
foreach($faculty as $key=>$val){
    $array_of_parameters[$key] = $val);
}
$stmt->execute($array_of_parameters);

EDIT要正确使用您的参数UPDATE声明,这样做:

// Create your $field_list before attempting to create the SQL statement
$field_list = join(',', $fields);

$update = 'UPDATE fhours SET '.$field_list. 'WHERE fname=:fname AND lname=:lname';
// Here, echo out $update to make sure it looks correct

// Then add the fname and lname parameters onto your array of params
$array_of_parameters[] = $_POST['fname'];
$array_of_parameters[] = $_POST['lname'];

// Now that your parameters array includes all the faculty in the correct order and the fname & lname,
// you can execute it.
$stmt->prepare($update);
$stmt->execute($array_of_parameters);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PDO 插入重复密钥更新 的相关文章

随机推荐