• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

MySQLI Referrals Update nowego użytkownika pozostawiając starego. Problem

Object Storage Arubacloud
0 głosów
183 wizyt
pytanie zadane 14 lipca 2020 w SQL, bazy danych przez Kacperhehe Bywalec (2,930 p.)

Skrypt polega na tym, że przy rejestracji nowego użytkownika (on sam pojawia się w tabeli też) wpisując kogoś Referral do pola, pojawia się w komórce tego właśnie użytkownika.

Problemem jest to że chciałbym żeby nowi referralsi pojawiali się po przecinku a w tym momencie pojawia się tylko ostatni zarejestrowany użytkownik.

Wiem że $load_ref się nie pojawia bo nie wiem jak tego użyć próbowałem na jakieś sposoby ale nie wychodzi i dlatego piszę ten post.

.Link do kodu wstawiam bo ja osobiście nie lubię czytać stąd kodu i jest nie przejrzysty ;)

https://throwbin.io/93FpFDq

  	$query = "INSERT INTO users (username, email, password, ref, points) 
  			  VALUES('$username', '$email', '$password', '$ref', '500')";

    $add_username = "INSERT INTO referrals (username) VALUES('$username')";
    if (empty($ref)) {
      // do nothing
    } else {
      $load_ref = "SELECT referrals FROM referrals WHERE username = '$ref'";
      $add_ref = "UPDATE referrals SET referrals = '$username' WHERE username = '$ref'";
    }

  	mysqli_query($db, $query);
    mysqli_query($db, $add_username);
    mysqli_query($db, $load_ref);
    mysqli_query($db, $add_ref);

 

komentarz 15 lipca 2020 przez VBService Ekspert (254,490 p.)
edycja 15 lipca 2020 przez VBService

Dlaczego piszesz kod, który nic nie wykonuje?

if (empty($ref)) {
  // do nothing  ???
} else {
  $load_ref = "SELECT referrals FROM referrals WHERE username = '$ref'";
  $add_ref = "UPDATE referrals SET referrals = '$username' WHERE username = '$ref'";
}

Zapisz po prostu tak

if (! empty($ref)) {
   $load_ref = "SELECT referrals FROM referrals WHERE username = '$ref'";
   $add_ref = "UPDATE referrals SET referrals = '$username' WHERE username = '$ref'";
}

! - wykrzyknik jest operatorem logicznym negacji, czyli w warunku if polecenie empty zwraca wartość true, gdy w tym przypadku zmienna $ref nic nie zawiera (jest pusta), ale przez dodanie ! wartość false zwrócona przez empty, czyli zmienna $ref zawiera jakąś wartość, staje się "prawdziwa", czyli "odwracamy" false w warunku if jest true i kod wewnątrz się wykonuje.

if (! empty($ref)) ... , gdy zmienna nie jest "empty" to spełnia warunek.

1 odpowiedź

0 głosów
odpowiedź 14 lipca 2020 przez Arkadiusz Waluk Ekspert (288,330 p.)
SET referrals = '$username'

Widać, że tu ustawiasz wartość tej kolumny - nie dopisujesz nic, a zmieniasz ją na $username, czyli pewnie jedną ostatnią nazwę. Możesz zrobić tak, aby brał dotychczasową wartość i tylko dopisywał kolejny nick.

Nie wiem co prawda co dokładnie robisz, ale to jednak brzmi jak nie do końca dobre podejście do tematu. Od tego mamy relacje, aby łączyć ze sobą rekordy i trzymać spójne dane. Zrobiłbym więc osobną tabelę na to kto kogo polecił i łączył użytkowników po id. W chwili obecnej gdy zmienisz komuś jednemu nazwę użytkownika to co? Musisz sprawdzać wszędzie w refferals czy ta nazwa nie występuje i aktualizować? A gdybyś chciał wyciągnąć informacje, który użytkownik przez kogo został polecony, to jak? Teraz zapisujesz tylko przy tym, który polecił.

