Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SQLite][PHP]Sprawdzanie czy email jest w bazie
redelek
post 23.11.2018, 18:30:11
Post #1





Grupa: Zarejestrowani
Postów: 658
Pomógł: 37
Dołączył: 4.06.2005
Skąd: Wawa

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


Dzień dobry,

Jestem amatorem coś od czasu do czasu piszę sobie do pracy by ułatwić sobie życie.
Mam taki problem. Otwieram plik w którym są dane

janek@wp.pl,3213123,344444
waldek@wp.pl,1221,2122123
karolek@wp.pl,1221,2122123

Odczytuję dane z pliku tak:
  1. $fileHandle = fopen("$plik.cvs", "r");
  2. while (($r = fgetcsv($fileHandle, 0, ",")) !== FALSE) {
  3.  
  4. echo "<br />".$r[0]."<br />";
  5.  
  6. }


Bazę danych mam w sqlite3. Teraz chciałbym sprawdzić czy coś się zmieniło w cyfrach jeśli adres zgadza się z adresem w bazie danych.
Jeśli nie ma takiego adresu, ma dodać nowy rekord do bazy (email i te dwie kolumny z cyframi).

Problem mam taki, że nie umiem wpleść odczytania danych z pliku i sprawdzeniu ich czy są w bazie, w jednym zapytaniu while. Nie wiem czy to jest możliwe.
Plik będzie się zmieniał co 2h, i chciałem sobie takie narzędzie zrobić. Może to i proste, ale jakoś nie mogę sobie z tym poradzić.

Dziękuję za pomoc i wyrozumiałość
PiotrekR


--------------------
Pozdrawiam
Piotrek R
Go to the top of the page
+Quote Post
trueblue
post 23.11.2018, 21:24:17
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Cytat(redelek @ 23.11.2018, 18:30:11 ) *
Teraz chciałbym sprawdzić czy coś się zmieniło w cyfrach jeśli adres zgadza się z adresem w bazie danych.
Jeśli nie ma takiego adresu, ma dodać nowy rekord do bazy (email i te dwie kolumny z cyframi).

To co chcesz sprawdzać, cyfry czy adres? Tzn. dodać nowy rekord nawet z takim samym adresem jeśli cyfry się zmieniły, czy dodać rekord jeśli jeszcze nie ma takiego adresu email?


--------------------
Go to the top of the page
+Quote Post
redelek
post 23.11.2018, 21:32:53
Post #3





Grupa: Zarejestrowani
Postów: 658
Pomógł: 37
Dołączył: 4.06.2005
Skąd: Wawa

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


jeśli adres istnieje zaktualizuje tylko liczby, jeśli adresu nie ma doda cały nowy rekord z tym adresem


--------------------
Pozdrawiam
Piotrek R
Go to the top of the page
+Quote Post
trueblue
post 23.11.2018, 21:39:46
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


https://www.sqlite.org/lang_UPSERT.html
Musi być założony indeks unikalny na pole email.


--------------------
Go to the top of the page
+Quote Post
redelek
post 23.11.2018, 21:43:35
Post #5





Grupa: Zarejestrowani
Postów: 658
Pomógł: 37
Dołączył: 4.06.2005
Skąd: Wawa

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


ja mam id jako pole unikalne,

ale chodzi o to jak w jednej pętli sprawdzić czy taki adres jest w bazie, czy to znaczy że mam zrobić dwie pętle ?


--------------------
Pozdrawiam
Piotrek R
Go to the top of the page
+Quote Post
trueblue
post 23.11.2018, 21:47:52
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


A czemu chcesz to sprawdzać w pętli?


--------------------
Go to the top of the page
+Quote Post
redelek
post 23.11.2018, 22:02:03
Post #7





Grupa: Zarejestrowani
Postów: 658
Pomógł: 37
Dołączył: 4.06.2005
Skąd: Wawa

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


bo plik ma po 1000 wpisów.
Ja to tak wymyśliłem

