Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Access][PHP] Zapis do bazy, "IF NOT EXISTS"
--franz87--
post 21.02.2013, 20:18:45
Post #1





Goście







Witam,
Mam dwa problemy przy zapisie do bazy Access (*mdb) z poziomu skryptu PHP.

1. Tworzę tabele, i chcę zastosować IF NOT EXISTS, żeby, gdy tabela istnieje nie tworzono jej.

  1. $polaczenie = odbc_connect("Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\\xampp\\htdocs\\ebayAPI\\baza.mdb", '', '');
  2. $sql = "CREATE TABLE ".$zmienna;
  3. $sql .= "IF NOT EXISTS (ID AUTOINCREMENT,";
  4. $sql .= " User VARCHAR,";
  5. $sql .= " Cena VARCHAR,";
  6. $sql .= " Ilosc VARCHAR,";
  7. $sql .= " Data VARCHAR,";
  8. $sql .= " Godzina VARCHAR,";
  9. $sql .= " Nazwa VARCHAR,";
  10. $sql .= " Numer VARCHAR";
  11. $sql .= " );";
  12. $wynik = odbc_exec($polaczenie,$sql)or die(odbc_exec());

Próbowałem dawać "IF NOT EXISTS" w różnych miejscach, ale zawsze wywala błąd.
To samo chcę zastosować do INSERT INTO przy tworzeniu rekordu, by nie dodawał dubla.Też nie działa.

2. Dałem ID typ AUTOINCREMENT, żeby rekord sam dodawał odpowiednią wartość ID, ale nie działa.
Robiłem to zostawiając przy ID pusty string.

  1. $sql = "INSERT INTO tabela (ID, User, Cena, Ilosc, Data, Godzina, Nazwa, Numer) ";
  2. $sql .= " VALUES ('', 'user', '12,99' , '5szt' , '12-05-2013, '13:00:55' , 'nazwa', 'numer);";
  3. $wynik = odbc_exec($polaczenie,$sql) or die(odbc_exec());

Jeżeli mu podam jakąś wartość ID to działa, ale ja chcę, żeby on dodawał nast wolne ID automatycznie
Go to the top of the page
+Quote Post
Spawnm
post 21.02.2013, 21:05:03
Post #2





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




