PDO mysql:如何知道插入是否成功

Chr*_*ris 87 php mysql database pdo

我正在使用PDO插入记录(mysql和php)

$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)

有没有办法知道它是否成功插入,例如,如果没有插入记录,因为它是重复的?

编辑:当然我可以查看数据库,但我的意思是程序化反馈.

Óla*_*age 125

PDOStatement->execute()成功时返回true.还有PDOStatement->errorCode(),你可以检查错误.

  • 不再这样,$ value = $ stmt-> execute(); 如果($值){//真}其他{//假} (26认同)
  • 或者你可以做`if($ stmt-> execute()){// true}` (21认同)
  • 这是如何接受的答案,“你的常识”的答案是正确的,插入通常会抛出致命错误,如何用 if() 语句处理致命错误? (3认同)
  • `PDOStatement-> execute()`和`PDOStatement-> errorCode()`是否完全一致?有什么情况``PDOStatement-> errorCode()`有什么东西,但`PDOStatement-> execute()`返回true?或者当`PDOStatement-> execute()`返回false但是`PDOStatement-> errorCode()`什么都没有? (2认同)
  • 但即使没有插入新记录,INSERT IGNORE 也会返回 true (2认同)

You*_*nse 23

不知道为什么没有正确答案.

鉴于PDO最常推荐的错误模式是ERRMODE_EXCEPTION,直接execute()结果验证不会起作用.因为代码执行甚至不会达到其他答案中提供的条件.

因此,在PDO中处理插入操作的结果有三种可能的方案:

  1. 为了说明成功,不需要验证.只需保持您的程序流程.
  2. 要处理意外错误,请保持相同 - 不需要立即处理代码.如果出现数据库错误,将抛出异常,并且它将冒泡到站点范围的错误处理程序,最终将导致共同的500错误页面.
  3. 要处理预期的错误,例如重复的主键,并且如果您有某个场景来处理这个错误 - 那么请使用try..catch运算符.

对于普通的PHP用户来说,它听起来有些陌生 - 怎么样,不是为了验证操作的直接结果?- 但这是异常的工作原理 - 你在其他地方检查错误.一次就好.非常方便.

因此,在常规情况下,您根本不需要任何处理代码.只需保持您的代码:

$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();
echo "Success!"; // whatever
Run Code Online (Sandbox Code Playgroud)

成功后它会告诉你,如果出错,它会显示你的应用程序为这种场合显示的常规错误页面.

只有在你有一个处理方案而不仅仅是报告错误的情况下,将你的insert语句放在一个try..catch操作符中,检查它是否是你预期的错误并处理它; 或者 - 如果错误有任何不同 - 重新抛出异常,以便可以通过常规方式由站点范围的错误处理程序处理.以下是我的文章中有关PDO错误处理的示例代码:

try {
     $pdo->prepare("INSERT INTO users VALUES (NULL,?,?,?,?)")->execute($data);
} catch (PDOException $e) {
    if ($e->getCode() == 1062) {
        // Take some action if there is a key constraint violation, i.e. duplicate name
    } else {
        throw $e;
    }
}
echo "Success!";
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我们检查特定错误以采取某些操作并重新抛出任何其他错误(例如,没有这样的表)的异常,这将报告给程序员.

同样 - 只是告诉用户类似"你的插入成功"的东西,不需要任何条件.

  • 您不应该首先使用query()进行插入.插入意味着有输入和输入意味着它应该准备好. (3认同)
  • “成功”是什么意思?这是否意味着插入了新行,还是意味着没有任何错误? (2认同)

Dom*_*ger 9

尝试寻找的返回值execute,这是TRUE成功,而FALSE失败.


小智 9

如果更新查询使用与当前数据库记录匹配的值执行,$stmt->rowCount()则将返回,0因为没有行受到影响.如果您if( rowCount() == 1 )要测试成功,您会认为更新失败但没有失败,但值已经在数据库中,因此没有任何变化.

$stmt->execute();
if( $stmt ) return "success";
Run Code Online (Sandbox Code Playgroud)

当我尝试使用违反的唯一键字段更新记录时,这对我不起作用.查询返回成功,但另一个查询返回旧字段值.

  • 如果您需要插入记录,最好的方法是检查这样............................. ..... ..................`if($ stmt-> execute()&&($ stmt-> rowCount()> 0))` (3认同)

cra*_*ter 7

您可以测试行数

    $sqlStatement->execute( ...);
    if ($sqlStatement->rowCount() > 0)
    {
        return true;
    }
Run Code Online (Sandbox Code Playgroud)