• Psst! Ano, Ty! Ještě nejsi zaregistrovaný na našem herním fóru? Přicházíš tak o možnost zapojit se do diskuzí a navíc si tu můžeš zkrátit čekání například při výstavbě nové budovy či jednotek. Zaregistruj se ještě dnes pomocí následujícího odkazu:

    » Vytvořit účet na fóru

barbarske vesnice v externich datech

DeletedUser

Guest
zdravim. rad bych se zeptal, jak ziskat data barbarskych vesnic. na svete 13 (jinde jsem to nezkousel) se mi v souboru /map/village.php neobjevily barbarsky vesnice (player s id 0). za odpovedi dekuju. doufam ze to tu uz nekde neni, ja to nikde nenasel.
 

DeletedUser2029

Guest
Někde děláš chybu.

Protože ve village.txt (resp. village.txt.gz) pro 13. svět jsou na pozici ID hráče-"majitele vesnice" i nuly.

Jak v starších datech co mám, tak i v teď stažených.
 

DeletedUser

Guest
SELECT *
FROM villages
WHERE player = 0
LIMIT 0 , 30

MySQL vrátil prázdný výsledek (tj. nulový počet řádků). ( Dotaz zabral 0.0313 sekund )
 

DeletedUser2029

Guest
Takže upřesňuji, jestli jsem dobře pochopil.

Jestli jsou či nejsou ve staženém souboru "villages.txt" barbarky netušíš. Protože se ptáš na mysql, tedy až na tebou nějak následně přelouskaná a upravená data.

--------

Protože se tady tak nepřesně dotazuješ (uvádíš skutečnosti jako fakta, která fakty nejsou), tak je problém. Programování je exaktní záležitost, musíš se vyjadřovat přesně a nezamlžovat a nedělat "zkratky" tam, kde to nejde.


1) Ve svém původním prvním postu uvádíš "/map/villages.php". Nic takového neexistuje. Takže nevím, co vlastně bereš jako zdroj dat a zda jsi naimportoval vůbec něco.

2) U mne stejný dotaz (SELECT *FROM ... WHERE ... = 0 LIMIT 0 , 30) do mé interní mysql /pochopitelně/ funguje. Mám tam ale data 1. světa. Data 13. světa tam sypat nebudu, ale bylo by to stejné. Fungovalo by to. Proč nefunguje tento konkrétní dotazu u Tvé databáze pochopitelně netuším, příčin může být mnoho. Namátkou:

2a) Nevím, zda se u Tebe opravdu tabulka jmenuje "villages", zda sloupec s ID hráče se opravdu jmenuje "player". A zda projdou jiné dotazy.

2b) Nevím, jakým způsobem jsi definoval tabulku, jak db engine (MyISAM/InnoDB/...), a jak jsi definoval konkrétní sloupec odkazu na hráče. Nevím, jak jsi tam nasypal data. Tedy zda se tam importem dostaly všechny řádky (EDIT: či vůbec nějaké řádky). Tam může hrát roli jak "povolená" 0 (INT NOT NUL) tak i třeba zda je sloupec definovaný jako FOREIGN KEY (v závislosti na bd engine) a zda potom vůbec existuje odkazovaná cizí tabulka a zda u ní existuje záznam pro "0". A kvanta dalších drobností ohledně definice a importu.

2c) Protože děláš tolik "zkratek" v logice netuším, zda ten sql dotaz byl zapsán opravdu přesně tak, jak jsi jej zde popsal. Nebo zda to třeba nebylo via "statement", který (dle domunetace) funguje až od určité verze MySQL
SET @a=1;
PREPARE STMT FROM 'SELECT * FROM tbl LIMIT ?';
EXECUTE STMT USING @a;

-------

Chceš-li programovat, přečti si nejprve http://www.hash.cz/inferno/otazky.html
 
Naposledy upraveno moderátorem:

DeletedUser

