-3
我有一个PHP PDO事务处理比插入一行然后选择它。当INSERT操作完成时,我调用另一个执行SELECT的函数。问题是SELECT在被调用函数内执行时没有返回先前插入的行。
这里有代码:
INSERT后PHP PDO事务选择问题
class FinderMyTable {
function myfunction(...) {
$db = DatabaseManager::getInstance()->getConnection();
$db->beginTransaction();
try {
$dbParameters = array(':var1' => $var1, ...);
$dbStatement = $db->prepare('INSERT INTO MyTable(...) VALUES(:var1, ...)');
$success = $dbStatement->execute($dbParameters);
if (!$success) throw new Exception('internal-database-error');
$insertedRowId = $db->lastInsertId();
$dbParameters = array(':insertedRowId' => $insertedRowId);
$dbStatement = $db->prepare('SELECT * FROM MyTable WHERE id = :insertedRowId');
$dbStatement->execute($dbParameters);
$row = $dbStatement->fetch();
error_log('ROW: ' . print_r($row, true));
$rowData = $this->obtainRowData($insertedRowId);
$db->commit();
} catch (PDOException $e) {
$db->rollBack();
error_log($e->getMessage());
throw new Exception('internal-database-error');
} catch (Exception $e) {
$db->rollBack();
error_log($e->getMessage());
throw $e;
}
}
function obtainRowData($insertedRowId) {
$db = DatabaseManager::getInstance()->getConnection();
$dbParameters = array(':insertedRowId' => $insertedRowId);
$dbStatement = $db->prepare('SELECT * FROM MyTable WHERE id = :insertedRowId');
$dbStatement->execute($dbParameters);
$row = $dbStatement->fetch();
error_log('ROW INSIDE FUNCTION: ' . print_r($row, true));
$data = $row['field1'];
// ...
return $data;
}
}
正如你所看到的,我已经把2个error_log(...);
电话。
“行”调用返回已插入正确的数据:
ROW: Array
(
[id] => 813
[0] => 813
[field2] => 289
[1] => 289
[field3] => value
[2] => value
[field4] => value2
[3] => value2
)
的“连续在内线FUNCTION”调用返回不正确的数据:
ROW INSERTED FUNCTION: Array
(
[id] => 2345
[0] => 2345
[comment] =>
[1] =>
)
正如你所看到的,没有的在上次调用中获得的值与插入的行相对应。此外,我有一个“评论”字段,不出现在这张表中!
下面你有我的DatabaseManager类,这是管理PDO连接一个Singleton类:
final class DatabaseManager {
private static $instance = null;
private $connection;
private function __construct() {
try {
$connection = new PDO('mysql:host=...;dbname=...;charset=latin1', 'user', 'pass');
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
error_log($e->getmessage());
die();
}
$this->connection = $connection;
}
public function __clone() {}
public static function getInstance() {
if (self::$instance === null) self::$instance = new DatabaseManager();
return self::$instance;
}
public function getConnection() {
return $this->connection;
}
}
可以采取什么问题吗? 为什么被调用的函数选择一个完全不同的行?
首先将您的抓取改为'fetch(PDO :: FETCH_ASSOC);'。它给你没有重复。并使用'Select SELECT * FROM MyTable WHERE id ON(:insertedRowId)'并使用bindparam和implode来获得所有ID – MRustamzade
没有人知道你的代码有什么问题。特别是当你张贴故意的人为代码时。你必须创建一个*可验证的*实例来获得答案。 [如何为PDO相关问题创建一个MCVE](https://phpdelusions.net/pdo/mcve) –
@MehemmedRustemzade恐怕你根本不理解这个问题。 –