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

我正在使用PDO插入一个logging(MySQL和PHP)

$stmt->bindParam(':field1', $field1, PDO::PARAM_STR); $stmt->bindParam(':field2', $field2, PDO::PARAM_STR); $stmt->execute(); 

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

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

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

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

鉴于PDO最推荐的错误模式是ERRMODE_EXCEPTION直接execute()结果validation将无法正常工作 。 由于代码执行甚至不会达到其他答案中提供的条件。

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

  1. 为了说明成功,不需要validation。 只要保持你的程序stream。
  2. 要处理意外错误, 请保持不变 – 不需要立即处理代码。 在发生数据库错误时会抛出一个exception,并且会冒泡到站点范围的error handling程序,最终导致一个常见的500错误页面。
  3. 要处理预期的错误,就像重复的主键一样, 如果你有一个特定的场景来处理这个错误 – 那么就使用try..catch操作符。

对于一个普通的PHP用户来说,这听起来有些陌生 – 怎么样,而不是validation操作的直接结果? – 但这是exception情况的工作方式 – 你在其他地方检查错误。 一次就好。 非常方便。

所以,在一般情况下,你根本不需要任何处理代码。 只要保持你的代码是这样的:

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

成功之后,它会告诉你,错误的时候会显示你的应用程序正在显示的常规错误页面。

只有在处理scheme不是只报告错误的情况下,把你的insert语句放到一个try..catch操作符中,检查它是否是你期望的错误并处理它; 或者 – 如果错误是任何不同的话 – 重新抛出exception,以便通过站点范围的error handling程序来处理通常的方式。 下面是我的关于使用PDO进行error handling的文章中的示例代码:

 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, ie duplicate name } else { throw $e; } } echo "Success!"; 

在上面的代码中,我们正在检查特定的错误来采取一些行动,并重新抛出任何其他错误(例如没有这样的表),将被报告给程序员的exception。

虽然再次 – 只是告诉用户像“您的插入是成功的” 没有条件是永远需要的。

尝试查看execute的返回值,成功时为TRUE ,失败时为FALSE

如果更新查询使用匹配当前数据库logging的值执行,则$stmt->rowCount()将返回0因为没有行受到影响。 如果你有一个if( rowCount() == 1 )来testing成功,你会认为更新失败,当它没有失败,但值已经在数据库中,所以没有任何改变。

 $stmt->execute(); if( $stmt ) return "success"; 

当我尝试更新一个违反了唯一键字段的logging时,这并不适用于我。 查询返回成功,但另一个查询返回旧的字段值。

PDOStatement-> execute()会抛出exception

所以你可以做的是

 try { PDOStatement->execute(); //record inserted } catch(Exception $e) { //Some error occured. (ie violation of constraints) } 

你可以testing行数

  $sqlStatement->execute( ...); if ($sqlStatement->rowCount() > 0) { return true; } 

使用id作为主键与自动增量

 $stmt->execute(); $insertid = $conn->lastInsertId(); 

即使在第一个logging上,增量ID总是大于零,这意味着它总是会返回一个真实的值,因为id大于零意味着在PHP中为true

 if ($insertid) echo "record inserted successfully"; else echo "record insertion failed";