Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Empty string to NULL
michas61
post
Post #1





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 27.09.2005

Ostrzeżenie: (0%)
-----


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śł?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Łukasz O.
post
Post #2





Grupa: Zarejestrowani
Postów: 191
Pomógł: 5
Dołączył: 13.01.2007

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
michas61
post
Post #3





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 27.09.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Łukasz O.
post
Post #4





Grupa: Zarejestrowani
Postów: 191
Pomógł: 5
Dołączył: 13.01.2007

Ostrzeżenie: (0%)
-----


nie ma takiego przełącznika - musisz sobie sam to zrobić (IMG:http://forum.php.pl/style_emoticons/default/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. ?>
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@ł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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 21:57