komentarz 15 lipca 2020 przez Kacperhehe Bywalec (2,930 p.)
Właśnie nie wiem w jaki sposób zrobić tak jak napisałeś w 1 akapicie. Próbowałem na wiele sposobów ale ciągle coś nie działa. W jaki sposób do pobranej wartości $load_ref dołączyć wartość $add_ref?
komentarz 15 lipca 2020 przez Kacperhehe Bywalec (2,930 p.)
Do ostatniego zdania mam oddzielną tabele kto kogo polecił.
Jaki tip w jaki sposób sensownie łączyć po id? W jaki sposób miało to mniej więcej wyglądać?
komentarz 15 lipca 2020 przez Arkadiusz Waluk Ekspert (288,330 p.)

Co do 1 to musiałbyś najpierw pobrać dane, czyli wykonać zapytanie, zrobić fetcha (np. fetch_assoc) i wyciągniesz obecną wartość kolumny. Następnie dopisać do tej wartości kolejny username i dopiero to wysłać w UPDATE. 

Jeśli chodzi o drugi sposób to mogą to być 2 tabele:
- users: id, username, ....
- referrals: id usera który polecił, id usera którego polecił

Albo jeśli zawsze dany użytkownik jest polecony tylko przez jednego innego użytkownika, to można zrobić to wszystko w ramach 1 tabeli dodając kolumnę z id usera polecającego, np.
users: id, username, referral_user_id

Teraz przykładowo możesz mieć userów id: 2, username: kowalski, referral_user_id: null oraz drugiego: id: 4, username: nowak, referral_user_id: 2. Tym sposobem będziesz mógł wyszukać wszystkich poleconych przez usera o danym id (tu jest tylko jeden, nowak polecony przez kowalskiego) sprawdzając wartość kolumny referral_user_id oraz odnaleźć przez którego usera polecony został dany user (pobierasz informacje o nowaku i patrzysz po id referral.

komentarz 15 lipca 2020 przez VBService Ekspert (254,490 p.)

Dla przykładu: wink

DROP DATABASE IF EXISTS `demo_referrals`;

CREATE DATABASE `demo_referrals`;
ALTER DATABASE `demo_referrals` DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_polish_ci;

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
    `id` int AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `username` varchar(50) NOT NULL,
    `email` varchar(50) NOT NULL,
    `password` varchar(10) NOT NULL,
    `points` smallint unsigned DEFAULT '0'
) CHARACTER SET utf8 COLLATE utf8_polish_ci;

DROP TABLE IF EXISTS `referrals`;
CREATE TABLE `referrals` (
    # nie zawiera unikalnej kolumny, jeśli chcesz w przyszłość
    # edytować, kopiować czy usuwać rekordy dodaj unikalne pole
    # `id` int AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `id_user` int NOT NULL, # id użytkownika, który POLECA
    `id_user_ref` int NOT NULL, # id użytkownika, który JEST polecany
    FOREIGN KEY (`id_user`) REFERENCES users(`id`),
    FOREIGN KEY (`id_user_ref`) REFERENCES users(`id`)
);

# user1 tworzy konto w systemie - nikt go nie poleca (pierwszy w systemie)
INSERT INTO users (username, email, password) VALUE ('user1', 'email1@poczta.pl', 'pass1');
# user2 tworzy konto - nikt go nie poleca
INSERT INTO users (username, email, password) VALUE ('user2', 'email2@poczta.pl', 'pass2');
# user3 tworzy konto - nikt go nie poleca
INSERT INTO users (username, email, password) VALUE ('user3', 'email3@poczta.pl', 'pass3');

# zobaczmy jak wygląda teraz zawartość tabeli `users`
# czy wszystkie domyslne parametry są prawidłowo aplikowane
# `id` -> AUTO_INCREMENT , `points` -> DEFAULT '0'
SELECT * FROM users;

# user4 tworzy konto - poleca go user2
INSERT INTO users (username, email, password) VALUE ('user4', 'email4@poczta.pl', 'pass4');
# w php pobranie id nowo dodanego INSERT dla pola `id` -> AUTO_INCREMENT, tzw. $last_id
# https://www.php.net/manual/en/function.mysql-insert-id.php
# w tym przykładzie LAST_INSERT_ID() = 4 -> user4.id
INSERT INTO referrals (id_user, id_user_ref) VALUE (2, LAST_INSERT_ID());
# zakładamy, że system daje 10 punktów za każdego ploeconego
UPDATE users SET points = points + 10 WHERE id = 2;

