【问题标题】:Insert OR update records depending if the variable exists [duplicate]根据变量是否存在插入或更新记录[重复]
【发布时间】:2026-01-17 09:10:01
【问题描述】:

我正在尝试 insertupdate 记录,具体取决于用户 ID 是否存在。

我发现了两篇使用 PDO 的帖子,但似乎无法让它与我的代码一起使用。

如您所见,我正在使用 $stmt->rowCount() == 0 的 if else 语句。

也试过了:

a: userID == 0
b: userID == 1 with update in the if.

它将插入但不会更新的问题,反之亦然,具体取决于我的编写方式。

使用$stmt->rowCount() == 0,我得到一个致命错误:

在非对象上调用成员函数 rowCount()。

我是初学者,所以我可能做错了。

try {

if($stmt->rowCount() == 0) {
$stmt = $db->prepare('INSERT INTO books (colOne,colTwo,userID,creationDate) VALUES (:colOne, :colTwo, :userID, now())');
$stmt->execute(array(
':colOne' => $_POST['colOne'],
':colTwo' => $_POST['colTwo'],
':userID' => $_POST['userID']


));

} else {

$stmt = $db->prepare('UPDATE books SET colOne = :colOne, colTwo = :colTwo, userID = :userID, modifiedDate = NOW() WHERE userID = :userID');
$stmt->execute(array(':colOne'=>$colOne, ':colTwo'=>$colTwo, ':userID'=>$userID));

}

} catch (PDOException $e) {
echo 'PDO Exception: ' . $e->getMessage();
exit();
}

【问题讨论】:

  • 你认为我们可以想象stmt准备的查询吧?
  • 感谢发布代码的人,我使用 ON DUPLICATE KEY UPDATE 使其工作,但它已被 Your Stupid Sense 删除,这使我无法给予该人信用。它不仅仅是 ON DUPLICATE KEY UPDATE 这使得它不是重复的,但你愚蠢的感觉再次没有任何意义。无论如何,感谢那家伙写了所有的代码并发布了它。如果您想重新发布代码,我很乐意为您提供信用。我会回来看看。如果我回来查看代码时返回了代码,我将解释使它工作的额外步骤。

标签: php mysql pdo


【解决方案1】:

rowCount() 不会给你获取的记录数,因为它返回受最后一条 SQL 语句影响的行数。

详情见:http://sg3.php.net/manual/en/pdostatement.rowcount.php

你可以试试这样的:

$sql = "SELECT COUNT(*) FROM TABLE WHERE CONDITION";
if ($res = $conn->query($sql)) {

    /* Check the number of rows that match the SELECT statement */
    if ($res->fetchColumn() > 0) {
       /* UPDATE */
    } else {
      /* INSERT */
    }
}

$res = null;
$conn = null;

【讨论】:

  • 为什么投反对票?请问那个人能解释一下吗?
  • 因为“你的常识”是个白痴。我喜欢你在这里的想法。除了我需要它来查看之前是否已插入用户 ID。如果您可以将代码提供给我,您将获得功劳。
  • 第一个 SQL 查询不就是这样吗?它获取用户在表中出现的计数。 $sql = "SELECT COUNT(*) FROM TABLE WHERE CONDITION"; 只需替换相应的表名并添加您的条件然后中提琴!!
  • 是的,但我需要查看用户 ID 并确定记录是否存在...另外,由于 $res->fetchColumn() 与 $stmt- 相同,我得到了同样的错误>rowCount() ,我收到一个致命错误:调用非对象上的成员函数 rowColumn()。
  • 好吧,如果您想通过在 selet 查询中获取用户 ID 来实现这一目标,那就试试这个吧:$rows = $res->fetchAll(); $num_rows = count($rows);
最近更新 更多