문제

이것은 약간 이상한 것입니다. 나는 이것을 완전히 잘못 코딩 할 수 있습니다. 따라서 스크립트의 완전히 다른 부분에서 이틀 안에 같은 오류를 두 번 쳤는 이유. 내가 사용하고있는 코드는 다음과 같습니다.


    public function findAll( $constraints = array() ) {

        // Select all records
        $SQL = 'SELECT * FROM ' . $this->tableName;

        // See if there's any constraints
        if( count( $constraints ) > 0 ) {
            $SQL .= ' WHERE ';

            foreach( $constraints as $field => $value ) {
                $SQL .= $field . ' = :' . $field . ' AND ';
            }

        }

        // Remove the final AND and prepare the statement
        $SQL = substr( $SQL, 0, -5 );       
        $PDOStatement = $this->PDO->prepare( $SQL );

        // Loop through constraints and bind parameters
        foreach( $constraints as $field => $value ) {
            print 'Binding ' . $field . ' to ' . $value . ' 
'; $PDOStatement->bindParam( $field, $value ); } $PDOStatement->execute(); var_dump($PDOStatement); while ( $results = $PDOStatement->fetch( PDO::FETCH_ASSOC ) ) { var_dump($results); } }

나는 pdo를 사용하는 데 꽤 익숙하지 않지만 기본적으로 제약 조건을 전달하려고합니다.

array( 'active' => 1, 'name' => 'James' )
테이블에서 모든 행을 반환합니다
WHERE active = 1 AND name = 'James'

이 배열을 사용하면 SQL이 첫 번째로 실행되었습니다.

var_dump( )
~이다
SELECT * FROM {table} WHERE active = :active AND name = 'James'
- 정확히 내가 예상 한대로. 바운드 매개 변수는 '1'에 활성화 된 바인딩과 '제임스에 바인딩 이름'을 인쇄합니다. 행은 데이터베이스에 존재하지만 두 번째 행
var_dump()
$ 결과 출력을 호출하지 않습니다. 즉, 행이 반환되지 않습니다.

단일 제약 조건 배열을 전달하면 예를 들어

array( 'active' => 1 )
, 이것은 완벽하게 잘 작동합니다. 여러 제약이 통과 될 때마다 작동을 멈추는 것처럼 보입니다.

도움이 되었습니까?

해결책

그것은 ~ 때문에 bindParam 변수에 바인딩하여 작동하며 변수를 재사용합니다 ($value) 여러 값의 경우. 함께 시도하십시오 bindValue 대신에.

또는 더 나은 것; 값을 배열로 전달하십시오 execute 대신에. 이것은 성명서를 stanteless로 만들어줍니다. 이는 일반적으로 프로그래밍에서 좋은 것입니다.

다른 팁

언급했듯이 사용 bindValue 대신에 bindParam 확실히 이것을 달성 할 것입니다. 그러나 최근 에이 문제를 해결하는 데 상당한 시간의 시간을 소비 한 후 대체 솔루션을 발견했습니다. 다음은 BindParam을 사용하여 Foreach 루프에서 PDO 가변 바인딩을 달성하는 방법입니다.

원래 게시물에서 다음 줄을 교체하십시오.

$PDOStatement->bindParam( $field, $value );

... 이것으로 :

$PDOStatement->bindParam( $field, $constraints[$field] );

바인딩 대신 $value, 사용 $array_name[$array_key]. 이것은 이제 루프의 각 패스에서 재사용되는 변수 대신 고유 한 변수에 바인딩되기 때문입니다.

변수 $field 그러나 자리 표시 자로 사용되는 것은 분명히 고유 한 변수 일 필요는 없습니다. 나는 이것을 아직 철저히 조사하지 않았지만, 자리 표시 자로 사용되는 변수는 Bindparam을 사용하는 경우에도 가변 참조로 할당되지 않고 즉시 구문 분석되는 것으로 보입니다.

또한 더 이상 액세스 할 필요가 없으므로 $value 직접, 당신은 이것을 대체 할 수도 있습니다.

foreach( $constraints as $field => $value ) {

... 이것으로 :

foreach (array_keys($constraints) as $field) {

이 변경없이 잘 작동하기 때문에 이것은 선택 사항입니다. 그래도 내 의견으로는 더 깨끗해 보인다. 왜 나중에 왜 왜 혼란 스러울 수 있기 때문이다 $value 할당되었지만 사용되지 않았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top