impostare una Select dopo aver registrato

Ciao a tutti,

dopo aver registrato le prime informazioni dell'utente, mi piacerebbe prendere tre dati di quest'ultimo, dati fissi appena registrati, e quindi inserirli in un'altra tabella del db, ora, secondo me una volta inseriti qui bisogna fare di nuovo un'altra Select è in base ad uno di questi dati mi deve rimandare ad un'altra pagina per concludere la registrazione!

Secondo voi non è un ragionamento abbastanza contorto e troppo lungo? Ma soprattutto, io ho fatto tutta la registrazione, per unirla nella stessa pagina quindi non fare 25 pagine ognuna per la stessa cosa non mi darà errore il fatto che ci sono troppe mysql_query() direttamente nella stessa pagina?

Grazie a tutti dell'aiuto

inviato 6 anni fa
Ranius
X 0 X

No, non credo otterrai errori.

Invece di parlare di select parla di query. Ora dopo aver fatto la registrazione e salvato i dati, se questi sono presenti in una variabile accessibile al tuo script non è necessario interrogare il database per recuperare tali variabili, già ce le hai.

Quindi procedi subito con la redirezione che vuoi eseguire.

Eseguire troppe query rende l'esecuzione e il caricamento della tua pagina php più lenta quindi vedi se hai modo di ottimizzare il tuo codice riducendo il numero di query.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

io avevo pensato che dopo la registrazione lo mandavo ad un'altra pagina, dove recuperavo la variabile del lavoro che mi interessa, e quindi successivamente facevo uno switch, ma non funziona! al lavoro

<?php
require_once ("class_connect_db.php");

session_start();
// Controllo accesso
if (!isset($_SESSION['creatore'] ) && ($_SESSION['pws'] ) )
{
header('location: sito/index2.php');
exit;
}
else
{
echo "Benvenuto ".$_SESSION['nick'];
}
$query="SELECT creatore, classe FROM personaggi WHERE creatore='".$_SESSION['nick']."' AND pws='".$_SESSION['pws']."'";
$result = mysql_query($query, $connect);
$row = mysql_fetch_array($result);

      if (empty($row['classe'])) {
/*A QUESTO PUNTO L'UTENTE è LOGGATO E VALIDO NE ANALIZZO LA CLASSE*/
      echo "classe per un motivo o per un altro risulta essere vuoto";
      exit;
      }
      else {
   switch($row['classe'])
   {
      case 'combattente':
       header("Location: sito/registrazione/Combattente.php");
      break;
        case 'pilota':
        header("Location: sito/registrazione/Pilota.php");
        break;
         case 'ricercatore':
       header("Location: sito/registrazione/Ricercatore.php");
      break;||
        case 'tecnico':
        header("Location: sito/registrazione/Tecnico.php");
        break;
        case 'agente':
        header("Location: sito/registrazione/Agente.php");
        break;
        case 'outlander':
        header("Location: sito/registrazione/Outlander.php");
        break;
        case 'diplomatico':
        header("Location: sito/registrazione/Intrattenitore.php"); 
        break;
        case 'manager':
        header("Location: sito/registrazione/Manager.php");
        default: 
        header("Location: sito/registrazione/Combattente.php");
   }
      }
 ?>

Ora, si tratta di un gioco personale senza alcuno scopo di lucro, e per il sottoscritto si tratta della possibilità di imparare piano piano a programmare in php quindi, gentilmente non deridetemi solo per questo motivo, dopo di che praticamente sarà una chat e quindi passerò sempre il dato di sessione a destra e a sinistra, ora qui secondo voi perché non funziona questo codice?

Grazie a tutti

risposto 6 anni fa
Ranius
X 0 X

Esattamente cosa non funziona?

Che errori ottieni?

La variabile che ti serve non puoi recuperarla prima all'atto del login, salvarla nella sessione e poi prelevarla da la? (è sempre una query in meno...).

risposto 6 anni fa
Mario Santagiuliana
X 0 X

no, non posso prelevarla perché il sistema è fatto in questo modo:

account-> creazione personaggio-> inserimento abilità personaggio-> chat

In pratica, la sessione è proprio del'account, mentre io invece devo determinare quale lavoro faccia il personaggio e quindi rimandarlo a quella pagina per poi inserire le abilità che sono tantissime

risposto 6 anni fa
Ranius
X 0 X

Ah ok...

Ora esattamente cosa non riesci ad ottenere?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

il valore classe definisce il lavoro del personaggio, quindi una volta trovato dovrebbe portarmi direttamente alla pagina dove inserire le abilità nei diversi campi in cui quel lavoro può essere effettuato, ora, purtroppo questo non lo fa rimane lì fermo

risposto 6 anni fa
Ranius
X 0 X

