Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php][sql] Jak umieścić wartość NULL w bazie danych, Przy pomocy zmiennej...
charlie-cherry
post 25.01.2008, 23:03:43
Post #1





Grupa: Zarejestrowani
Postów: 93
Pomógł: 5
Dołączył: 15.12.2007

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


Chcę umieścić w niektórych polach wartości Null. Oczywiście już uwzględniłem taką możliwość w bazie danych. Mam już działające rozwiązanie, ale mój aktualny kod jest bardzo długi:

CODE
mysql_connect(localhost, xxxxx, xxxxxx) or die(mysql_error());
mysql_select_db("xxxx") or die(mysql_error());
mysql_query('SET CHARACTER SET utf8');
mysql_query('SET NAMES utf8');

$numer = NULL;
$tytul = addslashes($_GET['tytul']);;
$rodzaj = "Tipsy i kody";
$komputer = addslashes($_GET['komputer']);
$tresc= addslashes($_GET['tresc']);
$autor = addslashes($_GET['autor']);
$zrodlo = addslashes($_GET['zrodlo']);

if (empty($autor) && empty($zrodlo)) {
$query = "INSERT INTO `wilq`.`tnt` ( `numer` ,
`tytul` , `tresc` , `rodzaj` , `komputer` , `autor` , `zrodlo`)
VALUES ( '$numer' , '$tytul', '$tresc', '$rodzaj', '$komputer', null, null)";
$result = mysql_query($query);
echo $query;}

elseif (empty($autor)) {
$query = "INSERT INTO `wilq`.`tnt` ( `numer` ,
`tytul` , `tresc` , `rodzaj` , `komputer` , `autor` , `zrodlo`)
VALUES ( '$numer' , '$tytul', '$tresc', '$rodzaj', '$komputer', null, '$zrodlo')";
$result = mysql_query($query);
echo $query;}

elseif (empty($zrodlo)) {
$query = "INSERT INTO `wilq`.`tnt` ( `numer` ,
`tytul` , `tresc` , `rodzaj` , `komputer` , `autor` , `zrodlo`)
VALUES ( '$numer' , '$tytul', '$tresc', '$rodzaj', '$komputer', '$autor', null)";
$result = mysql_query($query);
echo $query;}

else {
$query = "INSERT INTO `wilq`.`tnt` ( `numer` ,
`tytul` , `tresc` , `rodzaj` , `komputer` , `autor` , `zrodlo`)
VALUES ( '$numer' , '$tytul', '$tresc', '$rodzaj', '$komputer', '$autor', '$zrodlo')";
$result = mysql_query($query);
echo $query;}

?>


Jak to skrócić? Próbowałem eksperymentować w tym kierunku, ale niestety nie do końca to działa. Dane są przekazywane, ale w bazie danych nie pojawiają się wartości null, a jedynie puste pola.

Kod
  mysql_connect(localhost, xxxx, xxxxx) or die(mysql_error());
  mysql_select_db("xxxx") or die(mysql_error());
    mysql_query('SET CHARACTER SET utf8');
mysql_query('SET NAMES utf8');

$numer = NULL;
$tytul = addslashes($_GET['tytul']);;
$rodzaj = "Tipsy i kody";
$komputer = addslashes($_GET['komputer']);
$tresc= addslashes($_GET['tresc']);
$autor = addslashes($_GET['autor']);
$zrodlo = addslashes($_GET['zrodlo']);

if (empty($autor)) {$autor == 'null';}
if (empty($zrodlo)) {$zrodlo == 'null';}

  $query = "INSERT INTO `wilq`.`tnt` ( `numer` ,
`tytul` ,
`tresc` ,
`rodzaj` ,
`komputer` ,
`autor` ,
`zrodlo`
)
VALUES (
'$numer' , '$tytul', '$tresc', '$rodzaj', '$komputer', '$autor', '$zrodlo')";

   $result = mysql_query($query);
   echo $query;
    
   ?>


Ten post edytował charlie-cherry 26.01.2008, 07:27:34
Go to the top of the page
+Quote Post
Inti
post 26.01.2008, 00:39:38
Post #2





Grupa: Zarejestrowani
Postów: 67
Pomógł: 12
Dołączył: 20.01.2008
Skąd: Toruń

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


Nie wiem czy zauważyłeś, ale:

  1. <?php
  2. if (empty($autor)) {
  3. $autor == 'null'; //ta linijka nie sprawia, że pole $autor staje się null, gdyż używasz znaku porówn
    iania ==, zamiast przypisania = być może w tym tkwi błąd
  4. }
  5.  if (empty($zrodlo)) {
  6. $zrodlo == 'null'; // tutaj to samo
  7. }
  8. ?>


