[RISOLTO]Settare datetime
[RISOLTO]Settare datetime postato il 06/12/2017 21:49:04 nel forum programmazione, open source e hosting e modificato da miagy il 15/12/2017 00:33:02
Ciao ragazzi,
Scrivo qui perché non riguarda GDRCD
allora, data una tabella oggetto con un campo chiamato giorno e minuto che può essere settato con qualsiasi valore (2,7,0,1000 ecc), come posso aggiungere il valore scelto solo al campo day e al campo minut dell'ora attuale.
Mi spiego ancora MEGLIO.
Ora sono le 21.00.13 del 06/12
Scegliendo oggetto Z che ha come valore giorno 1 e minuto 6, che tipo di update devo fare affinché cambi in 21.06.13 del 07/12?
Pagine → 1
06/12/2017 21:59:36
Non credo di aver compreso bene.
Ti chiederei di mostrare con precisione un contenuto reale di esempio per quelle due colonne e successivamente come vorresti che diventassero.
Secondariamente ti chiederei come mai non hai usato un campo piu' appropriato per l'archiviazione delle date. MySql e altri RDBMS supportano tipologie di dato che permettono di archviare data ed ora in un unica colonna e questo agevola di molto le ricerche e le varie operazioni sulle date.
06/12/2017 21:59:41 e modificato da dyrr il 06/12/2017 22:00:55
qualcosa tipo:
UPDATE table SET date = DATE_ADD(date, INTERVAL 1 DAY)
Potrebbe andarti bene owwiamente nell'esempio non conoscendo la tabella non ho specificato nessuna condizione di WHERE li devi adattare la query di esempio che serve solo per mostrare la sintassi di DATE_ADD()
Documentazione: https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add ↗
dopo la risposta di blanks mi sorge il dubbio, ero convinto che avessi usato per quella tabella un campo DATETIME, ho capito male io?
06/12/2017 22:23:02
che tipologia di campo è ? da quello che scrivi non mi sembra uno di quelli più convenzionali.
11/12/2017 13:33:37 e modificato da miagy il 15/12/2017 00:33:27
Intanto chiedo scusa per il ritardo: ho potuto connettermi solo adesso.
Allora, mi spiego meglio perché effettivamente mi sono spiegato da cani.
Sostanzialmente tutto il discorso è legato all'equipaggiamento di alcuni oggetti che possono potenziare per giorni/ore le stats degli utenti (settati nel pannello di creazione oggetto). Ovviamente, le stat standard sono regolate nella tabella OGGETTO (quindi, ad esempio, LANCIA incrementa 3 su forza e toglie -1 su velocità; arco incrementa 2 su destrezza e 1 su attacco ecc).
Adesso, fino a quando si tratta di crearlo/attivarlo il problema non si pone. Funziona tutto alla perfezione. Il problema che ho, sorge quando si tratta di eliminare tale potenziamento.
Ho dunque creato una pagina (controllo_potenziamento.php) che dovrebbe controllare se tra gli oggetti del personaggio ci sia un oggetto la cui data termine di potenziamento è scaduta o no.
11/12/2017 19:39:39
hai provato a stampare la query ?
ed il suo risultato ?
che errore ti restituisce ?
12/12/2017 22:00:57 e modificato da miagy il 15/12/2017 00:33:55
Okay, sono riuscito a sistemare e adesso tutto funziona perfettamente.
Ho solo un problema: adesso anche se trova solo un risultato (data potenziamento ormai passata) mi mette in NULL tutte, anche quelle il cui potenziamento è ancora validoò
13/12/2017 10:18:12
miagy ha scritto: anche se trova solo un risultato (data potenziamento ormai passata) mi mette in NULL tutte
Ciao, se ho capito bene il problema, quello che chiedi puoi farlo in un'unica query, con infatti un' update puoi verificare solo i record soddisfatti dalla condizione ed aggiornarli in caso contrario non ti interessa interagire in alcun modo. In generale un'update "cicla" tutti i record in base alla clausola where ma è comunque un'iterazione ed è quello che fa al caso tuo. In questo modo scrivi un codice più pulito ed anche in prestazioni ne sarai ripagato.
Un'altra cosa che è bene tenere in considerazione, oltre al sanitize dei parametri sia in output dal database sia in input, è anche quella di evitare le SELECT massive "*", non è cosa da poco e considerato che tu devi fare un'update non ti serve nemmeno.
Vengo alla query, prova a vedere se così funziona come dici
Ho usato una join quindi i record che non hanno corrispondenza tra gli id delle due tabelle non verranno considerati nell'update
<?php
$sql = "UPDATE OggettoPotenziamento";
$sql .= " JOIN Oggetto ON OggettoPotenziamento.IDOggetto = Oggetto.IDOggetto";
$sql .= " SET OggettoPotenziamento.Scadenza = null ";
$sql .= " WHERE OggettoPotenziamento.Scadenza < NOW() ";
$sql .= " AND OggettoPotenziamento.Scadenza IS NOT NULL";
$sql .= " AND OggettoPotenziamento.Nome = '".addslashes($Login)."' ";
$r = mysql_query($sql) or die(mysql_error());
13/12/2017 11:33:13 e modificato da miagy il 13/12/2017 11:33:29
rematore ha scritto: Ho usato una join quindi i record che non hanno corrispondenza tra gli id delle due tabelle non verranno considerati nell'update
<?php
$sql = "UPDATE OggettoPotenziamento";
$sql .= " JOIN Oggetto ON OggettoPotenziamento.IDOggetto = Oggetto.IDOggetto";
$sql .= " SET OggettoPotenziamento.Scadenza = null ";
$sql .= " WHERE OggettoPotenziamento.Scadenza < NOW() ";
$sql .= " AND OggettoPotenziamento.Scadenza IS NOT NULL";
$sql .= " AND OggettoPotenziamento.Nome = '".addslashes($Login)."' ";
$r = mysql_query($sql) or die(mysql_error());
Ti ringrazio intanto del suggerimento, cosa che ho provveduto subito :)
Guarda, il tuo codice funziona (nel senso che mi setta NULL solo gli oggetti scaduti).
Ciò che insorge, però, è nel caso in cui gli oggetti scaduti fossero più di uno:
Oggetto A: scadenza 12/12 (For: 1, Vel: 1, Att: 1)
Oggetto B: scadenza 08/12 (For: 1, Vel: 1, Att: 1)
Pur settandomi entrambi in NULL (come è giusto che avvenga), l'UPDATE di sottrazione (in tutto 6 punti, 2 a parametro) mi calcola solo il primo (Oggetto A) e non il secondo (Oggetto B).
$sql01=mysql_fetch_array(mysql_query("SELECT * FROM Pg"));
$sql = "Velocita = Velocita-".$riga['Vel'].", Forza = Forza-".$riga['For'].", Attacco = Attacco-".$riga['Att']."";
$sql01 = "UPDATE Pg SET ".$sql ." WHERE Nome = '".addslashes($Login)."'";
$risult = mysql_query($sql01);
13/12/2017 20:03:53
Alluuura, ho aggiornato il codice ora dovrebbe andare e mi spiego anche perché facevi una select :)
Praticamente, faccio selezionare solo i record che hanno oggetti che non sono ancora scaduti ma che lo dovranno essere. Quindi per ogni record mi porto via il nome del pg che ha l'oggetto e i tre attributi che usi nel calcolo. Ciclo i risultati della query con il while quindi poi, prima, aggiorno le stat poi setto l'oggetto come scaduto per il pg specificato
<?php
$sql = "SELECT OggettoPotenziamento.Nome, Oggetto.Vel, Oggetto.For, Oggetto.Att";
$sql .= " JOIN Oggetto ON OggettoPotenziamento.IDOggetto = Oggetto.IDOggetto";
$sql .= " WHERE OggettoPotenziamento.Scadenza < NOW() ";
$sql .= " AND OggettoPotenziamento.Scadenza IS NOT NULL";
$sql .= " AND OggettoPotenziamento.Nome = '" . addslashes($Login) . "'";
$r = mysql_query($sql) or die(mysql_error());
while ($row = mysql_fetch_array($r)) {
# eseguo le sottrazioni
$nSql = "UPDATE Pg SET";
$nSql .= " Velocita = Velocita - " . $row["Vel"] . ",";
$nSql .= " Forza = Forza - " . $row["For"] . ",";
$nSql .= " Attacco = Attacco - " . $row["Att"];
$nSql .= " WHERE Nome = '" . $row["Nome"] . "' ";
mysql_query($nSql);
# setto a null l'oggetto scaduto
mysql_query("UPDATE OggettoPotenziamento SET Scadenza = null WHERE Nome = '" . $row["Nome"] . "' ");
}
Pagine → 1
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
Tibia ↗
The Coven ↗
Crossout ↗
World of the Sea Battle ↗
New Orleans ↗
State of Survival ↗
Wuthering Waves ↗