php - 내 젠드 프레임 워크 '인용'엉망




sql zend-framework (2)

젠드 프레임 워크 매뉴얼이나 다른 곳에서 만족스러운 (주관적으로 보이는) 답변을 찾지 못하는 매우 간단한 문제가 있습니다 ...

PHP 변수를 SQL 쿼리에 넘겨서 개요를 잃어 버릴 수있는 방법은 많이 있습니다. 일반적으로 인용에 대한 이해가 부족합니다.

준비된 진술

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

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

이 솔루션을 사용하면 db가 나를 대신 처리하기 때문에 따옴표를 붙일 필요가 없다는 것을 이해합니다.

API를 통해 Zend_Db_Table 및 _Row 객체 쿼리

$ users = 새 사용자 ();

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) ok가 아님을 이해한다. 그러나 다른 버전은 어떨까요? c) 진술과 같이 취급되고 자동으로 인용되거나 또는?를 사용할 때 d)를 사용해야합니까? 식별자?


나는 익숙해 져있다.

$where = $this->getAdapter()->quoteInto('name = ?', $name);
$this->fetchRow($where);

면책 조항 : 이 정보는 본 답변의 최초 게시일 현재 유효합니다. ZF가 자주 변경되면이 정보는 향후 릴리스에서 구식이 될 수 있지만 아카이브 목적으로는 변경되지 않습니다.

문자열을 Zend_Db_Table_Abstract 의 하위 클래스 인 fetchRow() 메서드에 전달하면 Zend_Db_Table_Select 인스턴스의 where 부분으로 처리됩니다.

즉, 내부적으로 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 를 자동으로 호출합니다.

주의 사항 : 항상 fetchRow() 메소드에 Zend_Db_Table_Select 또는 Zend_Db_Select 인스턴스를 전달할 수 있습니다 ...

다시 말하지만, Zend_Db_Table_Abstract 의 하위 클래스에서는 다음과 같이 보입니다.

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

이렇게하는 것의 장점은 SQL 쿼리의 WHERE 절 이상으로 많은 것을 제어 할 수 있으므로 훨씬 복잡한 쿼리를 작성할 수 있다는 것입니다. 이론 상으로는 다음과 같이 쉽게 할 수 있습니다.

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

$this->fetchRow($select);

참고 : Zend_Db_Select 의 인스턴스가 전달되면 fetchRow() 메서드는 select 객체의 limit() 메서드를 내부적으로 호출하고 매개 변수 1 제외하고 fetchAll() 과 똑같이 작동합니다.







quoting