←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

Zapisywanie danych do SQL

  • +
  • -
^Grzyboo - zdjęcie ^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:

Spoiler

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:

Spoiler

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 :)

 

 

Odpowiedz

  • +
  • -
Gh0st - zdjęcie 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

Odpowiedz

  • +
  • -
^Grzyboo - zdjęcie ^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
Odpowiedz

  • +
  • -
Jak się nazwać - zdjęcie Jak się nazwać 11.11.2013

Proszę bardzo:

http://amxx.pl/topic...in-baza-danych/

lepiej Ci tego nie wytłumaczymy, bardzo dobry poradnik

Odpowiedz

  • +
  • -
Leihto - zdjęcie 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` )
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie 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.

Odpowiedz

  • +
  • -
^Grzyboo - zdjęcie ^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?

Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 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.

Czasami select jest potrzebny, zresztą jakiś czas temu na pw pisałem Ci do czego mi jest potrzebny.
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie 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.

Odpowiedz

  • +
  • -
^Grzyboo - zdjęcie ^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

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie 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)

Odpowiedz