Doctrine和PDO没有给出相同的结果

时间:2016-05-23 21:51:56

标签: php symfony pdo doctrine-orm

好的,我创建的代码是为了显示问题。 是的,我很欣赏它应该是所有学说,并且通过使用PDO,它使整个学说的事情变得毫无意义。

更重要的是,我试图理解为什么两个人不匹配。

基本上,第一个PDO查询返回:70行计数和140 Max ID。 第二个PDO查询返回相同的70行计数和140 Max ID。 问题是,两者之间的学说插入使其成为71和141。

为什么第二个PDO查询说明反映了这个?

如果我在单独的PHP页面或Workbench中运行查询,则返回71/141。它只是在执行页面内。

$userID = $enUser->getId();
$stmt1 = $this->pdoConnection->getConnection()->prepare('
  SELECT  COUNT(UT.ID) AS UTC,
          MAX(UT.ID) AS UTMID
  FROM    UserThing UT
  WHERE   UT.User_ID = :userID;
' ) or die ( implode( ':', $stmt1->errorInfo(  ) ) );

$stmt1->bindParam( ':userID', $userID, \PDO::PARAM_INT, 11 );
$results = $this->pdoConnection->dbRecSet( $stmt1, false );
$stmt1->closeCursor();
unset($stmt1);
var_dump($results);

$newUserThing = new UserThing();
$newUserThing->setUserThingThings( $enThing );
$newUserThing->setUserThingUsers( $enUser );
$newUserThing->setAttainedDate( new \DateTime() );
$this->em->persist( $newUserThing );
$this->em->flush();
$userThingID = $newUserThing->getId();

echo $userThingID;

$stmt2 = $this->pdoConnection->getConnection()->prepare('
  SELECT  COUNT(UT.ID) AS UTC,
          MAX(UT.ID) AS UTMID
  FROM    UserThing UT
  WHERE   UT.User_ID = :userID;
' ) or die ( implode( ':', $stmt2->errorInfo(  ) ) );
$stmt2->bindParam( ':userID', $userID, \PDO::PARAM_INT, 11 );
$results = $this->pdoConnection->dbRecSet( $stmt2, false );
$stmt2->closeCursor();
unset($stmt2);
var_dump($results);

为什么第二个PDO查询没有反映数据库更改的任何想法,即使Doctrine能够返回新插入的ID?

1 个答案:

答案 0 :(得分:0)

在发布此帖子时,我没有想到的一点是,我的PDO类使用了与Symfony不同的连接字符串。

为了能够支持从单个查询返回的多个记录集,我的类使用不同的驱动程序选项作为默认值。所以我把这个课程移植到Symfony并使用它并且它很长时间都运行良好。

也就是说,在一个连接上进行插入/更新并在另一个连接上直接读取后效果不佳。这是我在这里找到的问题。

关于PDO驱动程序选项的Symfony文档有点缺乏。对于任何面对它的人来说,你需要知道的是PDO常量只需要在YML中使用它们的Integer等价物。 所以你最终会在你的app / config / config.yml中找到这样的东西:

options:
    20: true
    3: 1
    1002: "SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'"

这使我能够做我需要做的事情,并且做得正确。

相关问题