Pozdrawiam Inti
Go to the top of the page
+Quote Post
charlie-cherry
post 26.01.2008, 07:26:57
Post #3





Grupa: Zarejestrowani
Postów: 93
Pomógł: 5
Dołączył: 15.12.2007

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


Niestety, nie pomaga, gdyż w bazie danych pojawia się czysto-tekstowa wartość 'null', a nie prawdziwy Null.
Go to the top of the page
+Quote Post
Chrom
post 26.01.2008, 08:03:12
Post #4





Grupa: Zarejestrowani
Postów: 240
Pomógł: 17
Dołączył: 28.12.2005
Skąd: Warszawa

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


posłuchaj się pomyśl, zrób przypisanie wartości a nie porównanie, nie == tylko =

Ten post edytował Chrom 26.01.2008, 08:53:03
Go to the top of the page
+Quote Post
Inti
post 26.01.2008, 09:09:23
Post #5





Grupa: Zarejestrowani
Postów: 67
Pomógł: 12
Dołączył: 20.01.2008
Skąd: Toruń

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


Szczerze mówiąc to najprościej by było, gdybyś podczas konstrukcji tabeli w bazie, dodał klauzulę do tych pól - DEFAULT NULL, co sprawi że jak nic nie dodasz do tablicy w tych polach, to automatycznie przyjmą wartość NULL.

Zatem tworzysz sobie tabele w ten sposób:

  1. CREATE TABLE wilq (
  2. numer int NOT NULL AUTO_INCREMENT,
  3. tytul varchar(15) NOT NULL,
  4. tresc text NOT NULL,
  5. rodzaj ...
  6. ...
  7. autor varchar(30) DEFAULT NULL,
  8. zrodlo varchar(50) DEFAULT NULL,
  9. PRIMARY KEY(numer)
  10. ) DEFAULT charset=utf8;


W tym wypadku już nie musisz sprawdzać warunku, czy zmienne $autor lub $zrodlo są puste, gdyż jeśli będą to i tak w bazie zostaną ustawione te pola na NULL.

Swoją drogą zrozum, że:

  1. <?php
  2. if (empty($autor)) {
  3. $autor == 'null';
  4. }
  5.  if (empty($zrodlo)) {
  6. $zrodlo == 'null';
  7. }
  8. ?>


w lini 3 i 6 nie ustawiasz żadnej wartości zmiennym $autor oraz $zrodlo, gdyż nie dokonujesz instrukcji przypisania, a porównania logicznego - odsyłam do google, jeśli nie widzisz w tym różnicy.

Pozdrawiam Inti

Ten post edytował Inti 26.01.2008, 09:17:36
Go to the top of the page
+Quote Post
phpion
post 26.01.2008, 09:52:49
Post #6





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




2 sprawy:
1) Już koledzy o tym pisali: nie == tylko =
2) Jeśli dasz 'null' to faktycznie jest przypisane jako ciąg znaków - daj bez ' czyli:
  1. <?php
  2. $autor = null;
  3. ?>

i analogicznie dla źródła.
Go to the top of the page
+Quote Post
Inti
post 26.01.2008, 10:53:31
Post #7





Grupa: Zarejestrowani
Postów: 67
Pomógł: 12
Dołączył: 20.01.2008
Skąd: Toruń

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


phpion

Możliwość przypisania zmiennej $autor = NULL oraz $zrodlo = NULL jest oczywiście mało drobiazgową zmianą, ale polecam ją jedynie, jeśli nie mamy dostępu do zmiany ustawieć bazy - nie musimy przecież od nowa tworzyć tabeli, a jedynie uaktualnić lub z modyfikować już isniejące rekordy.

Owszem, mimo że takie sztywne przypisanie daje swoje reultaty, to niestety nie jest to poprawne podejście do problemu. Sprawdzanie, czy wartość jest pusta i ewentualne ustawianie jej jako NULL to w tym wypadku czyności mijające się z celem - działa, ale koszta operacji są większe. Jeśli dana czynność później wykonywać będzie się dajmy na to w pętli, to raz obciąża to skrypt i narzuca niepotrzebnych obliczeń i przekształeceń. Według mnie porawniej jest podejście do problemu z poziomu bazy danych i ustawienie konkretnych wartości domyślnie, co znacznie mniej wpłynie na wagę kodu.

Pozrawiam Inti
Go to the top of the page
+Quote Post
phpion
post 26.01.2008, 10:58:29
Post #8





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




