好的,我创建的代码是为了显示问题。 是的,我很欣赏它应该是所有学说,并且通过使用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?
答案 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'"
这使我能够做我需要做的事情,并且做得正确。