Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Access][PHP] Zapis do bazy, "IF NOT EXISTS"
Forum PHP.pl > Forum > Przedszkole
-franz87-
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
Spawnm
CREATE TABLE IF NOT EXISTS `XXX` (...

Przy insert nie wpisuj ID w pierwszym nawiasie, pomijaj to pole.
franz87
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
mmmmmmm
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ć.
franz87
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. }


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

Będzie na pewno dużo szybsze.
franz87
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...
mmmmmmm
Pewnie trzeba ustawić odpowiedni UNIQUE INDEX.
franz87
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
mmmmmmm
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!!
franz87
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 !
mmmmmmm
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))
franz87
Wszystko działa jak powinno.
Miałem to wczoraj prawie dobrze tylko zapomniałem usunąc ' '
smile.gif
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.