Baza pusta dostaję plik wchodzę na stronę i zaczyna się sprawdzanie pliku z bazą.
Pierwszy wiersz pliku jest w bazie ?
opcja 1: nie ma dodaję wpisy
opcja 2: jest adres aktualizuję tylko cyfry.
Po skończeniu pliku usuwam.

Tak mi się wydaje że do tego powinna być pętla, żeby zawsze wszystkie linijki z pliku sprawdzić. Może można inaczej, ale nie wiem jak sad.gif

Ten post edytował redelek 23.11.2018, 22:02:37


--------------------
Pozdrawiam
Piotrek R
Go to the top of the page
+Quote Post
trueblue
post 23.11.2018, 22:03:02
Post #8





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Podałem Ci wyżej rozwiązanie.
Powinieneś użyć UPSERT.


--------------------
Go to the top of the page
+Quote Post
redelek
post 24.11.2018, 13:19:16
Post #9





Grupa: Zarejestrowani
Postów: 658
Pomógł: 37
Dołączył: 4.06.2005
Skąd: Wawa

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


wywala mi błąd jak robię tak zapytanie

  1. $db = new MyDB();
  2. $fileHandle = fopen("$file_from_mail_serwer", "r");
  3.  
  4. while (($r = fgetcsv($fileHandle, 0, ",")) !== FALSE) {
  5.  
  6. //INSERT INTO vocabulary(word) VALUES('jovial')
  7. //ON CONFLICT(word) DO UPDATE SET count=count+1;
  8.  
  9. $query=$db->query("INSERT INTO users (id, email, cyfra1, cyfra2) VALUES (NULL, '$r[0]', '$r[1]', '$r[2]')
  10. ON CONFLICT(email)
  11. DO UPDATE SET cyfra1='$r[1]', cyfra2='$r[2]'"); //TO JEST 87 linijka
  12. }


Kod
Warning: SQLite3::query(): Unable to prepare statement: 1, near "ON": syntax error in /Users/predel/Sites/TESTY_IBD/muser/file.php on line 87

Warning: SQLite3::query(): Unable to prepare statement: 1, near "ON": syntax error in /Users/predel/Sites/file.php on line 87

Warning: SQLite3::query(): Unable to prepare statement: 1, near "ON": syntax error in /Users/predel/Sites/file.php on line 87

Warning: SQLite3::query(): Unable to prepare statement: 1, near "ON": syntax error in /Users/predel/Sites/file.php on line 87


Co robię nie tak?

Ten post edytował redelek 24.11.2018, 21:10:52


--------------------
Pozdrawiam
Piotrek R
Go to the top of the page
+Quote Post
trueblue
post 24.11.2018, 21:37:36
Post #10





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Którą wersję SQLite masz zainstalowaną?


--------------------
Go to the top of the page
+Quote Post
redelek
post 24.11.2018, 21:45:40
Post #11





Grupa: Zarejestrowani
Postów: 658
Pomógł: 37
Dołączył: 4.06.2005
Skąd: Wawa

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


3.23.1


--------------------
Pozdrawiam
Piotrek R
Go to the top of the page
+Quote Post
trueblue
post 24.11.2018, 22:04:35
Post #12





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


A w linku, który podałem:
Cytat
UPSERT syntax was added to SQLite with version 3.24.0 (2018-06-04).


--------------------
Go to the top of the page
+Quote Post
redelek
post 25.11.2018, 01:34:11
Post #13





Grupa: Zarejestrowani
Postów: 658
Pomógł: 37
Dołączył: 4.06.2005
Skąd: Wawa

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


działa działa, ale musiałem wywalić xampp bo miał wersję 3.7(wcześniej podałem Ci wersję systemową) i zrobić wszystko samemu, teraz mam sqlite3.25 php 7.2 i działa jak złoto.
DZIĘKUJĘ ZA POMOC


--------------------
Pozdrawiam
Piotrek R
Go to the top of the page
+Quote Post
trueblue
post 25.11.2018, 08:37:41
Post #14





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Przy niedużym wsadzie pętli while możesz użyć tylko do zbudowania listy wartości jaką trzeba aktualizować, a samą aktualizację przeprowadzić jednym UPSERT.


--------------------
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: 14.08.2025 - 03:53