Knot 6 Posted November 17, 2011 Report Share Posted November 17, 2011 Boas! Estou a usar o seguinte tutorial, com algumas modificações para gerir uma pequena base de dados para um site pessoal: http://www.portugal-a-programar.pt/index.php?showtopic=44442 Alguém me pode dar ideias de como criar uma dropbox que me permita escolher tabela1, tabela2, tabela3, etc e trabalhar com mais do que uma tabela? Pelo tutorial em cima o nome da tabela está dentro do config.php. A ideia seria colocar algo tipo isto: <form action="index.php" method="post"> <select name="tabelas"> <option value="table1">Tabela 1</option> <option value="table2">Tabela 2</option> <option value="table3">Tabela 3</option> <option value="table4">Tabela 4</option> </select> <input type="submit" value="Submit" /> </form> E depois de alguma forma o define('TBL1', 'streams'); ir buscar o valor submetido... Se alguém me puder dar umas dicas agradeço! Link to post Share on other sites
Knot 6 Posted November 18, 2011 Author Report Share Posted November 18, 2011 Ninguém tem uma dica sobre como posso tentar meter isto a funcionar? Link to post Share on other sites
pmg 85 Posted November 18, 2011 Report Share Posted November 18, 2011 if ($_POST['tabelas'] == 'table1') $inputtable = TBL1; else if ($_POST['tabelas'] == 'table2') $inputtable = TBL2; else if ($_POST['tabelas'] == 'table3') $inputtable = TBL3; else $inputtable = TBL4; $sql = "select ... from $inputtable ..."; What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to post Share on other sites
Knot 6 Posted November 18, 2011 Author Report Share Posted November 18, 2011 Boas! Pois isso já tinha tentado mais ou menos, o mal é que para mostrar a base de dados funciona, mas quando vou trabalhar dentro da base de dados "salta fora" para o ultimo else... Link to post Share on other sites
pmg 85 Posted November 18, 2011 Report Share Posted November 18, 2011 Tens que guardar a informação da "tabela activa". Podes guardar numa variavel de sessão (lembra-te do session_start()) ou na base de dados ou, possivelmente, doutra maneira qualquer ... $_SESSION['inputtable'] = $inputtable; $sql = "select ... from {$_SESSION['inputtable']} ..."; What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to post Share on other sites
Knot 6 Posted November 18, 2011 Author Report Share Posted November 18, 2011 Pois com session_start estive aqui a tentar meter a funcionar mas nao sei bem... 😳 Tentei guardando o valor numa tabela da base de dados e funciona, tirando o facto de dar sempre erro ao inicio pq não lê o valor escolhido como padrão. Não deveria ser assim? <option selected="tabela1">Tabela 1</option> Para automaticamente ser lido o valor "tabela1" ? Link to post Share on other sites
pmg 85 Posted November 18, 2011 Report Share Posted November 18, 2011 Essa versão não está de acordo com as nepes Em HTML 4 (http://www.w3.org/TR/1998/REC-html40-19980424/interact/forms.html#h-17.6) é assim <option value="tabela1" selected>Tabela 1</option> Em XHTML (http://www.w3.org/TR/xhtml1/#h-4.5), acho que é assim <option value="tabela1" selected="selected">Tabela 1</option> What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to post Share on other sites
Knot 6 Posted November 18, 2011 Author Report Share Posted November 18, 2011 Eu criei um ficheiro chamado muda.php, o qual tem o seguinte conteudo: <form action="muda.php" method="post"> <select name="tabelas"> <option value="tabela1" selected="selected">Tabela 1</option> <option value="tabela2" >Tabela 2</option> </select> <input type="submit" value="Submit" /> </form> <?php $tabelas=$_POST["tabelas"]; $link = mysql_connect('localhost', 'user', 'pass'); mysql_select_db('base_dados'); mysql_query("UPDATE base SET campo1 = '$tabelas' "); mysql_close($link); ?> Supostamente nao deveria ir buscar o valor por defeito e coloca-lo na base de dados? É que assim inicia-me sempre com valor nulo na base de dados, só fazendo a escolha e fazendo Submit é que é enviado para a base de dados um valor correto... Link to post Share on other sites
pmg 85 Posted November 18, 2011 Report Share Posted November 18, 2011 O <form> e o PHP "correm" em tempos diferentes: primeiro corre o PHP, antes do <form>, e por isso o $_POST['tabelas'] nao existe. Depois, no lado do cliente e que corre o <form> (mas nessa altura ja o PHP correu ha muito tempo). Ao fazer um submit, o PHP volta a correr, desta vez com o $_POST['tabelas'] preenchido ... e o <form> e novamente apresentado! Eu costumo fazer assim, separando o submit da apresentacao do <form> if ($_SERVER['REQUEST_METHOD'] == 'POST') { /* trata do submit, por exemplo */ $tabelas = SQLsanitize($_POST['tabelas']); /* ATENCAO AS INJECCOES DE SQL */ $sql = "update base set campo1 = '$tabelas'"; /* ... */ header('Location: thankyou.php'); exit('Redireccionado para a <a href="thankyou.php">pagina de agradecimento</a>.'); } else { echo '<form action="" method="post">'; /* ... */ echo '</form>'; } Para usar o meu codigo precisas de definir a funcao SQLsanitize() que torna a string de input boa para usar no SQL (a maneira de o fazer muda consoante a base de dados que estas a usar) What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to post Share on other sites
Knot 6 Posted November 18, 2011 Author Report Share Posted November 18, 2011 Da maneira que tu tinhas dito fiz assim dentro do config.php if ($_POST['tabelas'] == 'table1') $inputtable = tabela1; else if ($_POST['tabelas'] == 'table2') $inputtable = tabela2; else if ($_POST['tabelas'] == 'table3') $inputtable = tabela3; else $inputtable = tabela4; $_SESSION['inputtable'] = $inputtable; define('TBL1', $_SESSION['inputtable']); Já não há o problema de não ler o valor inicial, pois vai sempre buscar o último else e fica resolvido, depois para visualizar as tabelas também funciona, mas na altura de gravar não dá qualquer erro, mas também não grava nada... Desta tua maneira até seria mais interessante pq ao escolher entre tabela a página faz o refresh do index.php e fico logo na tabela desejada, enquanto que da maneira que fiz tenho sempre de actualizar manualmente o index.php, uma vez que a action do form se destina ao mudar.php Se tu ou alguém me puder dar umas luzes agradeço, pois percebo quase nada disto, ainda estou a começar... Edit: entretanto vou testar o que deixaste agora na msg em cima! Obrigado Link to post Share on other sites
Knot 6 Posted November 19, 2011 Author Report Share Posted November 19, 2011 Pois não consegui com o que colocaste em cima. Já tentei usando a sessão mas não consigo. Será que poderias explicar melhor como utilizar com sessão? É que quando vou guardar os dados não me dá erro, mas também nada é guardado na tabela que selecionei... No ficheiro config.php coloquei assim: # tabela1 if ($_POST['tabelas'] == 'table1') $inputtable = tabela1; else if ($_POST['tabelas'] == 'table2') $inputtable = tabela2; else if ($_POST['tabelas'] == 'table3') $inputtable = tabela3; else $inputtable = tabelageral; $_SESSION['inputtable'] = $inputtable; define('TBL1', $_SESSION['inputtable']); // Nome da tabela define('TBL1_CMP1', 'campo1'); // Nome do campo 1 da tablela "TBL1" (tabela1) define('TBL1_CMP2', 'campo2'); // Nome do campo 2 da tablela "TBL1" (tabela1) define('TBL1_CMP3', 'campo3'); // Nome do campo 3 da tablela "TBL1" (tabela1) define('TBL1_CMP4', 'campo4'); // Nome do campo 4 da tablela "TBL1" (tabela1) define('TBL1_CMP5', 'campo5'); // Nome do campo 5 da tablela "TBL1" (tabela1) define('TBL1_CMP6', 'campo6'); // Nome do campo 6 da tablela "TBL1" (tabela1) define('TBL1_CMP7', 'campo7'); // Nome do campo 7 da tablela "TBL1" (tabela1) define('TBL1_CMP8', 'campo8'); // Nome do campo 8 da tablela "TBL1" (tabela1) No ficheiro index.php coloquei assim: <form action="index.php" method="post"> <select name="tabelas"> <option value="table1" >Tabela1</option> <option value="table2" >Tabela2</option> <option value="table3" >Tabela3</option> </select> <input type="submit" value="Submit" /> </form> Depois nos outros ficheiros não alterei nada, uma vez que o TBL1 é definido no config.php Link to post Share on other sites
Knot 6 Posted November 21, 2011 Author Report Share Posted November 21, 2011 Ninguém me consegue ajudar? Link to post Share on other sites
pmg 85 Posted November 21, 2011 Report Share Posted November 21, 2011 So podes ter "valores escalares" no define: http://pt2.php.net/manual/pt_BR/function.define.php ou seja: a tua definicao de TBL1 esta ilegal (as outras estao bem). Experimenta fazer o que queres sem os defines, com os nomes das tabelas e campos fazendo parte do codigo (pois, nao e tao boa pratica de programacao, mas torna uma primeira abordagem ao problema maisfacil ... depois corriges se achares necessario) What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to post Share on other sites
Knot 6 Posted November 21, 2011 Author Report Share Posted November 21, 2011 Já tentei substituir em todo o lado TBL1 por $_SESSION['inputtable'] mas mesmo assim não me funciona. O problema está no guardar.php pois no selecionar.php seleciona bem a base de dados para visualização, quando faço o editar/guardar que está definido no guardar.php é que não funciona... O guardar.php original é este: <?php // Verifica se a constante INDEX está definida. Se não estiver, significa // que o utilizador está a aceder a esta página directamente if( ! defined( 'INDEX' ) ) { die( _( 'Não pode aceder directamente a esta página' ) ); } // Nome dos campos do formulário para verificar se é o original. // Repara que não coloquei o "cmp6", pois no caso dos checkboxes e dos // selects com a propriedade multiple, quando nenhum valor é checkado, não // aparece nada no array $_POST, ao contrário dos inputs do tipo text que // aparecem como strings vazias. $campos = array( 'token', 'cmp1', 'cmp2', 'cmp3', 'cmp4', 'cmp5', 'cmp7', 'guardar' ); // 1º Se o array $_POST tiver chaves, então significa que o formulário foi submetido // 2º Se os valores do array $campos existirem nas chaves do array $_POST, // então significa que o formulário não foi alterado (aqui não uso // array_values( $campos ) === array_keys( $_POST ), por causa dos inputs // checkboxes e selects com a propriedade multiple, daí ter criado a função array_keys_exist() // 3º Se a chave SESS_TOKEN existir, significa que o utilizador está ou // esteve no nosso site e ainda não fechou o browser // 4º Se a chave SESS_TOKEN for idêntica (igual e do mesmo tipo) à enviada // no formulário, garante-nos que enviou o formulário através do nosso site, // porque sempre que abre/recarrega/submete a página/formulário é gerado um novo token if( $_POST && array_keys_exist( array_values( $campos ) , $_POST ) && isset( $_SESSION[sESS_TOKEN] ) && $_SESSION[sESS_TOKEN] === $_POST['token'] ) { /** * Validações */ // Limpamos o array campos, pois vamos utilizá-lo para guardar os dados // validados correctamente e/ou os erros $campos = array(); // Verifica se é para criar um registo novo ou para editar $campo = trim( $_POST['cmp1'] ); if( $campo ) { // Verifica se o valor é um número e é maior que "0" (zero) if( ctype_digit( $campo ) && $campo > 0 ) { $campos['cmp1'] = $campo; } else { $campos['erros']['cmp1'] = 'O registo indicado não existe.'; } } // Remove os espaços em branco do início e do fim da string, atribui o // resultado à variável $campo e verifica se tem, pelo menos, 1 caracter. // Também existe a função empty(), no entanto, caso o valor indicado // seja "0" (zero), esta função retorna FALSE. $campo = trim( $_POST['cmp2'] ); if( strlen( $campo ) ) { $campos['cmp2'] = md5( $campo ); // Cria um hash MD5 } else { $campos['erros']['cmp2'] = _('O "Campo 2" tem de ter um valor.'); } // Verifica se só foram introduzidas letras, apóstrofos ('), hifens (-) // e espaços. Atenção esta expressão regular não é a melhor, esta permite // que sejam introduzidos alguns caracteres que os nomes não têm.. // A melhor forma é utilizar função ctype_alpha. No entanto, para que esta // funcione bem (aceitando palavras acentuadas) é necessário definir o local. $campo = trim( $_POST['cmp3'] ); $pattern = '/^[a-zA-ZÀ-ÿ\'\- ]{1,15}$/'; if( $campo && preg_match( $pattern, $campo ) ) { $campos['cmp3'] = $campo; } else { $campos['erros']['cmp3'] = _('O "Campo 3" só pode conter letras e espaços.'); } // Verifica se o campo tem, no mínimo, 1 caracter e se tem, no máximo, // 65535 caracteres (máximo que o campo do tipo TEXT aceita). $campo = trim( $_POST['cmp4'] ); if( $campo && strlen( $campo ) < 65535 ) { $campos['cmp4'] = $campo; } else { $campos['erros']['cmp4'] = _('O "Campo 4" tem de ser preenchido.'); } // Verifica se o valor introduzido é permitido $campo = $_POST['cmp5']; $valores = array( 'valor1', 'valor2' ); // Lista branca if( in_array( $campo, $valores ) ) { $campos['cmp5'] = $campo; } else { $campos['erros']['cmp5'] = _('O valor do "Campo 5" não é permitido.'); } // Verifica se existe o "cmp6" no array $_POST, isto é, verifica se // foi checkado algum dos checkboxes do fieldset "Campo 6" if( isset( $_POST['cmp6'] ) ) { $campo = $_POST['cmp6']; // Verifica se o "Campo 6" é um array if( is_array( $campo ) ) { // Lista branca com os valores do "Campo 6" $valores = array( 'valor1', 'valor2', 'valor3' ); // Para cada checkbox seleccionada, verifica se o valor é permitido foreach( $campo as $valor ) { if( ! in_array( $valor, $valores ) ) { $campos['erros']['cmp6'] = _('Os valores indicados no "Campo 6" não são permitidos.'); break; } } // Se não existir a chave "cmp6" no array $campos['erros'], // então significa que todos os valores indicados são permitidos // e colocam-se esses valores numa string separados por uma "," (vírgula) if( ! isset( $campos['erros']['cmp6'] ) ) { $campos['cmp6'] = implode( ',', $campo ); } } else { $campos['erros']['cmp6'] = _('O valor indicado no "Campo 6" não é válido.'); } } else { $campos['cmp6'] = ''; } // Verifica se o valor escolhido no "Campo 7" é permitido $valores = array( '0', '1' ); // Lista branca if( in_array( $_POST['cmp7'], $valores ) ) { $campos['cmp7'] = $_POST['cmp7']; } else { $campos['erros']['cmp7'] = _('O valor indicado no "Campo 7" não é permitido.'); } // Verifica se campos foram validados correctamente if( ! isset( $campos['erros'] ) ) { if( ! isset( $campos['cmp1'] ) ) { // Inserir // Cria a consulta SQL $sql = 'INSERT INTO %s (%s, %s, %s, %s, %s, %s, %s)'; $sql.= 'VALUES(:cmp2, :cmp3, :cmp4, :cmp5, :cmp6, :cmp7, NOW())'; $sql = sprintf( $sql, TBL1, TBL1_CMP2, TBL1_CMP3, TBL1_CMP4, TBL1_CMP5, TBL1_CMP6, TBL1_CMP7, TBL1_CMP8); try { // Liga à base de dados $con = conectar(); // Prepara a instrução SQL $stmt = $con->prepare( $sql ); // Atribui os valores correspondentes aos parâmetros da consulta $stmt->bindValue( ':cmp2', $campos['cmp2'], PDO::PARAM_STR ); $stmt->bindValue( ':cmp3', $campos['cmp3'], PDO::PARAM_STR ); $stmt->bindValue( ':cmp4', $campos['cmp4'], PDO::PARAM_STR ); $stmt->bindValue( ':cmp5', $campos['cmp5'], PDO::PARAM_STR ); $stmt->bindValue( ':cmp6', $campos['cmp6'], PDO::PARAM_STR ); $stmt->bindValue( ':cmp7', $campos['cmp7'], PDO::PARAM_INT ); // Executa a consulta $stmt->execute(); // Verifica se existem linhas afectadas pela instrução if( $stmt->rowCount() ) { $html = _('Registo efectuado com sucesso.'); } else { $html = _('Ocorreu um problema ao registar na nossa base de dados.<br/>Por favor, tente novamente.'); } // Fecha o cursor $stmt->closeCursor(); // Fecha a conexão à base de dados $con = NULL; } catch ( PDOException $e ) { pdoException( $e ); } } else { // Adicionar // Cria a consulta $sql = 'SELECT COUNT(*) AS n FROM %s WHERE %s = :cmp1'; $sql = sprintf( $sql, TBL1, TBL1_CMP1 ); try { // Cria a ligação à base de dados $con = conectar(); // Prepara a instrução SQL $stmt = $con->prepare( $sql ); // Atribui os valores aos parâmetros $stmt->bindValue( ':cmp1', $campos['cmp1'], PDO::PARAM_INT ); // Executa a instrução SQL $stmt->execute(); // Coloca o resultado da consulta na variável $result $result = $stmt->fetch( PDO::FETCH_ASSOC ); // Fecha o cursor do $stmt->closeCursor(); // Verifica se existe um e apenas um registo com o id indicado, // se não existir nenhum ou mais, algo de errado aconteceu if( $result['n'] === '1' ) { // Cria a consulta SQL $sql = 'UPDATE %s SET %s = :cmp2, %s = :cmp3, %s = :cmp4,'; $sql.= '%s = :cmp5, %s = :cmp6, %s = :cmp7 WHERE %s = :cmp1'; $sql = sprintf( $sql, TBL1, TBL1_CMP2, TBL1_CMP3, TBL1_CMP4, TBL1_CMP5, TBL1_CMP6, TBL1_CMP7, TBL1_CMP1 ); // Prepara a instrução SQL $stmt = $con->prepare( $sql ); // Atribui os valores correspondentes aos parâmetros da consulta $stmt->bindValue( 'cmp2', $campos['cmp2'], PDO::PARAM_STR ); $stmt->bindValue( 'cmp3', $campos['cmp3'], PDO::PARAM_STR ); $stmt->bindValue( 'cmp4', $campos['cmp4'], PDO::PARAM_STR ); $stmt->bindValue( 'cmp5', $campos['cmp5'], PDO::PARAM_STR ); $stmt->bindValue( 'cmp6', $campos['cmp6'], PDO::PARAM_STR ); $stmt->bindValue( 'cmp7', $campos['cmp7'], PDO::PARAM_STR ); $stmt->bindValue( 'cmp1', $campos['cmp1'], PDO::PARAM_INT ); // Executa a instrução $stmt->execute(); // Verifica se existem linhas afectadas pela instrução if( $stmt->rowCount() ) { $html = _('Registo editado com sucesso.'); } else { $html = _('O registo indicado não existe.'); } // Fecha o cursor $stmt->closeCursor(); // Fecha a conexão à base de dados $con = NULL; } } catch ( PDOException $e ) { pdoException( $e ); } } } else { $html = gerarErros( $campos['erros'] ); } } // Verifica se existe a variável $html e mostra-a if( isset( $html ) ) { echo $html; } ?> <form action="" method="post"> <input type="hidden" name="token" value="<?php echo gerarToken() ?>" /> <input type="hidden" name="cmp1" value="<?php if ( isset( $_GET['id'] ) ) echo $_GET['id'] ?>" /> <input type="text" id="cmp2" name="cmp2" /> Campo 2<br /> <input type="text" id="cmp3" name="cmp3" /> Campo 3<br /> <input type="text" id="cmp4" name="cmp4" /> Campo 4<br /> <select id="cmp5" name="cmp5"> <option value="valor1">Valor 1</option> <option value="valor2">Valor 2</option> </select> Campo 5<br /> <fieldset> <legend>Campo 6</legend> <input type="checkbox" id="cmp6-1" name="cmp6[]" value="valor1" /> Valor 1<br /> <input type="checkbox" id="cmp6-2" name="cmp6[]" value="valor2" /> Valor 2<br /> <input type="checkbox" id="cmp6-3" name="cmp6[]" value="valor3" /> Valor 3<br /> </fieldset> <fieldset> <legend>Campo 7</legend> <input type="radio" id="cmp7-1" name="cmp7" value="0" checked="checked" /> Valor 1<br /> <input type="radio" id="cmp7-2" name="cmp7" value="1" /> Valor 2<br /> </fieldset> <input type="submit" id="guardar" name="guardar" value="Guardar" /> </form> Link to post Share on other sites
pmg 85 Posted November 21, 2011 Report Share Posted November 21, 2011 Já tentei substituir em todo o lado TBL1 por $_SESSION['inputtable'] mas mesmo assim não me funciona. ... Como e que nao funciona? Ha alguma mensagem da base de dados? Ha alguma informacao no log do php? Qual e o valor da variavel $sql depois de fazeres o sprintf? What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to post Share on other sites
Knot 6 Posted November 21, 2011 Author Report Share Posted November 21, 2011 Da base de dados não há mensagem nenhuma. Onde posso ver o log e o valor da variável? É que se desse erro eu ainda ia vendo pelo erro, mas é que não dá erro, mas também não aparece a informaçao de registo editado com sucesso e a base de dados continua com os campos inalterados. Link to post Share on other sites
pmg 85 Posted November 21, 2011 Report Share Posted November 21, 2011 Para veres o log, se ainda nao estiver ligado ... liga-o no php.ini http://pt.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting Se nao tens acesso ao php.ini, podes usar a funcao ini_set. <?php ini_set('error_reporting', E_ALL); ini_set('log_errors', 1); ini_set('error_log', '/path/to/writable/dir/and/file'); ?> E depois e so olhar para o ficheiro para ver os eventuais erros. Nota que podes por os erros a mostra na pagina propriamente dita, mas num ficheiro e melhor. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to post Share on other sites
Knot 6 Posted November 21, 2011 Author Report Share Posted November 21, 2011 Acabei de fazer e não é mostrado nenhum erro no log. E por acaso até tinha aqui um log já a correr, não sabia era onde estava guardado e também não regista nada relativamente a isto... Link to post Share on other sites
pmg 85 Posted November 21, 2011 Report Share Posted November 21, 2011 Estou a ficar sem ideias ... Qual e o conteudo da variavel $sql depois do sprintf? Experimenta mostrar directamente na pagina ou mete-a no log $sql = sprintf(...); error_log('Conteudo de $sql: ' . $sql); What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to post Share on other sites
Knot 6 Posted November 21, 2011 Author Report Share Posted November 21, 2011 Não sabia bem como fazer por isso meti um echo "$sql" Passo1, Passo2, Passo3 para os 3 casos em que aparece $sql = sprintf(...); É sempre imprimido "SELECT COUNT(*) AS n FROM Sport1 WHERE campo1 = :cmp1 Passo2 ", normal deveria imprimir o Passo2 e também o Passo3, uma vez que é no 3 que é feito o update. Link to post Share on other sites
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now