Guarda bene se la query che si genera è corretta e se estrae le tuple che ti interessano.

Io per estrarre le cose che ti interessano non userei il nome utente e la password bensì l'id dell'utente o anche solo il nome utente (che dovrebbe essere univoco come l'id).

Controlla dunque che la query sia eseguita correttamente e poi che la variabile $row['classe'] assuma il valore che ti interessa.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

"SELECT creatore, classe FROM personaggi WHERE creatore='".$_SESSION['nick']."'

Rappresenta infatti il nome dell'utente che è univoco quindi teoricamente dovrebbe trovarlo, sono d'accordo per la password, ma ho preso tutto quanto dalle sessioni quindi teoricamente non dovrebbe dare errore, però domani, perché adesso vado a letto che è un po' troppo tardi, controllo attentamente e ti faccio sapere!

Grazie dell'aiuto

risposto 6 anni fa
Ranius
X 0 X

guarda, ho provato non funziona, adesso ho fatto anche questo ma non mi fa vedere nulla, ti posto il codice vediamo se riusciamo a trovare insieme dove sta quel maledetto bug

<?php
require_once ("class_connect_db.php");

session_start();
// Controllo accesso
if (!isset($_SESSION['creatore'] ) && ($_SESSION['pws'] ) )
{
header('location: http://frozen-world.org/index2.php');
exit;
}
else
{
echo "Benvenuto ".$_SESSION['creatore'];
}
$query="SELECT creatore, classe FROM personaggi WHERE creatore ='".$_SESSION['creatore']."' classe ='".$classe."'";
$result = mysql_query($query, $connect);
$a = print_r($result);
echo "$a";
$row = mysql_fetch_array($result);

      if (empty($row['classe'])) {
/*A QUESTO PUNTO L'UTENTE è LOGGATO E VALIDO NE ANALIZZO LA CLASSE*/
      echo "classe per un motivo o per un altro risulta essere vuoto";
      exit;
      }
      else {
   switch($row['classe'])
   {
      case 'combattente':
       header("Location: http://frozen-world.org/registrazione/Combattente.php");
      break;
        case 'pilota':
        header("Location: http://frozen-world.org/registrazione/Pilota.php");
        break;
         case 'ricercatore':
       header("Location: http://frozen-world.org/registrazione/Ricercatore.php");
      break;||
        case 'tecnico':
        header("Location: http://frozen-world.org/registrazione/Tecnico.php");
        break;
        case 'agente':
        header("Location: http://frozen-world.org/registrazione/Agente.php");
        break;
        case 'outlander':
        header("Location: http://frozen-world.org/registrazione/Outlander.php");
        break;
        case 'diplomatico':
        header("Location: http://frozen-world.org/registrazione/Intrattenitore.php"); 
        break;
        case 'manager':
        header("Location: http://frozen-world.org/registrazione/Manager.php");
        default: 
        header("Location: http://frozen-world.org/registrazione/Combattente.php");
   }
      }
 ?>
risposto 6 anni fa
Ranius
X 0 X

E' inutile rileggere il codice così, da umani sicuramente saltiamo qualcosa.

Se ti da pagina bianca c'è un errore del php. Dunque controlla i log del php per scovare l'errore.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

avevo dimenticato all'interno della query la congiunzione  && Fra il creatore e la classe, ora, riesce a leggere la sessione, però si blocca esattamente in questo codice

if (empty($row['classe'])) {
/*A QUESTO PUNTO L'UTENTE è LOGGATO E VALIDO NE ANALIZZO LA CLASSE*/
      echo "classe per un motivo o per un altro risulta essere vuoto";
      exit();
      }

In pratica esegue tutto il controllo dicendomi che questa variabile è vuota quindi vengo buttato fuori così come deve essere, ma ora mi domando, visto che la registrazione avviene in modo perfetto è quella variabile è sempre piena, perché è vuota secondo lui?

risposto 6 anni fa
Ranius
X 0 X

Prova a cambiare questa riga:

$row = mysql_fetch_array($result);

Così:

$row = mysql_fetch_array($result, MYSQL_ASSOC);

Vedi se funziona.

risposto 6 anni fa
Mario Santagiuliana
X 0 X
$query="SELECT creatore, classe FROM personaggi WHERE creatore ='".$_SESSION['nick']."' && classe ='".$classe."'";

In pratica classe viene visto esattamente in questo modo facendo un var_dump($query)

classe ='""'";

E non invece come dovrebbe essere visto e quindi prendendo ciò che c'è scritto

risposto 6 anni fa
Ranius
X 0 X

Scusa, ti ho dato un altro suggerimento, mi puoi rispondere per favore a ciò che ti ho scritto prima?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

si scusami, ho dimenticato di risponderti a causa della sembra troppo alta, comunque, non funziona purtroppo

risposto 6 anni fa
Ranius
X 0 X
a causa della sembra troppo alta, comunque, non funziona purtroppo

1- vorrei che si scrivesse in Italiano comprensibile (io mi sforzo a farlo).

2- gradirei che venisse risposto esaurientemente a tutto spiegando le eventuali modifiche del codice fatte.

Se queste condizioni non esistono evito di rispondere ulteriormente.

risposto 6 anni fa
Mario Santagiuliana
modificato 6 anni fa
X 0 X

Ti chiedo scusa!

Ho portato la modifica che mi hai suggerito, quindi ho provato a fare un personaggio per vedere se tutto quanto funzionava, il personaggio viene fatto ma si blocca sempre su quella pagina... dopodiché, ho provato a fare il var_dump($query) per vedere quale array saltava fuori!

Ho scoperto che la parte della classe, la vede vuota così come ho postato sopra

risposto 6 anni fa
Ranius
X 0 X

La variabile $classe dove e come viene inizializzata.

Poi scusa una domanda...Ma che senso ha questa query?

$query="SELECT creatore, classe FROM personaggi WHERE creatore ='".$_SESSION['creatore']."' classe ='".$classe."'";

Cioè ricerchi nel database i dati creatore e classe dalla tabella personaggi ma come criteri di selezioni usi esattamente creatore e classe?

Già li hai i dati no?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Ho il dato "creatore" che praticamente è memorizzato all'interno della sessione, a me praticamente quella query serve per trovare la classe dove il "creatore" è proprio quello della sessione!

Tieni conto che praticamente questa cosa qui si utilizza esclusivamente nel momento in cui si fa la registrazione di un personaggio, quindi dopo non viene più utilizzata...

La variabile $classe in questa pagina non viene inizializzata da nessuna parte, però, visto che vengo rimandato a questa pagina subito dopo aver fatto la registrazione e quindi subito dopo aver registrato tutti i parametri compreso questo, non dovrebbe semplicemente trovarla dove gli dico?

risposto 6 anni fa
Ranius
X 0 X

Ho il dato "creatore" che praticamente è memorizzato all'interno della sessione, a me praticamente quella query serve per trovare la classe dove il "creatore" è proprio quello della sessione!

Tieni conto che praticamente questa cosa qui si utilizza esclusivamente nel momento in cui si fa la registrazione di un personaggio, quindi dopo non viene più utilizzata...

La variabile $classe in questa pagina non viene inizializzata da nessuna parte, però, visto che vengo rimandato a questa pagina subito dopo aver fatto la registrazione e quindi subito dopo aver registrato tutti i parametri compreso questo, non dovrebbe semplicemente trovarla dove gli dico?

Scusami se ti rispondo di nuovo in questo modo ma non sapevo come correggerla, non credo proprio di avere i poteri come utente semplice comunque, questa query mi serve perché praticamente mi deve rimandare ad una pagina dove dopo io dovrò inserire le abilità in base alla classe in un'altra tabella del db

risposto 6 anni fa
Ranius
X 0 X

Puoi fare la modifica dei tuoi messaggi ma dopo un po' di tempo la possibilità di modificarli è disabilitata.

Ora, con la query vuoi ricavare la classe del tuo utente. Se non hai ancora istanziato la variabile classe dandogli un valore come è possibile utilizzarla nella query sql come termine di ricerca? Non ha senso una cosa del genere.

La query falla così:

$query="SELECT classe FROM personaggi WHERE creatore ='".$_SESSION['creatore']."'";

Il dato creatore(è univoco per ogni utente giusto?) già ce l'hai nella sessione di php.

Esegui la tua query e per ritrovare il risultato fai:

$result = mysql_query($query, $connect);
$classe = mysql_result($result, 0, 0);

Dovrebbe funzionare il tutto correttamente.

P.S. cura un po' il tuo modo di scrivere...faccio fatica ad interpretare certe tue richieste.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

purtroppo dopo aver apportato le modifiche che mi hai suggerito, mi rimanda sempre al blocco dove mi dice che classe è vuoto

$query="SELECT * FROM personaggi WHERE creatore ='".$_SESSION['nick']."'";
$result = mysql_query($query, $connect);
$classe = mysql_result($result, 0,0);

      if (empty($row['classe'])) {
/*A QUESTO PUNTO L'UTENTE è LOGGATO E VALIDO NE ANALIZZO LA CLASSE*/
      echo "classe per un motivo o per un altro risulta essere vuoto";
      exit();
      }

Creatore, in realtà non è univoco, perché va bene per due personaggi in quanto hai la possibilità di poter iscrivere due personaggi dove il valore di creatore è sempre quello, il nome del personaggio è univoco, ma anche qui è un po' come la classe, visto che bisogna inizializzare le variabili prima, come faccio qua ad inizializzare le variabili dal nulla?

risposto 6 anni fa
Ranius
X 0 X

Svolgendolo nel seguente modo funziona salvo che bisogna modificare la query con un altro parametro altrimenti si blocca perché era sempre la stessa cosa e cade in loop...

$query="SELECT * FROM personaggi WHERE creatore ='".$_SESSION['nick']."'";
$result = mysql_query($query, $connect);
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
   
switch($row['classe'])
   {
resto del codice

ora il problema rimane solamente creatore, perché una volta definita la classe del primo personaggio, non posso fare l'iscrizione del secondo in quanto comunque va a selezionarmi sempre la classe del primo perché si dice ciò direttamente dalla query, quindi, come faresti per evitare questo problema?

In fin dei conti già inizia a funzionare qualche cosa e che è un grande successo per il sottoscritto! Ti ringrazio molto

risposto 6 anni fa
Ranius
X 0 X

Allora ti do alcune dico alcune cose da portare attenzione per migliorare il tuo codice.

Quando devi lavorare su specifici utenti usa chiavi univoche, esempio l'id dell'utente. E' per questo che ti chiedevo se creatore era univoca.

Quando fai delle richieste sql non richiedere tutti i campi della tabella con "SELECT *". Prima avevi necessità solo del campo "classe" di conseguenza ho fatto "SELECT classe FROM ecc".

Il tuo codice va in loop(se questo è l'errore che ottieni) perchè fai un ciclo.

Ora a te non serve nessun ciclo. Ti ho dato un codice che funziona.

Tu hai sbagliato qui:

$classe = mysql_result($result, 0,0);

if (empty($row['classe'])) { #<---- qui sta l'errore.

Io ti ho dato la variabile $classe che è il risultato della query (che dovrà essere modificata usando come criterio di selezione una chiave univoca come il nickname). Tu poi hai voluto fare il controllo usando una variabile ancora differente che è $row['classe'] che non è $classe, sono due cose differenti.

Attento dunque al codice a cosa si scrive e cosa scrivo.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

è qui nasce il problema esattamente per il dato univoco perché, io vorrei che oggi account potesse avere due personaggi, ora la variabile "creatore" dice di quale account si tratta, in questo caso sarebbe la stessa cosa per quanto riguarda l'ID o sbaglio? Nel senso, essendo poi l'ID uguale per i due personaggi non funziona

risposto 6 anni fa
Ranius
X 0 X

Credo ci sia un po' di confusione.

Definisci meglio la struttura logica della tua applicazione e ciò che intendi ottenere.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Struttura logica:

Account-> personaggio1-> abilità personaggio1-> chat

"-> personaggio2-> abilità personaggio2-> chat

Ho inserito le virgolette proprio perché l'account è sempre lo stesso, ora, la classe è una voce che sta all'interno del personaggio, e non all'interno dell'account, il controllo che c'è, ed esattamente la sessione è fatto sull'account perché quest'ultimo deve essere sempre collegato indipendentemente dal personaggio

risposto 6 anni fa
Ranius
modificato 6 anni fa
X 0 X

Ok, la struttura del database che hai creato per rappresentare la tua "realtà"?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

account:

login, password, anni, e-mail (per ricevere la password)

Personaggio:

Creatore, login, età, sesso ecc. compresa la classe sono circa 44 record per il personaggio

risposto 6 anni fa
Ranius
X 0 X

Allora, le chiavi primarie e le chiavi esterne?

In più di che tipo sono questi campi?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Primary Key per tutte le tabelle è sempre ID

Unique login

Per il resto non c'è nient'altro, sono tutte comunque variabili varchar(70) escludendo naturalmente l'id

risposto 6 anni fa
Ranius
X 0 X

Devi fare in modo che l'utente scelga che personaggio voler utilizzare, in questo modo puoi fare un select con un where incrociato fra l'id del tuo utente ed il personaggio scelto che restituisce la classe.

Hai capito come?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

no, credo di avere le idee un po' confuse anche se ragionandoci sopra mi sembra un'idea geniale è molto molto bella, devo solo capire come attuarla per farla funzionare!

In pratica, dopo aver fatto la registrazione del personaggio io faccio una query dove vado a fare un controllo incrociato Fra l'id dell'account è quella di quel personaggio, oppure potrei farlo visto che comunque ho anche questa possibilità, tramite l'appartenenza politica visto che comunque si può avere un personaggio della partenza politica!

Quindi anche in questo modo potrebbe forse funzionare...

risposto 6 anni fa
Ranius
X 0 X

Puoi usare i campi che vuoi per fare il controllo.

Comunque devi avere almeno 2 campi nel where.

Ciao

risposto 6 anni fa
Mario Santagiuliana
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda