Php 在那一点上的程序步骤。尝试跟踪错误日志。是否已为PDO实例启用异常抛出$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常)是的,我已经把它放在连接类(Singleton)的_构造()中:$this->d
Php 在那一点上的程序步骤。尝试跟踪错误日志。是否已为PDO实例启用异常抛出$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常)是的,我已经把它放在连接类(Singleton)的_构造()中:$this->d,php,exception,transactions,pdo,Php,Exception,Transactions,Pdo,在那一点上的程序步骤。尝试跟踪错误日志。是否已为PDO实例启用异常抛出$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常)是的,我已经把它放在连接类(Singleton)的_构造()中:$this->dbh=new-PDO(…)$这->dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常)如果我在SQL代码中有错误,我会抛出一个异常。尝试引发该异常,看看它是否真的有效。另外,如果事务失败,您希
在那一点上的程序步骤。尝试跟踪错误日志。是否已为PDO实例启用异常抛出<代码>$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常)代码>是的,我已经把它放在连接类(Singleton)的_构造()中:
$this->dbh=new-PDO(…)$这->dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常)
如果我在SQL代码中有错误,我会抛出一个异常。尝试引发该异常,看看它是否真的有效。另外,如果事务失败,您希望抛出哪个特定的异常?在您的代码中,它是非特定的异常。所以你能添加一些引用吗?这很奇怪,但是我没有得到一个异常,即使我在SQL代码中有一个错误。所以我需要修改我的代码。你为你的PDO实例启用了异常抛出吗<代码>$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常)代码>是的,我已经把它放在连接类(Singleton)的_构造()中:$this->dbh=new-PDO(…)$这->dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常)
如果我在SQL代码中有错误,我会抛出一个异常。尝试引发该异常,看看它是否真的有效。另外,如果事务失败,您希望抛出哪个特定的异常?在您的代码中,它是非特定的异常。所以你能添加一些引用吗?这很奇怪,但是我没有得到一个异常,即使我在SQL代码中有一个错误。所以我需要修改我的代码。你能做一个var\u转储($stmt)代码>初始分配之后?那些多个查询语句很混乱,我很好奇它是否有效。我试着一次做一个查询,结果它有效。在这种情况下,如果查询中有错误,就会抛出异常。例如,如果我只保留INSERT查询并尝试为PK字段创建一个重复条目,我会得到以下异常SQLSTATE[23000]:完整性约束冲突:1062重复条目'5th'用于键'reference'文件-C:\…\classes\NestedSet.php行-187
,您是否在同一事务中都有这些语句?是的,在一个事务中有多个已准备语句(每个已准备语句一个查询)起作用,而一个已准备语句中有多个查询不起作用。这取决于您所说的“解决”是什么意思。一方面是的。我刚刚使用multiquery将准备好的语句拆分为一个事务中的几个语句(每个准备好的语句一个查询)。另一方面,没有。我无法在事务中使用multiquery生成一条准备好的语句。显然这是一个PDO错误。这里有一个关于这个问题的例子。你能做一个var\u转储($stmt)代码>初始分配之后?那些多个查询语句很混乱,我很好奇它是否有效。我试着一次做一个查询,结果它有效。在这种情况下,如果查询中有错误,就会抛出异常。例如,如果我只保留INSERT查询并尝试为PK字段创建一个重复条目,我会得到以下异常SQLSTATE[23000]:完整性约束冲突:1062重复条目'5th'用于键'reference'文件-C:\…\classes\NestedSet.php行-187
,您是否在同一事务中都有这些语句?是的,在一个事务中有多个已准备语句(每个已准备语句一个查询)起作用,而一个已准备语句中有多个查询不起作用。这取决于您所说的“解决”是什么意思。一方面是的。我刚刚使用multiquery将准备好的语句拆分为一个事务中的几个语句(每个准备好的语句一个查询)。另一方面,没有。我无法在事务中使用multiquery生成一条准备好的语句。显然这是一个PDO错误。这里有一个关于这个问题的例子。
$conn->dbh->beginTransaction();
$stmt = $conn->dbh->prepare('some SQL-code');
$stmt->bindValue(...);
try
{
$stmt->execute();
$conn->dbh->commit();
}
catch (Exception $e)
{
$dbh->rollBack();
echo $e->getMessage();
}
...
try
{
$stmt->execute();
}
catch (Exception $e)
{
$dbh->rollBack();
echo $e->getMessage();
}
$conn->dbh->commit();
Class Connection
{
public $dbh;
private static $instance;
private function __construct()
{
$config = parse_ini_file('config.ini');
$dsn = $config['db.dbms'] . ':host=' . $config['db.host'] .
';dbname=' . $config['db.dbname'] .
';port=' . $config['db.port'] .
';connect_timeout=15';
$this->dbh = new PDO($dsn, $config['db.user'], $config['db.password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
public static function getInstance()
{
if (!isset(self::$instance))
{
$object = __CLASS__;
self::$instance = new $object;
}
return self::$instance;
}
}
Class NestedSet
{
public function insertAsLastChildOf ($parentnode)
{
$fields = '';
$params = '';
$conn = Connection::getInstance();
$conn->dbh->beginTransaction();
foreach ($this->_modelfields as $field => $type)
{
$fields .= '`'.$field.'`, ';
$params .= ':'.$field.', ';
}
$stmt = $conn->dbh->prepare('UPDATE `' . $this->_tablename . '`
SET `rgt` = `rgt` + 2
WHERE `rgt` >= :parentnodergt;
UPDATE `' . $this->_tablename . '`
SET `lft` = `lft` + 2
WHERE `lft` > :parentnodergt;
INSERT INTO `' . $this->_tablename . '`
(' . $fields . '
`lft`,
`rgt`,
`level`)
SELECT
' . $params . '
`rgt` - 2,
`rgt` - 1,
`level` + 1
FROM `' . $this->_tablename . '`
WHERE `id` = :parentnodeid;');
foreach ($this->_modelfields as $field => $type)
{
$pdoparam = (stripos($type, 'int') === 0) ? PDO::PARAM_INT : PDO::PARAM_STR;
$stmt->bindValue(':'.$field.'', $this->$field, $pdoparam);
}
$stmt->bindValue(':parentnodergt', $parentnode->rgt, PDO::PARAM_INT);
$stmt->bindValue(':parentnodeid', $parentnode->id, PDO::PARAM_INT);
try
{
$stmt->execute();
$conn->dbh->commit();
}
catch (PDOException $e)
{
$conn->dbh->rollBack();
echo $e->getMessage() . '<br/> file - ' . __FILE__ . '<br/> line - ' . __LINE__ . '<br/>';
}
unset($stmt);
}
}
$stmt_1 = $conn->dbh->prepare('UPDATE `' . $this->_tablename . '`
SET `rgt` = `rgt` + 2
WHERE `rgt` >= :parentnodergt;');
$stmt_1->bindValue(':parentnodergt', $parentnode->rgt, PDO::PARAM_INT);
$stmt_2 = $conn->dbh->prepare('UPDATE `' . $this->_tablename . '`
SET `lft` = `lft` + 2
WHERE `lft` > :parentnodergt;');
$stmt_2->bindValue(':parentnodergt', $parentnode->rgt, PDO::PARAM_INT);
$stmt_3 = $conn->dbh->prepare('INSERT INTO `' . $this->_tablename . '`
(' . $fields . '
`lft`,
`rgt`,
`level`)
SELECT
' . $params . '
`rgt` - 2,
`rgt` - 1,
`level` + 1
FROM `' . $this->_tablename . '`
WHERE `id` = :parentnodeid;');
foreach ($this->_modelfields as $field => $type)
{
$pdoparam = (stripos($type, 'int') === 0) ? PDO::PARAM_INT : PDO::PARAM_STR;
$stmt_3->bindValue(':'.$field.'', $this->$field, $pdoparam);
}
$stmt_3->bindValue(':parentnodeid', $parentnode->id, PDO::PARAM_INT);
try
{
$stmt_1->execute();
$stmt_2->execute();
$stmt_3->execute();
$conn->dbh->commit();
}
catch (PDOException $e)
{
$conn->dbh->rollBack();
echo $e->getMessage() . '<br/> file - ' . __FILE__ . '<br/> line - ' . __LINE__ . '<br/>';
}
unset($stmt);