CREATE TABLE IF NOT EXISTS `XXX` (...

Przy insert nie wpisuj ID w pierwszym nawiasie, pomijaj to pole.
Go to the top of the page
+Quote Post
franz87
post 21.02.2013, 21:11:33
Post #3





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 24.08.2009

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


Cytat(Spawnm @ 21.02.2013, 21:05:03 ) *
CREATE TABLE IF NOT EXISTS `XXX` (...


Nie działa:
Warning: odbc_exec(): in C:\lolalizacja/plik.php on line 34
Warning: odbc_exec() expects at least 2 parameters, 0 given in C:\lolalizacja/plik.php on line 34
34 linia wskazuje na $wynik = odbc_exec($polaczenie,$sql)or die(odbc_exec());


Cytat(Spawnm @ 21.02.2013, 21:05:03 ) *
Przy insert nie wpisuj ID w pierwszym nawiasie, pomijaj to pole.


To działa
Go to the top of the page
+Quote Post
mmmmmmm
post 22.02.2013, 07:58:26
Post #4





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


W Jet-SQL używanym w Accessie nie ma "IF NOT EXISTS" w żadnym miejscu. Musisz najpierw sprawdzić, czy tabela istnieje, a potem ew. utworzyć.
Go to the top of the page
+Quote Post
franz87
post 22.02.2013, 12:59:26
Post #5





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 24.08.2009

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


Cytat(mmmmmmm @ 22.02.2013, 07:58:26 ) *
W Jet-SQL używanym w Accessie nie ma "IF NOT EXISTS" w żadnym miejscu. Musisz najpierw sprawdzić, czy tabela istnieje, a potem ew. utworzyć.


Dzięki, rozwiązałem to tak:

  1. $if_tabela = "SELECT * FROM tabela;";
  2. @$rs=odbc_exec($polaczenie,$if_tabela);
  3.  
  4. if($rs)
  5. {
  6. echo "Tabela istnieje<br>";
  7. }else
  8. {
  9. $sql = "CREATE TABLE tabela ");
  10. $sql .= " (ID AUTOINCREMENT,";
  11. $sql .= " User VARCHAR,";
  12. $sql .= " Cena VARCHAR,";
  13. $sql .= " Ilosc VARCHAR,";
  14. $sql .= " Data VARCHAR,";
  15. $sql .= " Godzina VARCHAR,";
  16. $sql .= " Nazwa VARCHAR,";
  17. $sql .= " Numer VARCHAR";
  18. $sql .= " );";
  19. $wynik = odbc_exec($polaczenie,$sql)or die(odbc_exec());
  20. }


Go to the top of the page
+Quote Post
mmmmmmm
post 22.02.2013, 14:56:56
Post #6





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Aby sprawdzić, czy tabela istnieje wystarczy:
  1. SELECT 1 FROM tabela WHERE 1=0;

Będzie na pewno dużo szybsze.
Go to the top of the page
+Quote Post
franz87
post 22.02.2013, 15:54:42
Post #7





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 24.08.2009

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


Dzięki, a masz pomysł jak sprawdzać czy zapisywany rekord istnieje już w tabeli?
Żeby nie tworzyły się duble.
Możnaby pobierać najpierw rekord i porównywać go z danymi do zapisu, ale to chyba nie byłoby optymalne wyjście...
Go to the top of the page
+Quote Post
mmmmmmm
post 22.02.2013, 22:49:27
Post #8





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Pewnie trzeba ustawić odpowiedni UNIQUE INDEX.
Go to the top of the page
+Quote Post
franz87
post 25.02.2013, 00:05:27
Post #9





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 24.08.2009

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


Mam kolejny problem z zapisem liczby zmiennoprzecinkowej.
Ustawiałem typ pola tabeli na DOUBLE,FLOAT,DECIMAL(ten nie działał).
A zmienną string, która zawierała np. '22,50' lub '22.50' rzutowałem na (float) lub (double).
W efekcie co najwyżej udało mi się zapisać do bazy liczbę z uciętymi liczbami po przecinku/kropce - np. samo 22

Drugi problem to zapis daty/godziny w danym formacie np. 'RR-MM-DD GG-MM-SS'
Tu już w ogóle jest problem przy określeniu typu i maski przy tworzeniu tabeli. A co dopiero będzie przy zapisie do bazy.
Dodam, że date przechowuje w zmiennej $data jako string, a czas w $czas jako string

Ten post edytował franz87 25.02.2013, 00:06:33
Go to the top of the page
+Quote Post
mmmmmmm
post 25.02.2013, 08:03:05
Post #10





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Typ NUMERIC powinien być odpowiedni. Nie możesz przekazywać liczby z przecinkiem, bo to jest złe (np. przy konstruowaniu SQL bez parametrów przecinek zostanie potraktowany jako separator pól.) Co do tego ucinannia to nie wiem - pokaż kod.
A czemu daty chcesz zapisywać jako string? Zapisuj jako DATETIME. Tylko, że w Jet-SQL się trochę inaczej zapisuje:
  1. INSERT INTO test(pole_numeric, pole_datetime) VALUES(4, #01/03/2013 13:12#)

Datę (czas) zapisuje się w formacie #MM/DD/YYYY HH:NN:SS#
Najpierw MIESIĄC!!
Go to the top of the page
+Quote Post
franz87
post 25.02.2013, 12:56:44
Post #11





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 24.08.2009

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


Z tym typem zmiennoprzecinkowym nadal nie działa.
Zamieszczam kod.

  1. $sql = "CREATE TABLE aukcje";
  2. $sql .= " (ID AUTOINCREMENT,";
  3. $sql .= " User VARCHAR,";
  4. $sql .= " Cena NUMERIC,";
  5. $sql .= " Ilosc INTEGER,";
  6. $sql .= " Data VARCHAR,";
  7. $sql .= " Godzina VARCHAR,";
  8. $sql .= " Nazwa VARCHAR,";
  9. $sql .= " Numer INTEGER";
  10. $sql .= " );";
  11. $wynik = odbc_exec($polaczenie,$sql)or die(odbc_exec());
  12.  
  13. // Tworzy tabelę, pole "Cena" ma być zmiennoprzecinkowe


Teraz dodaje rekord:

  1. $sql = "INSERT INTO aukcje (User, Cena, Ilosc, Data, Godzina, Nazwa, Numer) ";
  2. $sql .= " VALUES ('".$user."','".$cena."','".(int)$ilosc."','".$data."','".$czas."','".$nazwa_aukcji."','".(int)$numer_aukcji."');";
  3. $wynik = odbc_exec($polaczenie,$sql) or die(odbc_exec());


Jeżeli dam echo $sql to zapisywany rekord wygląda na dobry:
  1. INSERT INTO aukcje (User, Cena, Ilosc, Data, Godzina, Nazwa, Numer) VALUES ('piotrek','8,99','1','26.05.12','12:17:00','ksiazka','11550');



Wywala błąd :
Warning: odbc_exec(): in C:\polacz.php on line 44
Warning: odbc_exec() expects at least 2 parameters, 0 given in C:\polacz.php on line 44
co wskazuje na $wynik = odbc_exec($polaczenie,$sql) or die(odbc_exec());



$user,$cena,$ilosc,$data,$czas,$nazwa_aukcji,$numer_aukcji -> to są wszystko stringi, dlatego dla $numer_aukcji i $ilosc rzutuje je na INT
Próbowałem rzutować $cena na float,double, ale to nic nie daje.


Teraz co ciekawe, jeżeli zamiast $cena dam '2,99' to wpisze do bazy 2,99
a przecież ja mu podaje to samo w $cena !

Ten post edytował franz87 25.02.2013, 13:01:17
Go to the top of the page
+Quote Post
mmmmmmm
post 25.02.2013, 14:29:45
Post #12





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


A tak?
  1. $sql = "INSERT INTO [aukcje] ([User], [Cena], [Ilosc], [Data], [Godzina], [Nazwa], [Numer]) ";
  2. $sql .= " VALUES ('".$user."',".floatval($cena).",".(int)$ilosc.",'".$data."','".$czas."','".$nazwa_aukcji."',".(int)$numer_aukcji.");";

ew. zamiast floatval($cena)
$floatval(str_replace(',','.',$cena))

Ten post edytował mmmmmmm 25.02.2013, 14:32:15
Go to the top of the page
+Quote Post
franz87
post 25.02.2013, 16:28:53
Post #13





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 24.08.2009

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


Wszystko działa jak powinno.
Miałem to wczoraj prawie dobrze tylko zapomniałem usunąc ' '
smile.gif


Ten post edytował franz87 25.02.2013, 19:42:18
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: 19.07.2025 - 09:48