【问题标题】:check pdo php insert success检查 pdo php 插入是否成功
【发布时间】:2018-03-30 01:06:34
【问题描述】:
$hpaystmt = $con->_con->prepare(".....");

object(PDOStatement)#7 (1) { ["queryString"]=> string(1515) " INSERT INTO hpay ( enccode, orno, hpercode, acctno, amt, curcode, paytype, paycode, entryby, payctr, chrgcode , itemcode, chrgtbl) 值 ('000060000000000101783710/14/201722:00:00', '00000000033', '000000001017837', '2017-000165903', '1500', '',',', ', '1', 'DR', 'DR1', 'MISC') "}====object(PDOStatement)#8 (1) { ["queryString"]=> string(1517) " INSERT INTO hpay ( enccode, orno, hpercode, acctno, amt, curcode, paytype, paycode, entryby, payctr, chrgcode, itemcode, chrgtbl) 值 ('000060000000000101783710/14/201722:00:00', '00000000033', '00000000171', -000165903', '100', 'PESO', 'F', 'C', '', '2', 'BIRTC', '085', 'MISC') "}

我从

得到上面的代码
ini_set('display_errors', 1);
var_dump($hpaystmt);
$hpayinsert = $hpaystmt->execute();
echo "==";
echo $hpaystmt->execute() === TRUE ;
echo "==";

我的目标是检查插入是否成功,但echo $hpaystmt->execute() === TRUE ; 这一行总是返回空白,这就是为什么我总是得到 }==== 在回声中;

我没有从显示错误中得到任何错误,而且我将它包装在 try catch 中,我总是进入 try 部分而不是 catch。

如何检查是否成功插入?

其他信息:

我想检查是否成功,如果失败,我想回滚数据库,我的 var $hpayinsert 设置为 $hpayinsert = true;在插入之前。然后在我检查真假之后,根据该变量的值提交或回滚。

更新:

在输入print_r($hpaystmt->errorInfo()); 后我得到:

Array( [0] => 22001 [1] => 8152 [2] => [Microsoft][ODBC SQL Server Driver][SQL Server]字符串或二进制数据将被截断。(SQLExecute[8152] at ext \pdo_odbc\odbc_stmt.c:254) [3] => 22001)Array( [0] => 22001 [1] => 8152 [2] => [Microsoft][ODBC SQL Server Driver][SQL Server]String 或二进制数据将被截断。(SQLExecute[8152] at ext\pdo_odbc\odbc_stmt.c:254)[3] => 22001)

【问题讨论】:

  • 试试 print_r($hpaystmt->errorInfo());
  • 我认为您的代码有效。你能做 echo $hpaystmt->execute() === true 吗? “真”:“假”
  • 我会更新@IuriiDrozdov
  • 你在做execute 两次。你应该只做一次。如果您需要检查结果,则存储结果或内联比较。在这种情况下,您将检查 $hpayinsert 而不是第二次执行
  • "字符串或二进制数据将被截断。" - 这是你的错误信息。检查您的数据库。确保您的数据库字段足够大以容纳您尝试插入的数据。

标签: php sql-server pdo


【解决方案1】:

你不需要它。

在 PDO 中处理插入操作的结果有三种可能的场景:

  1. 表示成功,无需验证。只需保持您的程序流程即可。
  2. 要处理意外错误,保持不变 - 不需要立即处理代码。如果发生数据库错误,则会引发异常,并且会冒泡到站点范围的错误处理程序,最终会导致常见的 500 错误页面。
  3. 要处理预期的错误,例如重复的主键,如果您有特定的场景来处理这个错误 - 然后使用 try..catch 运算符。

对于普通的 PHP 用户来说,这听起来有点陌生 - 怎么样,不是为了验证操作的直接结果? - 但这就是 exceptions 的工作方式 - 你在别处检查错误。一次就好。非常方便。

因此,在一般情况下,您根本不需要任何处理代码。保持你的代码不变。

我在PHP error reporting basics上写了一篇文章详细解释了这件事,你可能会觉得有用

只有在您有处理场景而不只是报告错误时,您才能捕获错误。例如回滚事务。代码取自我的PDO tutorial

try {
    $pdo->beginTransaction();
    $stmt = $pdo->prepare("INSERT INTO users (name) VALUES (?)");
    foreach (['Joe','Ben'] as $name)
    {
        $stmt->execute([$name]);
    }
    $pdo->commit();
}catch (Exception $e){
    $pdo->rollback();
    throw $e;
}

【讨论】:

  • 我想检查是否成功,如果失败,我想回滚数据库,我的 var $hpayinsert 在插入之前设置为 $hpayinsert = true;。然后在我检查真假之后,根据该变量的值提交或回滚。你是说我不需要那个?如何回滚和提交?
  • @Martin 你应该在你的问题中说明它。查看更新的答案。
  • @最后一个问题。目前我检查回滚的方式是执行 if 条件。如果我这样做,插入中的任何失败都会进入捕获部分?说我有多个插入语句,我需要它们都成功然后提交?
  • @Martin 这正是处理异常事务的工作方式。如果其中一个语句失败,它们打算回滚。
  • @Martin 一定要检查我提供的链接。有一个清单可以确保您的交易在错误时回滚
【解决方案2】:

也许可以尝试一下

ini_set('display_errors', 1);
var_dump($hpaystmt);
try{
  $hpaystmt->execute();
  echo "It's a success";
}
catch(Exception $e)
{
  echo "Something went wrong";
}

【讨论】:

  • 不要捕获异常只是说出了点问题
猜你喜欢
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 2010-12-12
  • 2022-11-10
  • 1970-01-01
相关资源
最近更新 更多