Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Empty string to NULL
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
michas61
Witam

Czy ktoś z Was korzystał z PDO do podłączenia do PostreSQL?
Sytuacja komplikuje się w momencie gdy robię inserta z wartościami null, standardowo inne bazy interpretują pusty string '' jako null.
W PDO jest parametr PDO::NULL_EMPTY_STRING oraz PDO::NULL_TO_STRING, ale nie przynosi to żadnego rezultatu.

Czy ktoś ma jakiś pomyśł?
Łukasz O.
w funkcji quotującej PDO następuje type casting wartości NULL na string'a

żeby to obejść powinieneś sprawdzać czy wartość czasem nie jest NULL'em i pisać:
  1. <?php
  2. $pdo->query('INSERT INTO tabela(tresc) VALUES('.(is_null($zmienna) ? NULL : $pdo->quote($zmienna)).')');
  3. ?>


albo napisz swoją funkcję quotującą i jej używaj zamiast $pdo->quote()
  1. <?php
  2. function DBNull($value = null){
  3. if(is_null($value)) return $value;
  4. if(is_bool($value)) return (bool)$value;
  5. if(is_int($value)) return (int)$value;
  6. if(is_float($value)) return (float)$value;
  7. return (string) $value = (trim($value));
  8. }
  9.  
  10. DBNull(null), # null
  11. DBNull('null'), # string 'null' (length=4)
  12. DBNull(0), #int 0
  13. DBNull(), # null
  14. DBNull(''), # string '' (length=0)
  15. DBNull(true) # boolean true
  16. );
  17. ?>
michas61
No sprawdzanie czy postawiana zmienna jest null było moją pierwsza myślą i rzeczywiście jest to może jakieś rozwiązanie. Ja natomiast szukam jakiegoś przełącznika, który interpretował by '' jako NULL, a wszystko po to aby nie wykonywać właśnie zbędnych warunków if
Łukasz O.
nie ma takiego przełącznika - musisz sobie sam to zrobić tongue.gif
  1. <?php
  2. function DBNull($value = null){
  3.  
  4. if(is_null($value) || $value=='') return (null)$value;
  5.  
  6. if(is_bool($value)) return (bool)$value;
  7. if(is_int($value)) return (int)$value;
  8. if(is_float($value)) return (float)$value;
  9. return (string) $value = (trim($value));
  10. }
  11. ?>
nospor
@łukasz troche przesadziles z tymi rzutowaniami. Po co int rzutujesz na int? po co bool rzutujesz na bool? itd.
  1. <?php
  2. function DBNull($value = null){
  3.  
  4. if(is_null($value) || $value==='') return null;
  5. return $value;
  6. }
  7. ?>

Dodatkowo poprawilem twoj warunek =='' na ===''

@michas61 ja osobiscie wole nie polegac na takich automatach o ktore sie pytasz. Nie zawsze pusty string ma byc wkladany jako null. Raz ci potrzeba nulla, raz pustego stringa. Lepiej samemu okreslic co akurat wlasnie chcemy wlozyc.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.