문제

Zend 프레임 워크 매뉴얼 또는 다른 곳에서 만족스러운 (주관적으로 볼 수있는) 답변을 찾을 수없는 매우 간단한 문제가있을 것입니다 ...

PHP 변수를 SQL 쿼리에 넘겨 줄 수있는 방법이 너무 많아서 개요를 잃어 버렸고 아마도 일반적으로 인용에 대한 이해가 부족할 것입니다.

준비된 진술

$sql =  "SELECT this, that
        FROM table
        WHERE id = ? AND restriction = ?";

$stmt = $this->_db->query($sql, array($myId, $myValue)); 
$result = $stmt->fetchAll();

이 솔루션으로 DB가 이것을 처리하기 때문에 아무것도 인용 할 필요가 없다는 것을 이해합니다.

Querying Zend_db_table 및 _ API의 객체

$ user = 새 사용자 ();

a) $users->fetchRow('userID = ' . $userID);  
b) $users->fetchRow('userID = ' . $users->getAdapter()->quote($userID, 'INTEGER'));  
c) $users->fetchRow('userID = ?', $userID);  
d) $users->fetchRow('userID = ?', $users->getAdapter()->quote($userID, 'INTEGER'));  

질문

나는 a)가 전혀 인용되지 않기 때문에 괜찮지 않다는 것을 이해합니다. 그러나 다른 버전은 어떻습니까? c) 진술처럼 취급되고 자동으로 인용되거나 사용해야합니까? d) 내가 사용할 때? 식별자?

도움이 되었습니까?

해결책

부인 성명: 이 정보는이 답변의 원래 게시 날짜에 따라 유효합니다. ZF 변경 자주,이 정보는 향후 릴리스로 구식이 될 수 있지만, 이는 보관 목적으로 변경되지 않습니다.

문자열을 전달하면 fetchRow() 서브 클래스의 방법 Zend_Db_Table_Abstract (당신이하는 일), 그것은 where a의 일부 Zend_Db_Table_Select 사례.

다시 말해 내부적으로 Zend_Db_Table 이렇게합니다 :

if (!($where instanceof Zend_Db_Table_Select)) {
    $select = $this->select();

    if ($where !== null) {
        $this->_where($select, $where);
    }

그래서...:

a) $users->fetchRow('userID = ' . $userID);  

전혀 인용되지 않습니다.

b) $users->fetchRow('userID = ' . $users->getAdapter()->quote($userID, 'INTEGER'));  

정수로 수동으로 인용됩니다.

c) $users->fetchRow('userID = ?', $userID);  

자동으로 인용됩니다 Zend_Db_Adapter_*::quoteInto()

d) $users->fetchRow('userID = ?', $users->getAdapter()->quote($userID, 'INTEGER'));

실제로 당신에 의해 한 번, 그리고 자동 견적을 통해 한 번 더블 인용됩니다.

"최고"에 관한 한 옵션 C를 추천합니다. 프레임 워크는 자동으로 호출됩니다. quoteInto 매개 변수화 된 값에서.

명심하십시오 : 항상 인스턴스를 전달할 수 있습니다 Zend_Db_Table_Select 또는 Zend_Db_Select ~로 fetchRow() 대신 방법 ...

다시, 서브 클래스 Zend_Db_Table_Abstract, 그것은 다음과 같이 보일 것입니다.

$this->fetchRow($this->select()->where('userID = ?', $userID));

이 작업을 수행하는 장점은 훨씬 더 복잡한 쿼리를 구성 할 수 있다는 것입니다. WHERE SQL 쿼리 조항. 이론적으로는 쉽게 할 수 있습니다.

$select = $this->select()->where('userID = ?', $userID)
                         ->join(array('sat' => 'superAwesomeTable'), array('sat.user_id = userID', array('superAwesomeColumn'));

$this->fetchRow($select);

메모: 인스턴스를 통과 한 경우 Zend_Db_Select,, fetchRow() 방법은 정확히 같은 역할을합니다 fetchAll() 제외하고 내부적으로 전화합니다 limit() 매개 변수와 함께 선택 객체의 메소드 1.

다른 팁

나는 익숙해졌다

$where = $this->getAdapter()->quoteInto('name = ?', $name);
$this->fetchRow($where);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top