Zapisywanie danych do SQL
^Grzyboo
11.11.2013
Witam, dawno mnie nie było na tym forum, ale wziąłem się za nowy serwer i przychodzę z prośbą o pomoc ![]()
Nigdy wcześniej nie używałem SQL - nVault wystarczał.
Postanowiłem się przerzucić na bazy danych, bo w końcu każdy ogarnięty hosting dodaje bazę za darmo (pamiętne czasy, kiedy wszędzie było to 10zł / mc zarówno za FD jak i MySql)
Ogólnie problem mam z zapisem danych.
Kiedy używam:
To istniejące wpisy rzeczywiście ustawia tak jak chcę, ale nie tworzy nowych wpisów. Tzn - nie ma Cię w bazie - nie zostaniesz zapisany.
Drugim sposobem:
Jest na odwrót. Dodaje nowy wpis, ale nie nadpisuje istniejących.
Jak sobie z tym poradzić? Gdy przeglądam pluginy to zawsze używany jest tylko 1 sposób, a działa ![]()
Gh0st
11.11.2013
Należy sprawdzić wcześniej, jeśli wpis nie istnieje to należy go utworzyć metodą INSERT natomiast jeśli już istnieje, winno się go zmodyfikować poleceniem UPDATE
^Grzyboo
11.11.2013
A jest jakaś jedna komenda na sprawdzenie, czy już gracz ma wpis?
Ok, już sobie poradziłem. Użyłem SQL_MoreResults(Query) podczas wczytywania.
Póki co wszystko wygląda na działające. Dzięki za pomoc ![]()
Użytkownik ^Grzyboo edytował ten post 11.11.2013 18:06
Jak się nazwać
11.11.2013
Proszę bardzo:
http://amxx.pl/topic...in-baza-danych/
lepiej Ci tego nie wytłumaczymy, bardzo dobry poradnik
Leihto
11.11.2013
Masz 2 wyjścia:
1. Wykonaj zapytanie SELECT i sprawdź czy są jakieś wyniki: Jeśli tak, wykonaj zapytanie update, jeśli nie wykonaj zapytanie INSERT
2. Jedno zapytanie: INSERT + ON DUPLICATE
INSERT INTO `tabela` ( `kluczid`, `klucz1`, `klucz2` ) VALUES ( 'wartosc', 'wartosc1', 'wartosc2' ) ON DUPLICATE KEY UPDATE `klucz1` = VALUES( `klucz1` ), `klucz2` = VALUES( `klucz2` )
GwynBleidD
11.11.2013
Selecta nie używaj, wtedy musisz użyć 2 zapytań, zamiast jednego... Lepiej użyć INSERT z dodatkiem ON DUPLICATE KEY UPDATE. http://amxx.pl/topic...in-baza-danych/ zainteresuj się tym.
^Grzyboo
11.11.2013
Zrobiłem ogólnie tak:
client_putinserver > WczytajDane > jeśli nie ma danych użyj INSERTA, czyli stwórz wpis z 0 expa itd // jeśli są dane - wczytaj exp
A potem przy zapisywaniu już jest tylko UPDATE
Chyba tak też jest ok?
sebul
11.11.2013
Czasami select jest potrzebny, zresztą jakiś czas temu na pw pisałem Ci do czego mi jest potrzebny.Selecta nie używaj, wtedy musisz użyć 2 zapytań, zamiast jednego... Lepiej użyć INSERT z dodatkiem ON DUPLICATE KEY UPDATE. http://amxx.pl/topic...in-baza-danych/ zainteresuj się tym.
GwynBleidD
12.11.2013
Sebul, oczywiście do odczytu danych jest potrzebny, ale po co przy zapisie odczytywać również dane? zwykle odczytujemy gdy gracz wchodzi, a zapisujemy gdy wychodzi, nabije level, stanie się cośtam lub po prostu co jakiś czas, wtedy nie musimy ponawiać odczytu.
^Grzyboo
12.11.2013
Skorzystam tutaj i nie będę tworzyć nowego, głupiego tematu.
Pytanie może głupie: ale jak pobrać całkowitą liczbę wpisów ( rzędów ), lub pole z kolumny 'id' z ostatniego wpisu
Potrzebuje tego do wyznaczenia całkowitej liczby graczy w komendzie /rank
GwynBleidD
12.11.2013
id jest bez sensu
czasem usuniesz jakieś ID, a ono już nie zostanie ponownie zapełnione. Ilość możesz pobrać poprzez
SELECT COUNT(id) FROM tabela
Jednak gdy pobierasz np 30 graczy pierwszych od razu do tabelki (czy ileśtam) to wykonywanie 2 zapytania do pobrania ogólnej ilości graczy jest troszkę nieefektywne. Dlatego polecam zrobić to w jednym zapytaniu:
SELECT tu,musisz,wymienic,dokladnie,kolumny,do,pobrania, (SELECT COUNT(id) FROM tabela) AS `count` FROM tabela
Takie coś doda Ci dodatkową kolumnę o etykiecie count do każdego wiersza, będzie w niej wpisane dokładnie to samo w każdym wierszu, ale to mało ważne ![]()
Jeśli chcesz pobrać ranking dowolnego gracza z bazy, na to też jest fajny trick (z uwzględnieniem remisów)




