2017-02-17 66 views
-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; 
    } 

} 

可以采取什么问题吗? 为什么被调用的函数选择一个完全不同的行?

+0

首先将您的抓取改为'fetch(PDO :: FETCH_ASSOC);'。它给你没有重复。并使用'Select SELECT * FROM MyTable WHERE id ON(:insertedRowId)'并使用bindparam和implode来获得所有ID – MRustamzade

+0

没有人知道你的代码有什么问题。特别是当你张贴故意的人为代码时。你必须创建一个*可验证的*实例来获得答案。 [如何为PDO相关问题创建一个MCVE](https://phpdelusions.net/pdo/mcve) –

+1

@MehemmedRustemzade恐怕你根本不理解这个问题。 –

回答

-2

解决!好的,我简化了代码...在$row = $dbStatement->fetch();error_log(...);之间有一些代码行,其中一个代码覆盖$row变量。所以两个SELECT都从头开始给出相同的结果,error_log(...)是通过覆盖变量完成的。