# user5 tworzy konto - poleca go user1
INSERT INTO users (username, email, password) VALUE ('user5', 'email5@poczta.pl', 'pass5');
# w tym przykładzie LAST_INSERT_ID() = 5 -> user5.id
INSERT INTO referrals (id_user, id_user_ref) VALUE (1, LAST_INSERT_ID());
UPDATE users SET points = points + 10 WHERE id = 1;

# user6 tworzy konto - poleca go user1
INSERT INTO users (username, email, password) VALUE ('user6', 'email6@poczta.pl', 'pass6');
INSERT INTO referrals (id_user, id_user_ref) VALUE (1, LAST_INSERT_ID());
UPDATE users SET points = points + 10 WHERE id = 1;

# user7 tworzy konto - poleca go user3
INSERT INTO users (username, email, password) VALUE ('user7', 'email7@poczta.pl', 'pass7');
INSERT INTO referrals (id_user, id_user_ref) VALUE (3, LAST_INSERT_ID());
UPDATE users SET points = points + 10 WHERE id = 3;

# user8 tworzy konto - poleca go user2
INSERT INTO users (username, email, password) VALUE ('user8', 'email8@poczta.pl', 'pass8');
INSERT INTO referrals (id_user, id_user_ref) VALUE (2, LAST_INSERT_ID());
UPDATE users SET points = points + 10 WHERE id = 2;

# user9 tworzy konto - poleca go user1
INSERT INTO users (username, email, password) VALUE ('user9', 'email9@poczta.pl', 'pass9');
INSERT INTO referrals (id_user, id_user_ref) VALUE (1, LAST_INSERT_ID());
UPDATE users SET points = points + 10 WHERE id = 1;

# user10 tworzy konto - poleca go user9
INSERT INTO users (username, email, password) VALUE ('user10', 'email10@poczta.pl', 'pass10');
INSERT INTO referrals (id_user, id_user_ref) VALUE (9, LAST_INSERT_ID());
UPDATE users SET points = points + 10 WHERE id = 9;

# zobaczmy jak wygląda teraz zawartość tabeli referrals
SELECT * FROM referrals;

# wybrane dane user2 i ile ma punktów
SELECT id AS 'ID użytkownika', username AS 'Nazwa użytkownika',
        email AS 'Email użytkownika', points AS 'Punkty'
    FROM users WHERE id = 2;

# wybrane dane użytkoników polecanych przez user1
SELECT u.id AS 'ID użytkownika', u.username AS 'Nazwa użytkownika',
        u.email AS 'Email użytkownika', u.points AS 'Punkty'
    FROM users AS u, referrals As r WHERE u.id = r.id_user_ref AND r.id_user = 1;

# wybrane dane wszystkich user-ów, którzy polecali posortowane
# od usera, który nie dawno dodał się do systemu i polecał
# w tym przykładzie user.id = 1 dawno dodany, user.id = 9 nie dawno dodany
SELECT u.id AS 'ID użytkownika', u.username AS 'Nazwa użytkownika',
        u.email AS 'Email użytkownika', u.points AS 'Punkty'
    FROM referrals As r
    LEFT JOIN users AS u ON u.id = r.id_user
    LEFT JOIN users AS u2 ON u2.id = r.id_user_ref
    GROUP BY u.id DESC;

# lista użytkowników według ilości poleceń
SELECT id AS 'ID', username AS 'Nazwa', email AS 'Email', points AS 'Punkty'
    FROM users AS u
    WHERE points > 0
    ORDER BY points DESC, id ASC;

# dwóch uzytkowników, którzy mają najwięcej poleceń - duża liczba punktów
SELECT id AS 'ID', username AS 'Nazwa', email AS 'Email', points AS 'Punkty'
    FROM users AS u
    WHERE points > 0
    ORDER BY points DESC, id ASC LIMIT 2;

mysql-insert-id ]

Podobne pytania

0 głosów
4 odpowiedzi 1,471 wizyt
pytanie zadane 24 października 2015 w PHP przez Piotrek Karasiński Obywatel (1,870 p.)
0 głosów
1 odpowiedź 1,177 wizyt
pytanie zadane 6 września 2015 w SQL, bazy danych przez Rafik Obywatel (1,870 p.)
0 głosów
1 odpowiedź 667 wizyt

92,669 zapytań

141,567 odpowiedzi

320,033 komentarzy

62,034 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...