2012-11-12 12 views
7

Ho convertito un'applicazione per utilizzare istruzioni preparate PDO piuttosto che mysqli e sto incontrando uno strano problema. Ho alcuni record nel database in cui è previsto che un campo sarà nullo. Non "null" (stringa) o "" (stringa vuota), ma NULL. Costruisco le mie domande in modo dinamico, così in passato, quando mi sono imbattuto in una variabile Null in un oggetto, mi piacerebbe creare la query come questa:Selezione di righe in cui un campo è nullo utilizzando istruzioni PDO PHP preparate e MySQL

WHERE fieldName is null; 

E otterrei i risultati attesi quando il campo era nullo.

Ora con PDO, le mie query non restituiscono alcun risultato e non ricevo errori. Semplicemente non sta restituendo i record che mi aspetterei. Quando echo le query create e le eseguo direttamente in MySQL ottengo i risultati previsti, ma all'interno dell'applicazione non ci sono risultati restituiti.

Alcune delle cose che ho provato includono la creazione di query che assomigliano a questo:

WHERE fieldName is null; 

o

WHERE fieldName <=> null; 

Ho anche provato il preparato dichiarazione standard:

WHERE fieldName = :fieldName 

e quindi vincolante con questo tipo di dichiarazioni:

$stmt->bindParam(":$field", $value); 
$stmt->bindParam(":$field", $value, PDO::PARAM_NULL); 
$stmt->bindParam(":$field", null, PDO::PARAM_NULL); 
$stmt->bindValue(":$field", null, PDO::PARAM_NULL); 
$stmt->bindValue(":$field", null, PDO::PARAM_INT); 

Qualsiasi aiuto con questo sarebbe molto apprezzato. La mia versione PHP è 5.3.10 e MySQL è 5.5.22. Come una domanda a parte, non sono ancora chiaro sulla differenza tra bindParam e bindValue, quindi se ha senso includere nella tua risposta apprezzerei davvero qualche chiarimento sull'argomento ...

+0

Domanda diversa, ma tutti gli avventurieri sono qui: http://stackoverflow.com/questions/1391777/how-do-i-insert-null-values-using-pdo –

+0

Ho provato tutti i diversi suggerimenti da questa domanda e nessuno ha funzionato fino ad ora ... – cdwhatcott

+0

Se stai inserendo o cercando su null, perché hai bisogno di parametrizzarlo? –

risposta

3

risulta essere stata una combinazione di alcune delle risposte a questa domanda: How do I insert NULL values using PDO? (come ha sottolineato Giovanni)

avevo bisogno di cambiare la mia clausola dove questo:

WHERE fieldName is :fieldName; 

E poi passare un array di campo => valore alla funzione eseguire:

$binds = array(); 
foreach ($wheres as $where) { 
    $field = $where['field']; 
    $value = $where['value']; 
    $binds[":$field"] = $value; 
} 
$stmt->execute($binds); 

La query non funzionerebbe affatto con bindValue, anche dopo aver cambiato la mia clausola where. Qualcuno sa perché il binding non funziona, ma questo altro metodo ha fatto?

+2

Non pensavo che fosse possibile usare i segnaposto per una condizione 'IS' in una dichiarazione DOP, anche se sto trovando difficilmente una prova definitiva di ciò. Durante il test, non riesco a trovare "WHERE fieldName is: fieldName" per funzionare, anche usando il codice esatto che hai fornito. Posso ottenere quel codice per funzionare bene se uso qualcosa di diverso da 'IS', come' = 'o'> '. Puoi approfondire il codice che hai usato o avere altri suggerimenti? Sono bloccato con la versione 5.1 di MySQL, quindi questo potrebbe spiegare perché non funziona per me (vedo che stai usando 5.5). –

1

Domanda diversa, ma tutti i capricci sono qui: How do I insert NULL values using PDO?

Per riassumere:

$stmt->bindValue(':param', null, PDO::PARAM_INT); 

caso work.You può anche utilizzare:

$stmt->execute(array(":param" => NULL)); 

Per bindp Aram si deve dare il valore in una variabile (non una costante), bindvalue è possibile utilizzare le costanti ecc

-1

In MySQL è possibile utilizzare la query

select * from atable where isnull(column_name); 

per verificare la presenza di valori nulli.

Problemi correlati