[PHP] Incremento di un campo numerico in base a incremento campo di testo

  • Creatore Discussione Creatore Discussione LalaGp
  • Data di inizio Data di inizio

LalaGp

Nuovo Utente
1 Mag 2018
3
0
1
46
Ciao a tutti,
Scusate ma sono alle prime armi e mi sono ritrovata a dover creare un sito con PHP (per un gioco di ruolo ) senza averne le basi tecniche.
Ho bisogno di fare in modo che un campo della mia tabella mysql, dal valore numerico, incrementi di 1 ogni volta che un altro campo di tipo testuale raggiunge un determinato numero di caratteri, per un minimo di 4 invii al giorno e fino al raggiungimento di 3 incrementi del campo numerico.

Tizio scrive una frase di 1000 caratteri, per almeno 4 volte nell'arco della giornata =riceve 1 punto (che incrementa il campo numerico). Può ricevere al massimo 3 punti. Tutte le frasi che potrebbero generare punti oltre questo valore, non lo faranno.

Per ora mi è stato consigliato di fare in un modo, il quale però mi risolve unicamente una parte del problema e non mi conteggia il numero di frasi inviate.

PHP:
$PARAMETERS['settings']['exp_by_chat']['number'] = '1000';
 $PARAMETERS['settings']['exp_by_chat']['max_exp'] = '3';

  if($PARAMETERS['mode']['exp_by_chat']=='ON')
    {
      $msg_length = strlen($chat_message);
      $char_needed = gdrcd_filter('num', $PARAMETERS['settings']['exp_by_chat']['number']);
      $exp_bonus = $msg_length>=$char_needed;
    }

        if($PARAMETERS['mode']['exp_by_chat']=='ON')
{

 //definisce $exp_giornaliera per evitare notice nel while
 $exp_giornaliera = 0;
 

 //Query che recupera il numero di caratteri per messaggi del pg delle ultime 24 ore che hanno generato px;
 $query = "SELECT CHAR_LENGTH(testo) AS msg_length";
 $query .= " FROM chat";
 $query .= " WHERE";    //CONDIZIONI
 $query .= " mittente = '".gdrcd_filter_in($_SESSION['login'])."'";    //il mittente è il pg loggato   
 $query .= " AND (tipo = 'P' OR tipo = 'A' OR tipo = 'M')";    //il messaggio è del tipo di quelli che danno px
 $query .= " AND DATE_ADD( ora, INTERVAL 1 DAY ) >= NOW()";    //è meno vecchio di 24h
 $query .= " AND CHAR_LENGTH(testo) > ".gdrcd_filter('num',$PARAMETERS['settings']['exp_by_chat']['number']);    //è della lunghezza minima per generare px
 //echo $query;
 $result = gdrcd_query($query,'result');
 //clalcola l'esperienza accumulata nelle ultime 24h
 while($row = gdrcd_query($result,'fetch'))
 {
 
 $exp_giornaliera = $exp_giornaliera + ($row['msg_length']>=$char_needed);   

 }
 if($exp_giornaliera < $PARAMETERS['settings']['exp_by_chat']['max_exp'])
 {

 if ($m_type == 'A' || $m_type == 'P' || $m_type == 'M')
 gdrcd_query("UPDATE personaggio SET esperienza = esperienza + ".$exp_bonus." WHERE nome = '".$_SESSION['login']."' LIMIT 1");

 }
}
 
Scusa la domanda, non sarebbe meglio resettare i contatori al giorno corrente?
$query .= " AND DATE_ADD( ora, INTERVAL 1 DAY ) >= NOW()"; //è meno vecchio di 24h

Oltre questa osservazione potresti provare così, bada bene che non ho verificato e non ho ben capito come calcoli l'esperienza.
PHP:
$query="SELECT SUM(CHAR_LENGTH(test)) as numero_caratteri_totali
        COUNT(test) as numero_chat_inviate
        FROM chat
        WHERE mittente='".gdrcd_filter_in($_SESSION['login'])."' AND tipo IN ('P,A,M'),
            AND DATE(ora) = CURDATE()
            AND CHAR_LENGTH(testo) >= ".gdrcd_filter('num',$PARAMETERS['settings']['exp_by_chat']['number']).";
Ottieni una cosa di questo genere:
PHP:
$result=[
            [
                'numero_caratteri_totali'=>3500,
                'numero_chat_inviate'=>15
            ]
        ];
Cosa significa: L'utente nell'arco temporale imposto dalla query ha scritto 15 chat, con numero totali di caratteri 3500,
La clausola che fa il vero filtro è AND CHAR_LENGTH(testo) >= numero, in qunto non fa contare il numero di chat inviate con caratteri inferiori
rispetto al parametro.
L'esperienza potrebbe essere una cosa del genere:
PHP:
//numero di chat inviate che soddisfano la lunghezza minima di 1000 caratteri
$exp=$result[0]['numero_chat_inviate'];

Se questi postulati sono giusti, ti consiglio, prima di ogni cosa, di verificare attentamente le operazioni e le azioni degli utenti, perchè come dicevo in precedenza, l'esperienza delle ultime 24 ore sembrerebbe una piccola forzatura...
Forse è meglio che lavori con CURDATE().
Buon Lavoro.
 
Grazie!
Appena arrivo a casa provo e ti faccio sapere.
In effetti mi sembra decisamente più pulito così. Grazie davvero. Purtroppo sono proprio alle primissime armi e certe cose non mi vengono nemmeno in mente.
 

Discussioni simili