문제
이것은 약간 이상한 것입니다. 나는 이것을 완전히 잘못 코딩 할 수 있습니다. 따라서 스크립트의 완전히 다른 부분에서 이틀 안에 같은 오류를 두 번 쳤는 이유. 내가 사용하고있는 코드는 다음과 같습니다.
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 )
, 이것은 완벽하게 잘 작동합니다. 여러 제약이 통과 될 때마다 작동을 멈추는 것처럼 보입니다.
다른 팁
언급했듯이 사용 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
할당되었지만 사용되지 않았습니다.