Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQLite][PHP]Sprawdzanie czy email jest w bazie
Forum PHP.pl > Forum > Przedszkole
redelek
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
trueblue
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?
redelek
jeśli adres istnieje zaktualizuje tylko liczby, jeśli adresu nie ma doda cały nowy rekord z tym adresem
trueblue
https://www.sqlite.org/lang_UPSERT.html
Musi być założony indeks unikalny na pole email.
redelek
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 ?
trueblue
A czemu chcesz to sprawdzać w pętli?
redelek
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
trueblue
Podałem Ci wyżej rozwiązanie.
Powinieneś użyć UPSERT.
redelek
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?
trueblue
Którą wersję SQLite masz zainstalowaną?
redelek
3.23.1
trueblue
A w linku, który podałem:
Cytat
UPSERT syntax was added to SQLite with version 3.24.0 (2018-06-04).
redelek
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
trueblue
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.
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.