Generatore casuale di oggetti e relativa stampa in chat [RISOLTO]
Generatore casuale di oggetti e relativa stampa in chat [RISOLTO] postato il 14/02/2016 16:10:53 nel forum programmazione, open source e hosting e modificato da maclay il 12/08/2016 14:39:44
Sono di nuovo io che rompo, lo so. Non uccidetemi!
Questa volta, mi è venuta l'insana idea di creare un tool che, come i dadi, generi un risultato casuale e lo stampi in chat.
Vorrei però che questo generatore prendesse i dati dalla tabella degli oggetti e, facendo qualche indagine, credo che la soluzione più semplice per ottenere ciò che voglio sia di utilizzare il RAND(), con una formula di questo tipo:
SELECT column FROM table ORDER BY RAND()
A questo punto, però, ho due problemi perchè è la prima volta in assoluto che mi cimento in una cosa del genere:
1) come scrivo il tutto? E soprattutto, come faccio a farglielo stampare in chat, proprio come succede per i dadi?
2) vorrei che la query desse 2 risultati, cioè due oggetti; come posso fare?
Grazie in anticipo a chiunque vorrà rispondere!
Pagine → 1 2
14/02/2016 17:25:30
in GDRCD o in generale?
14/02/2016 17:35:56 e modificato da darkside of breakfast il 14/02/2016 17:36:21
devi darle la query che hai messo ma dopo order RAND dire anche LIMIT 2
SELECT * FROM table order BY RAND() LIMIT 2
e poi devi fare un ciclo e stampare quest'informazione secondo qualsiasi codice html sia usato dalla funzione del dado*.
14/02/2016 17:45:46
@Longbow: in GDRCD:
darkside of breakfast ha scritto: devi darle la query che hai messo ma dopo order RAND dire anche LIMIT 2
SELECT * FROM table order BY RAND() LIMIT 2
e poi devi fare un ciclo e stampare quest'informazione secondo qualsiasi codice html sia usato dalla funzione del dado*.
Per il LIMIT 2, ci avevo già pensato ma non ero certa che potesse funzionare.
Per il resto, immagino di dover creare un nuovo tipo nel ref_header e poi aggiungere un input apposito nel frame_chat...
12/08/2016 14:38:48
Dunque, so che la discussione è vecchiotta ormai ma visto che, grazie al paziente Blancks, sono riuscita ad implementare il tool, posto qui il tutto in modo che altri ne usufruiscano se dovessero averne bisogno.
Per prima cosa, aprite questo link: https://github.com/GDRCD/GDRCD/blob/master/ref_header.inc.php#L188 ↗
Aspettate che la pagina si carichi completamente e dovreste vedere una } evidenziata. Quello è il punto dopo il quale dovrete inserire il codice sottostante, nel vostro ref_header.
// entriamo nella condizione solo se l'opzione è quella che vogliamo noi, il trim e l'strtolower fanno si di ignorare eventuali spazi vuoti aggiunti e rende il controllo case insensitive
elseif (trim(strtolower($chat_message)) == '#items') {
$items = gdrcd_query(
"SELECT nome FROM oggetto ORDER BY RAND() LIMIT 2",
'result'
);
// Un messaggio di base che esce o in caso di errore o se la
// tabella oggetto non possiede nessun record
$chat_message = $_SESSION['login'] . ' non ha trovato nulla.';
// se sono stati trovati record nella tabella
if (gdrcd_query($items, 'num_rows') > 0) {
// riformattiamo il messaggio base
$chat_message = $_SESSION['login'] . ' ha trovato i seguenti oggetti: ';
while ($row = gdrcd_query($items, 'fetch')) {
// e per ogni riga pescata dal db, aggiungiamo il nome dell'oggetto
$chat_message .= $row['nome'] . ', ';
}
// alla fine del ciclo, sicuramente la stringa termina con uno spazio e una virgola di troppo, ce ne liberiamo quindi
$chat_message = substr($chat_message, 0, -2);
// liberiamo le risorse impiegate dalla query
gdrcd_query($items, 'free');
}
// al resto ci pensa il ref_header, hai solo da provare il nuovo comando in chat
}
Fatto questo, non dovrete far altro che inserire un form apposito in frame_chat per far sì che il tool possa essere utilizzato dagli utenti.
Aggiungete quindi quest'altro pezzo di codice:
<form method="post" action="/pages/chat.inc.php?ref=10&chat=yes" target="chat_frame">
<input type="hidden" name="type" value="0">
<input type="hidden" name="message" value="#items">
<input type="hidden" name="op" value="new_chat_message">
<input type="submit" value="Ottieni Drop Oggetti Casuale!">
</form>
Et voilà, il gioco è fatto!
Un grazie sentitissimo a Blancks per la pazienza e per le sue spiegazioni, chiarissime anche per chi come me ha veramente poca esperienza con il PHP.
28/10/2018 20:51:03
Riporto in Up questa discussione.
Il comando qui riportato come potrebbe essere integrato con un limite di ricerche giornaliere? ed eventualmente come è possibile assegnare automaticamente l'oggetto trovato facendolo comparire in equip?
04/11/2018 13:22:24
Ciao,
per fare quello che chiedi dobbiamo usare due variabili di sessione. La prima, timestampRichieste, che terrà in memoria l'esecuzione della prima richiesta di ricerca per il giorno corrente e la seconda, numeroRicercheDay, che conterà il numero di richieste effettuate per il giorno corrente.
Passiamo al codice, prendi la porzione di codice php di maclay e sostituiscila con quella mia
<?php
else if (trim(strtolower($chat_message)) == '#items') {
$limiteRicerche = 2;
$messaggioLimiteSuperato = $_SESSION['login'] . ' ha superato il limite di richieste giornaliere.';
# se il timestamp non esiste o è passato un giorno dall'ultima generazione lo rigenero e resetto il contatore delle ricerche [1]
# altrimenti incremento il contatore delle ricerche [2]
if (!isset($_SESSION['timestampRichieste']) || (isset($_SESSION['timestampRichieste']) && time() > strtotime($_SESSION['timestampRichieste'], '+1 day'))) {
# [1]
$_SESSION['timestampRichieste'] = time();
$_SESSION['numeroRicercheDay'] = 1;
} else {
# [2]
$_SESSION['numeroRicercheDay'] += 1;
}
# se non ho superato il limite di ricerche per il giorno procedo con la logica seguente. [3]
# in caso contrario stampo il messaggio contenuto nella variabile @var $messaggioLimiteSuperato [4]
if (
isset($_SESSION['timestampRichieste']) &&
isset($_SESSION['numeroRicercheDay']) &&
time() < strtotime($_SESSION['timestampRichieste'], '+1 day') &&
$_SESSION['numeroRicercheDay'] <= $limiteRicerche
) {
# [3]
$eventualiDaEquipaggiare = [];
$items = gdrcd_query("SELECT id_oggetto, nome, ubicabile, cariche FROM oggetto ORDER BY RAND() LIMIT 2", 'result');
$chat_message = $_SESSION['login'] . ' non ha trovato nulla.';
if (gdrcd_query($items, 'num_rows') > 0) {
$chat_message = $_SESSION['login'] . ' ha trovato i seguenti oggetti: ';
while ($row = gdrcd_query($items, 'fetch')) {
$chat_message .= $row['nome'] . ', ';
# mi popolo un'array con gli oggetti che dovrò poi verificare con la logica dell'equipaggiamento
$eventualiDaEquipaggiare[] = array(
'id' => $row['id_oggetto'],
'nome' => $row['nome'],
'posizione' => $row['ubicabile'],
'cariche' => $row['cariche'],
);
}
$chat_message = substr($chat_message, 0, -2);
gdrcd_query($items, 'free');
}
# se ho almeno un oggetto da equipaggiare, entro nel ciclo
# se l'oggetto già esiste per il personaggio, semplicemente aumento la quantità dello stesso di uno [5]
# altrimenti lo aggiungo [6]
foreach ($eventualiDaEquipaggiare as $e) {
$q = "SELECT id_oggetto FROM clgpersonaggiooggetto";
$q .= " JOIN oggetto ON oggetto.id_oggetto = clgpersonaggiooggetto.id_oggetto ";
$q .= " WHERE clgpersonaggiooggetto.nome = '" . $_SESSION['login'] . "' AND clgpersonaggiooggetto.id_oggetto = " . $e['id'] . " LIMIT 1";
if (gdrcd_query($q, 'num_rows') > 0) {
# [6]
gdrcd_query('INSERT INTO clgpersonaggiooggetto (nome, id_oggetto, numero, cariche, commento, posizione) VALUES ("' . $e['nome'] . '", "' . $e['id'] . '", 1, "' . $e['cariche'] . '", null, "' . $e['posizione'] . '")');
} else {
# [5]
gdrcd_query("UPDATE clgpersonaggiooggetto SET numero = numero + 1 WHERE nome ='" . $_SESSION['login'] . "' AND id_oggetto='" . $e['id'] . "'");
}
}
} else {
# [4]
$chat_message = substr($messaggioLimiteSuperato, 0, -2);
}
}
il resto lascia tutto invariato e segui le indicazioni di maclay su dove inserire il codice.
prima di procedere con le modifiche, fa sempre un backup e del database e del file
06/11/2018 10:06:55 e modificato da staff shadowland il 06/11/2018 10:07:53
Ti ringrazio moltissimo per la risposta.
C'è un problema che dovrebbe derivare dal punto 6
Quando il personaggio possiede un oggetto e ne trova uno uguale, questo viene aggiunto a quello già in possesso in maniera corretta. Invece se si tratta di aggiungere un nuovo oggetto trovato che però non si possiede, questo non viene aggiunto in alcun modo. Da cosa può dipendere? ho anche provato a cambiare la destinazione dell'oggetto ma non cambia nulla.
# se ho almeno un oggetto da equipaggiare, entro nel ciclo
# se l'oggetto già esiste per il personaggio, semplicemente aumento la quantità dello stesso di uno [5]
# altrimenti lo aggiungo [6]
foreach ($eventualiDaEquipaggiare as $e) {
$q = "SELECT id_oggettorandom FROM clgpersonaggiooggetto_random";
$q .= "JOIN oggettorandom ON oggettorandom.id_oggettorandom = clgpersonaggiooggetto_random.id_oggettorandom";
$q .= "WHERE clgpersonaggiooggetto_random.nome = '" . $_SESSION['login'] . "' AND clgpersonaggiooggetto_random.id_oggettorandom = " .
$e['id'] . " LIMIT 1";
if (gdrcd_query($q, 'num_rows') > 0) {
# [6]
gdrcd_query('INSERT INTO clgpersonaggiooggetto_random (nome, id_oggettorandom, numero, cariche, commento, posizione) VALUES ("' . $e
['nome'] . '", "' . $e['id'] . '", 1, "' . $e['cariche'] . '", null, "' . $e['commento'] . '", null, "' . $e['posizione'] . '")');
} else {
# [5]
gdrcd_query("UPDATE clgpersonaggiooggetto_random SET numero = numero + 1 WHERE nome ='" . $_SESSION['login'] . "' AND
id_oggettorandom='" . $e['id'] . "'");
}
}
} else {
08/11/2018 21:33:31
La query che hai scritto è sbagliata, non c'è corrispondenza tra gli attributi e i valori assegnati. Prova a sostituirla con questa
gdrcd_query('INSERT INTO clgpersonaggiooggetto_random (nome, id_oggettorandom, numero, cariche, commento, posizione) VALUES ("' . $e['nome'] . '", "' . $e['id'] . '", 1, "' . $e['cariche'] . '", null, "' . $e['posizione'] . '")');
10/11/2018 09:33:38
rematore ha scritto: La query che hai scritto è sbagliata, non c'è corrispondenza tra gli attributi e i valori assegnati. Prova a sostituirla con questa
gdrcd_query('INSERT INTO clgpersonaggiooggetto_random (nome, id_oggettorandom, numero, cariche, commento, posizione) VALUES ("' . $e['nome'] . '", "' . $e['id'] . '", 1, "' . $e['cariche'] . '", null, "' . $e['posizione'] . '")');
Postando il messaggio precedente qui in forum è slittata verso il basso la corrispondenza però c'era. Non cambia nulla e si è presentato un ulteriore problema da qualche giorno, pur modificando i parametri o riportandoli come in origine, il personaggio non può effettuare alcuna ricerca come se il tempo non venisse calcolato. Eppure fino a 3 giorni fa non c'erano stati problemi di alcun tipo né ho effettuato modifiche al codice o altro :/
ad ogni modo grazie mille per la pazienza e la disponibilità
29/05/2021 12:03:10
Salve, riporto in alto questo tool perché ho dei problemi... Ho provato a sistemare i codici riportati qui nelle loro giuste location, in ref_header e in frame_chat, e fin qui tutto okay. Il pulsante compare, così come la stringa in chat non appena si clicca. Il problema è che mi esce scritto: " #items " e nulla di più. La dicitura "Tizio ha trovato questo e questo." non appare in nessuna maniera... T.T
Quel #items sarebbe la value del pulsante ma non capisco perché non prenda quanto scritto in ref_header...
Mi piacerebbe anche far apparire l'immagine dell'oggetto oltre al nome, e sistemare il tutto col css... purtroppo però quel codice php da mettere in ref_header è troppo complicato per me da maneggiare.
Una manina, per favore? T.T
Discussione seguita da
Pagine → 1 2
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
Sea of Conquest ↗
Seconda Era ↗
CRSED: F.O.A.D. ↗
Neverness to Everness ↗
Tibia ↗
War Thunder ↗
Hero Wars ↗