PDOStatement
을 확장하고 fetch()
메서드를 timestamp 및 배열 형식의 값을 PostgreSQL에서 DateTime 및 기본 배열로 변형했습니다. 이 의도 한대로 작동하지만 foreach 문을 사용할 때 동작을 재정의 할 수 없습니다.foreach를 사용하여 가져올 때 PDO에 대해 fetch()를 재정의합니다.
ArrayAccess, IteratorAggregate 및 Countable을 구현하는 객체에 행을 반환하여이를 해결했습니다. 그러나 나는 그 해결책에 만족하지 않고 단지 순수한 어레이를 원한다.
예 :
class ExtendedStatement extends PDOStatement { protected function __construct() { $this->setFetchMode(PDO::FETCH_ASSOC); } public function fetch( $fetch_style = PDO::FETCH_ASSOC, $cursor_orientation = PDO::FETCH_ORI_NEXT, $cursor_offset = 0) { $r = parent::fetch($fetch_style, $cursor_orientation, $cursor_offset); if (is_array($r)) { $r["extradata"] = TRUE; } return $r; } } $db = new PDO("sqlite::memory:"); $db->setAttribute( PDO::ATTR_STATEMENT_CLASS, array("ExtendedStatement", array($db))); $db->exec("CREATE TABLE example(id INTEGER PRIMARY KEY, name VARCHAR)"); $db->exec("INSERT INTO example(name) VALUES('test')"); // This is what is does $s = $db->prepare("SELECT * FROM example"); $s->execute(); foreach ($s as $r) { var_dump($r); } $s->closeCursor(); // This is how I want it to be $s = $db->prepare("SELECT * FROM example"); $s->execute(); while ($r = $s->fetch()) { var_dump($r); } $s->closeCursor(); // This is how I want it to be $s = $db->prepare("SELECT * FROM example"); $s->execute(); var_dump($s->fetch()); $s->closeCursor();
출력 :
array(2) { ["id"]=> string(1) "1" ["name"]=> string(4) "test" } array(3) { ["id"]=> string(1) "1" ["name"]=> string(4) "test" ["extradata"]=> bool(true) } array(3) { ["id"]=> string(1) "1" ["name"]=> string(4) "test" ["extradata"]=> bool(true) }
기대 되는가? 'fetch'를 오버라이드했다면, 항상 "올바르게"작동해야합니다. – Charles
예를 들어 업데이트되었습니다. – runfalk
foreach를'while ($ r = $ s-> fetch()) {'로 대체하면 정상적으로 작동합니까? 또한,'parent :: fetch' 호출에 의해 반환되는 결과는 배열이 아니어도 좋으며, null 일 수 있음을 명심하십시오. 아마'is_array' 체크 나 비슷한 것을 추가해야합니다. – Charles