@Inti:
Oczywiście, zgadzam się. Ja zawsze wychodzę z założenia, że jeśli można coś zrobić na samej bazie to zdecydowanie lepiej jest to zrobić właśnie na bazie, a nie w PHP. Chodzi tu oczywiście o ograniczenia dla kolumn, ograniczenia dla tabel, procedury, triggery itd.
Rozwiązaniem w tym przypadku będzie po prostu:
  1. pole VARCHAR(32) NULL

smile.gif
Go to the top of the page
+Quote Post
charlie-cherry
post 26.01.2008, 22:31:45
Post #9





Grupa: Zarejestrowani
Postów: 93
Pomógł: 5
Dołączył: 15.12.2007

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


Dzięki za pomocy, acz należą się wam pewne wyjaśnienia:

$autor i $zrodlo miały ustawione wartość domyślną NULL od samego początku, gdyż miały być to pola "opcjonalne" - czyli informacja w nich może być, ale nie musi. Sęk w tym, że jeśli wpisywałem dane prosto z phpmyadmin i zostawiałem je puste, to pojawiała się w nich (wpisana italikami) wartość <i>null</i>, czyli zero. W przypadku wpisywania danych z mojego formularza, nie pojawiało nic (czyli w sumie też zero). Myślałem, że to błąd, ale wynika z tego, że tak to interpretuje Mysql.

Niezależnie od tego czy używałem $autor = NULL, czy $autor = ' ', czy też w ogóle nic nie pisałem, w bazie danych po prostu pojawiała się pusta wartość. Moje zaniepokojenie (i próba otwarcia drzwi otwartych na oścież) wywołał fakt, że zarówno w PHPmyadmin, jak i czystym Mysql możliwe są dwie puste wartości - NULL i puste pole.

Stąd też moje głupoty w stylu używania ==, gdyż próbowałem już każdej możliwej kombinacji, by ujrzeć wartość Null w bazie danych, w rekordzie dodanym za pomocą mojego formularza.

Napisałem taką funkcję, która działa za każdym razem niezależnie od tego, czy w pola są puste, czy jest NULL:

Kod
echo "<strong>$tytul</strong>"." - "."$komputer"."<br> ";
    if (empty($autor)) {echo '<h6>'.$zrodlo.'</h6>';}
    elseif (empty($zrodlo)) {echo '<h6>'.$autor.'</h6>';}
    else { echo '<h6 class="extra">'.$autor.", ".$zrodlo.'</h6>';}
           echo nl2br($tresc)."<br><hr> ";


Z poprawnego działania funkcji empty() wynika, że NULL = puste pole w SQL, mimo że może być dwojako oznaczone. A może się mylę?

Czy jest jakaś realna różnica między NULL, a pustym polem, które miało wcześniej ustawione default NULL?
Go to the top of the page
+Quote Post
1010
post 26.01.2008, 22:43:07
Post #10





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

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


a czy wziąłeś pod uwagę że ' '!='', czyli że spacja nie jest równa pustemu polu?


--------------------
Go to the top of the page
+Quote Post
charlie-cherry
post 27.01.2008, 16:56:02
Post #11





Grupa: Zarejestrowani
Postów: 93
Pomógł: 5
Dołączył: 15.12.2007

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


Wziąłem, ale eksperymentując zauważyłem, że powyższy skrypt i tak działa. I dalej nie wiem czy jest jakaś różnica między NULL a pustym polem..
Go to the top of the page
+Quote Post
phpion
post 27.01.2008, 19:28:01
Post #12





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(charlie-cherry @ 27.01.2008, 18:56:02 ) *
Wziąłem, ale eksperymentując zauważyłem, że powyższy skrypt i tak działa. I dalej nie wiem czy jest jakaś różnica między NULL a pustym polem..

Puste pole to ciąg znaków o długości równej 0. Po prostu nic. Natomiast NULL to wartość nieznana.

Ciekawostką jest, że przyrównanie dwóch pól o wartościach NULL (czyli np. pole1=pole2, gdzie zarówno pole1 to NULL jak i pole2 to NULL) zawsze zwróci fałsz. Może się wydawać to dziwne, że NULL != NULL (NULL NULLowi nie równy smile.gif ) ale z drugiej strony patrząc: skoro NULL to wartość nieznana, to nie można określić czy jeden NULL jest tym samym co inny smile.gif. Mam nadzieję, że w miarę klarownie wyjaśniłem.
Go to the top of the page
+Quote Post
1010
post 27.01.2008, 20:45:58
Post #13





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

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


a może po prostu lepiej będzie wszędzie mieć puste pola?


--------------------
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 21.05.2025 - 08:10