Pergunta

Este é um pouco de um estranho, e eu poderia muito bem ser de codificação esta completamente errado - daí porque eu bati o mesmo erro duas vezes em dois dias, no completamente diferentes partes de um script. O código que estou usando é abaixo:


    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); } }

Eu sou muito novo para usando DOP, mas basicamente eu estou tentando passar uma série de restrições, por exemplo,

array( 'active' => 1, 'name' => 'James' )
e retornar todas as linhas da
WHERE active = 1 AND name = 'James'
tabela

Se eu usar essa matriz, o SQL executado a partir do primeiro

var_dump( )
é
SELECT * FROM {table} WHERE active = :active AND name = 'James'
- exatamente como eu esperava. Os parâmetros vinculados imprime 'Encadernação ativo para 1' e 'nome de ligação para James' - exatamente como o esperado. existem as linhas no banco de dados, e ainda assim a segunda chamada
var_dump()
para $ resultados saídas nada - ou seja, há linhas são retornadas

.

Se passar uma matriz de uma única restrição, por exemplo

array( 'active' => 1 )
, isso funciona perfeitamente bem. Parece ser sempre constrangimentos múltiplos são passados ??que ele pára de funcionar.

Foi útil?

Solução

Isso porque bindParam funciona através da ligação a uma variável, e você são re-utilizando o variável ($value) para vários valores. Tente com bindValue .

Ou mesmo ainda melhor; Passar os valores como uma matriz para execute vez. Isso torna o apátrida declaração, que geralmente é uma coisa boa na programação.

Outras dicas

Como mencionado, usando bindValue em vez de bindParam certamente vai fazer isso. No entanto, depois de passar um tempo considerável solucionar esse problema recentemente, eu descobri uma solução alternativa. Aqui é como realizar DOP variável obrigatório em um loop foreach usando bindParam:

Substituir a seguinte linha do post original:

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

... com isto:

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

Em vez de $value ligação, utilização $array_name[$array_key]. Isso funciona é porque você está agora ligação a uma única variável em vez de uma que é reutilizada em cada passagem do loop.

O $field variável usada como o espaço reservado que, aparentemente, não precisa ser uma variável única, no entanto. Eu não exaustivamente pesquisado isso ainda, mas uma variável usada como um espaço reservado parece ser analisado imediatamente (em vez de ser atribuído como uma referência variável) mesmo quando bindParam é usado.

Além disso, como você já não precisa acessar $value diretamente, você pode também substituir este:

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

... com isto:

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

Este é opcional, como ele vai funcionar bem sem essa mudança. Parece mais limpo na minha opinião, porém, uma vez que pode ficar confusa depois de por que $value é atribuído, mas nunca utilizado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top