Guest
nejprve dekuji, ze odpovidas, jsou lidi, kteri kohokoli rovnou zavrhnou treba kvuli jednomu slovu, ktery napsali spatne

at 1) tuto adresu sem pasl jak sem si ji pamatoval, na nahrani pouzivam jeniom trochu poupravenej kod, co je v helpu (je lepsi nez jak bych to psal ja - ani sem neznal tu funkci gzfile)

at 2a) kdyby se tabulka jmenovala jinak, nebo jsem se dotazoval na sloupec , ktery
neexistuje, napsala by jinou chybu nez ze nevratila zadbny radek. krom toho tabulka data skutecne obsahuje, jen zadnou barbarku.

at 2b) InnoDB - zde pripoustim ze neznam dusledky teto volby, nechal jsem vychozi

at 2c) sql dotaz jsem zkopiroval

toto pouzivam na nahrani

$lines = gzfile('http://cs13.divokekmeny.cz/map/village.txt.gz');
if(!is_array($lines))
{
echo "Villages failed.<br>";
}
else
{
mysql_query("truncate table villages");
foreach($lines as $line)
{
list($id, $name, $x, $y, $player, $points, $type) = explode(',', $line);
$name = urldecode($name);
$name = addslashes($name);
mysql_query("INSERT INTO villages SET id='$id', name='$name', x='$x', y='$y', player='$player', points='$points', type='$type'");
}
echo "Villages done.<br>";
}

a tabulka ma strukturu

id bigint(2)
x,y int(11)
name tinitext
player, points, type int(11)
pri kopirovani se mi sem vkladaly divny "objekty", takze jsem to napsal "polopaticky"

mozna by to mohlo byt necim tim jak si psal v bode 2b. jelikoz jsem spise samouk, nektery z tech zalezitosti ani nevim co znamenaj (foreign key). ted me napadlo jakym zpusobem mysql chape nulovou hodnotu u cisel, pokud i cisel nula to same jako null, pak je jasne, kde byla chyba. hned to jdu vyzkouset.
 

DeletedUser

Guest
tak jsem to vyzkousel:
1) v tabulce jsou i vesnice, ktere maji type = 0 i presto, ze mam nastaveno, ze sloupec type mam nastaven not null
2) stale nenachazim barbarky
3) INSERT INTO `dk`.`villages` (`id`, `x`, `y`, `name`, `player`, `points`, `type`) VALUES ('1', '1', '1', 'pokus', '0', '0', '0'); se povede - coz dokazuje ze v tabulce mohou byt vesnice s player = 0

doufam ze te napadne neco dalsiho, me uz nic nenapada. dekuji
 

DeletedUser

Guest
jeste jedna vec, overil jsem si ty stazeny soubory, a ty barbarky obsahovaly, takze chyba je nekde u me.
 

DeletedUser2029

Guest
První co mne napadá "InnoDB" tuším opravdu dělá lepší kontroly, takže jestli tam někde něco nebude. Uvidíme později.

Zkusíme to minimalizovat. A postupně.

Zkus bez 'limit', jestli to něco vrátí
Kód:
SELECT * FROM villages WHERE player = 0

Máš-li to lokálně, nebo máš li přímý přístup a jsi na windows, zkus
Start->Programy->Mysql->MySQL Query Browser
a v něm
Kód:
SELECT * FROM villages
a očima přelétni, zda tam jsou barbarky

----

A ještě, kde ty SELECT testovací příkazy provádíš. V php? Nebo jinde? Projde vůbec nějaký SELECT příkaz?
 
Naposledy upraveno moderátorem:

DeletedUser2029

Guest
A ještě. Co

Kód:
SELECT * FROM villages WHERE player = [I]TvojeID[/I]

Vrátí seznam Tvých vesnice nebo ne? A stejná verze vč. LIMIT.

Ať zjistíme, jestli se to týká "0" nebo je problém v select jako takovém či někde jinde.
 
Nahoru