Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Fabyo

Escolhendo um Tipo de Campo Correto

Recommended Posts

Ola Pessoal, resolvi criar esse tutorial para ajudar os iniciantes a aprenderem e entenderem sobre criação de banco de dados, muitos podem achar facil, pois não sabem explorar todos os recursos do banco, e acabam usando ferramentas como phpmyadmin que cria tudo praticamente automatico, e o usuario acaba achando que esta criando um banco de dados bem feito, mas depois sofre para fazer qualquer pesquisa no banco.

O banco de dados é o principal um sistema, se o banco de dados esta mal modelado seu sistema nao será eficiente.

Para criar um banco antes precisa estudar um pouco sobre quais campos usar quais tabelas criar, pensar bem mesmo pois nao tenha pressa um sistema bem feito maior parte do tempo que voce gasta é com analise.

eu navego em varios foruns e vejo tabelas que os usuarios postam que estao horriveis, muito mal elaboradas, tem usuario que só conhece VARCHAR, e usa VARCHAR para tudo, ta errado isso.

outra coisa que tambem vejo com frequencia é o usuario criar o banco com tamanhos de campos tudo na base do chute, tipo nome VARCHAR(200), cep VARCHAR(200), acredito a pessoa que faz isso nao deve ter noção nem do que se trata esse numero, então é por isso que estou publicando esse tutorial para que pessoas que fazem um banco mal modelado poder aprender e assim criar banco de dados mais corretos

não vou dar aulas aqui de regras FN(Formas Normais) , quem sabe num outro tutorial.

mas para aquele que quer se aprofundar recomendo estudar mais, pois irei só passar o basico, que pelo menos a pessoa lendo esse tutorial ira aprender a definir um banco corretamente com seus campos com tipos corretos.

 

VARCHAR

VAR=Variavel

CHAR = Caracterer

ou seja Caractere Variavel, quando voce precisa guardar um dado no banco mas voce nao sabe o tamanho exato que ele vai ter, ou seja ele pode variar, e se for texto claro voce usa VARCHAR, to falando de textos pequenos tipo: nome, rua, bairro, telefone etc...

entao vamos criar um campo nome, escolho VARCHAR, e agora qual tamanho poderia ter um nome 200 tabom?, nao 200 é um chute muito mal feito, vamos pensar entao, vamos inventar um nome bem comprimo:

Pedro Alvares da silva Cabral dos Santos Neto vamos contar strlen() = 45 caracteres, nossa quem usa VARCHAR(200) ta dando um chute bem lonje nao é mesmo?, nao deve existir um nome maior que esse mas mesmo assim para garantir a vitoria iremos usar um VARCHAR(50), demos 5 de brinde.

vamos tentar mais uma vez?, agora vamos criar um campo cidade, qual campos iremos usar?

integer?, nao usaremos VARCHAR , e mesma coisa vamos pensar num nome de cidade bem grande

Pindamonhangaba strlen() = 15 caracteres, deve existir uma cidade com um nome maior, entao para garantir vamos criar um VARCHAR(25) ta vendo dei 10 caractere de brinde :D

 

CHAR

CHAR = Caracterer

 

Pessoal para que esse tutorial nao fique muito extenso e eu acabe nao explicando direito entao recomendo voce ler melhor sobre VARCHAR e CHAR nesse link:

http://dev.mysql.com/doc/refman/4.1/pt/char.html

assim temos o foco maior sobre esse tutorial

 

só resumindo CHAR é para campos exatos onde o dado que voce for gravar não variar, exemplo Estados

SP, RJ, MG etc... 2 caracteres podemos salvar usando CHAR(2), e outra diferença basica entre CHAR e VARCHAR é que se voce usa um campo VARCHAR(20) salva apenas 10 caracteres o VARCHAR ira ter um tamanho de 10 e CHAR(20) se voce salvar 10 caracteres ele sempre tera o tamanho fixo de 20 mesmo que voce gravar apenas 1 caracters, por isso use CHAR somente para campos exatos, outro exemplo é usar o CHAR para guardar senha, isso mesmo por segurança vamos criptografar senha usando MD5, o MD5 nao importa o tamanho de sua senha ele sempre retorna a senha criptografada de 32 caracteres, entao podemos usar CHAR(32) para campo senha.

 

DATE/DATETIME/TIME

agora e data? como iremos salvar uma data?, ja sei usaremos 3 campos CHAR, dia CHAR(2), mes CHAR(2) e ano CHAR(4) to certo?.

 

que isso, nao façam essa loucura, para salvar uma data use o campo certo use DATE e se voce quer salvar data e hora temos DATETIME, só horas temos TIME, viu temos campos para todos os tipos que precisarmos? e porque voce só usava VARCHAR hem ?.

 

uma coisa voce tem que colocar na cabeça, nao faça errado só porque voce acha o jeito certo dificil, ou só porque voce nao consegue, só voce estudar que voce consegue, pare de fazer gambiarras

usando o campo certo alem de ser certo, voce tem inumeras vantagens, por exemplo pode usar as funções proprias do mysql para tratar o seu campo da maneira correta, se voce usa um VARCHAR para guardar data o Mysql ira tratar seu campo como um texto e nao como data, dai todas as funções que trabalha com datas nao ira funcionar

 

entao vou te ajudar para voce nao ter mais desculpa, pois nao sabe converter uma data

quando voce tem uma data nesse padrao dd/mm/yyyy e o banco aceita yyyy-mm-dd, precisamos converter a data, entao podemos fazer isso:

 

vamos usar uma função chamada explode() e ja explico tambem a implode()

 

explode = separa uma string em pedaços criando um array

implode = junta um array criando uma string

 

como voce pode ver sao exatamente os opostos, cada um faz uma coisa ao contrario da outra

exemplos:

 

usando explode para converter uma data

$arr = explode("-", "2006-08-25");
teremos :
$arr[0] = "2006";
$arr[1] = "08";
$arr[2] = "25";

como voce viu ele separou a data da sequencia - aqui "2006-08-25" = [2006] [08] [25], se viu que o explode tirou o caracter "-"

 

agora o implode() é o contrario ele nao tira um caracter, ele coloca

 

$arr = implode("/", $arr);
resultado = "2006/08/25";

 

percebeu que o $arr voltou a ser uma string?

mas só para concluirmos, nos convertemos os caracteres tirando - e colocando /

 

mas ainda nao temos uma data no padrao brasileiro entao vamos continuar:

 

$data = implode("/", array_reverse(explode("-", "2006-08-25")));

//resultado = "25/08/2006";

 

O array_reverse() apenas inverteu a posição do array antes = [2006] [08] [25] depois = [25] [08] [2006]

 

pronto ta ai a data invertida simples nao?, e apenas 1 linha que é melhor ainda

para fazer ao contrario nem vou explicar só voce ver essa função e usar ela mesmo.

 

mas para mais um exemplo podemos converter a data no proprio select exemplo:

"select date_format(data, '%d/%m/%Y') as data from tabela"

 

Funções para Data no MySQL

 

 

SET/ENUM

 

para um entendimento melhor leia:

http://dev.mysql.com/doc/refman/4.1/pt/enum.html

http://dev.mysql.com/doc/refman/4.1/pt/set.html

 

 

agora temos um campo "Deseja receber Newsletter?", qual campo é o mais apropriado para esse tipo de campo?

pode pensar um pouco eu espero....

 

vamos la o campo mais indicado seria o campo ENUM, nao conhece?, entao vou explicar o campo ENUM voce pode definir um padrao e ele aceita somente um dos que voce estabelecer, mesma coisa um combo, voce nao consegue escolher mais que uma opção um combo, entao o enum é mesma coisa.

 

exemplo ENUM('S', 'N') COMMENT 'S=Sim;N=Nao', criei um comentario só para lembrar do que se trata.

 

dai voce vai jogar nesse campo S ou N, se o usuario marcar o campo ele quer receber news

 

vou te dar mais uma ajudinha com o php exemplo:

 

$news = isset($_POST["news"]) ? "S" : "N";

dai basta jogar no banco o $news, que ira ter o resultado que o usuario escolheu S = Sim, N= Nao

 

mais um exemplo de ENUM, campo sexo, a pessoa só pode ser 1 opção, ou ela é Masculino, ou Feminino

ENUM('M','F'), dai mesma coisa voce salva o M se for masculino e F se for Feminino

viu que fica perfeito seu banco e legivel?, fora que é um metodo correto

 

outra coisa que você vai entender é que fazendo um banco correto facilita sua vida na hora de voce fazer qualquer pesquisa ou um relatorio.

 

bom agora temos o campo quais linguagens voce sabe programar? exemplo PHP, ASP, JAVA, certo a pessoa pode escolher mais que um campo nao é verdade?, dai voce montaria para ela um

 

<select name="linguagens[]" id="linguagens" size="5" multiple="multiple">

<option value="J">JAVA</option>

<option value="P">PHP</option>

<option value="A">ASP</option>

</select>

 

dai como iremos salvar esses dados ?, usaremos ENUM ?, nao, pois ENUM só aceita uma opçao, ah temos o campo SET o SET é igual ao ENUM só que ele aceita varios campos, vamos montar entao o campo SET

ficaria SET('J','P','A'), certo?, J = Java, P=PHP, e A= ASP

 

vamos fazer o codigo php para pegar esses dados, antes um teste para vermos se esta tudo ok

 

if (getenv("REQUEST_METHOD") == "POST")

{

foreach ($_POST["linguagens"] as $valor) {

echo $valor."<br />";

}

}

 

só para testarmos , tudo certo vamos deixar o campo correto para salvar no banco separado por virgula

exemplo se a pessoa escolher as 3 linguagens ira salvar 'J,P,A' correto?

entao basta fazer isso:

 

if (getenv("REQUEST_METHOD") == "POST")

{

$linguagens = implode(",", $_POST["linguagens"]);

}

 

e salvar no banco '$linguagens', viu sem misterio , facil nao é mesmo ?

 

bom ta ai é simples mas ja é um começo, use campos certos para guardar os dados

valor monetario pode usar o DECIMAL, numeros inteiros podemos usar smallint ,int só muda o tamanho

 

e usando USIGNED voce dobra o tamanho porque é sem sinal

 

leia mais:

 

http://dev.mysql.com/doc/refman/4.1/pt/column-types.html

http://dev.mysql.com/doc/refman/4.1/pt/myisam.html

http://dev.mysql.com/doc/refman/4.1/pt/innodb.html

 

quando mais ler mais voce tera o conhecimento e dominio do que esta fazendo

 

sequencia de tutoriais para iniciantes:

 

http://forum.imasters.com.br/index.php?showtopic=192408

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fabão muito bom :P Rimo em :P hahahha o pessoal estava precisando disso mesmo.. eu mesmo não conhecia a do SET/ENUM agora sei. ^^ eu usava o Bool para true e false no lugar.. mais o ENUM te possibilita ter um trabalho melhor ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fabyo ... http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

 

Não sei se posso pedir isso aqui, mais se puder, voce poderia fazer um tutorial explicando porque/como separar os campos em tabelas diferentes para não ter redundancia (digo não criar uma tabela com todos os dados, e sim separa-los em varias tabela)

 

[]'s !!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muskt sobre o que você pediu posso ate fazer sim, o que você quer é sobre regras FN(Formas Normais), muitas pessoas criam banco de dados qubrando essas regras , mas um banco bem modelado precisa seguir essas regras

 

vou ver se faço um tutorial desses sabado que vem

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para nomes pode ser VARCHAR(45) +-

e senha por segurança voce deve criptografa-la, e por padrao usando MD5

dai usando MD5 ele gera uma senha criptografa de 32 caracteres sempre

entao use CHAR(32) para senha e para emails pode usar VARCHAR(64) +-

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para nomes pode ser VARCHAR(45) +-e senha por segurança voce deve criptografa-la, e por padrao usando MD5dai usando MD5 ele gera uma senha criptografa de 32 caracteres sempreentao use CHAR(32) para senha e para emails pode usar VARCHAR(64) +-

Obrigado pela dica Fabyo http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Mas tenho outra dúvida, se o MD5 não pode ser descriptografado, como devo fazer o processo de validação?Por exemplo, em um sitema de login, validar se o usuario digitou a senha correta.Eu imagino que seja assim:
<?// Essa senha veio do form do sistema de login$login = $_POST[ 'login' ];$senha = md5( $_POST[ 'senha' ] );$conexao = mysql_connect( "localhost", "login",  "senha" );$db = mysql_select_db( "database" );$sql = "SELECT * FROM Usuario WHERE Login='$login' AND Senha='$senha'";$resultado = mysql_query( $sql ) or die ( mysql_error() );$contagem = mysql_num_rows( $resultado );if( $contagem == 1 ) {	echo = "Senha digitada está correta!";}?>
É dessa forma?

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim, mas só por curiosidade o mysql tbm tem o md5()

 

$sql = "SELECT * FROM Usuario WHERE Login='$login' AND Senha=md5('$senha')";

 

e proteja melhor seu sistema contra ataques sql injection

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pô caraque finooooSó não sabia que o SET tinha essa função... muito bacana!!!!O Enum eu já uso a muito tempo.. é muito bom!!!Parabéns!!!abração

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para nomes pode ser VARCHAR(45) +-

e senha por segurança voce deve criptografa-la, e por padrao usando MD5

dai usando MD5 ele gera uma senha criptografa de 32 caracteres sempre

entao use CHAR(32) para senha e para emails pode usar VARCHAR(64) +-

Olá! Fabyo, gostei muito dessa tuto e do sistema de cadastro, mas está dando um erro:"banco de dados não encontrado" e como sou iniciante bem fraquinho ñ sei oq está causando esse erro, tenho uma suspeita de ser no init.php pois quando tirei o comando para ele da pág de cadastro ela abriu mas faltando partes. E fiz isso depois que vi que no cadastro_simples ñ havia esse comando mas eu gostaria de usar o outro completo.

 

A minha intenção é criar uma área restrita para cada usuário, pois trabalho com serviços gráficos e gostaria de uma área para que o meu cliente possa ver uma amostra de como o serviço vai ficar, mas teria que ser um jeito de que quando cada usuário logar seja enviado para sua respectiva página, você poderia me dar essa ajudinha.

 

PS. Estou usando o Dreamweaver MX, e estou criando as pags em .php se puder me ajudar o mais mastigado possível te agradeço, ou um passo a passo que um iniciante que não conhece nada de programação possa entender.

 

Desde já muito obrigado.

 

Marcos Vinicius

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para nomes pode ser VARCHAR(45)

e senha por segurança voce deve criptografa-la, e por padrao usando MD5

dai usando MD5 ele gera uma senha criptografa de 32 caracteres sempre

entao use CHAR(32) para senha e para emails pode usar VARCHAR(64)

Olá Fabyo tô eu aki denovo, bom depois de fuçar, pesquisar e queimar a mufa pelo sistema, vi em parte onde eu estava errando, ñ sei se esse era mesmo o erro: bom peguei o PHPAdmin e criei um banco de dados com o nome "banco" e copiei o conteudo da tabela e aí funcionou, pois vi que no config estava lincando para esse "banco" ñ sei se era mesmo isso que eu deveria fazer, se for, http://forum.imasters.com.br/public/style_emoticons/default/clap.gif estou evoluindo.

 

Tem uma outra coisa que gostaria de saber qual o comando para não duplicar o e-mail e o login no bd pois fiz um teste e o e-mail ñ duplica mas o login sim.

 

Tb gostaria de saber como posso usar esse login e senha para autenticar o usuário no site?

E como posso enviar a senha para o cliente se ele esquecer a mesma?

 

Desde já muito obrigado.

Marcos Vinicius

Compartilhar este post


Link para o post
Compartilhar em outros sites

ao inves d criar uma pasta para cada usuario você pode chamar os dados dele pelo php atraves do get

você deve ter uma tabela com os dados do usuario e outra tabela você poderia por o campo id, usuario, amostra 1 , amostra 2 amostra+n.

O campo id seria para controle da tabela, o campo usuarios seria nde você iria por o nome deusuario q pode ver akele determinado trabalho e amostra 1 2,.... seria o campo onde você colocaria o camiho da imagem q q mostra pra ele

 

 

O sistema de login, cadastro de usuario o proprio DW tem eh soh ir em apllication q lah tem login , logout , cadastro , restringir pagina , cadastro e etc.

 

O usuario sera identificado pela session (c feito pelo DW).

 

Cria uma pagina qualquer em php colocando no inicio o seguinte

 

$usuariologado = $_SESSION['MM_Username'];

 

onde MM_Username seria o nome da variavel de sessão definida no login

dps você faz uma consulta na 2ª tabela :

 

mysql_select_db($database_var_conexao, $var_conexao); //definido na hora q você criou a conexão com o banco de dados(neste exeplo minha conexão chama var_conexão)

$seleciona_usuario= sprintf("SELECT * FROM imagens_usuarios WHERE usuario=$usuariologado);

$exe_tabela= mysql_query($usuarios, $var_conexao) or die(mysql_error());

$mostra_dados = mysql_fetch_assoc($exe_tabela);

$total_usuarios = mysql_num_rows($exe_tabela);

 

 

 

ai pra mostra a 1ª img :

 

echo $mostra_dados['amstra 1'];

 

 

echo = comando para q o php escreva.

$mostra_dados = variavel criada responsavel por fazer a busca e mostrar o conteudo d determinada coluna na tabela

$mostra_dados['amostra 1'] = dentro do [''] eh onde você coloca o nome do campo da tabela.

C você naum conseguir faze o sistema de login poe ae no forum como você tentou faze ou vai no google e procura um tutorial tem uns 500

flaw

Compartilhar este post


Link para o post
Compartilhar em outros sites

O tópico é antigo mas esta atualização vale muito na hora de desenvolver. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Como o tempo se passou e foram adquirido novos conhecimentos e novas funções do PHP, creio que a forma de transformar uma data no formato americano para o brasileiro ficaria bem mais coerente aos dias atuais desta maneira:

 

$data = date("d/m/Y", strtotime("2006-08-25"));
//resultado = "25/08/2006";

Mesmo resultado, código mais limpo e sem POG. ^_^

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, pode se utilizar tbm o proprio mysql para converter a data

 

e só uma observação saber manipular funções para se fazer alguma coisa nao é POG

 

POG no meu ponto de vista na maioria das vezes é fazer algo em varias linhas quando se poderia fazer em poucas linhas ou ate em 1 linha de codigo.

 

claro que POG nao se resume só ao numero de linhas de um codigo, mas na maioria deles o POG fica claro só pelo numero de linhas

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, pode se utilizar tbm o proprio mysql para converter a data

 

e só uma observação saber manipular funções para se fazer alguma coisa nao é POG

 

POG no meu ponto de vista na maioria das vezes é fazer algo em varias linhas quando se poderia fazer em poucas linhas ou ate em 1 linha de codigo.

 

claro que POG nao se resume só ao numero de linhas de um codigo, mas na maioria deles o POG fica claro só pelo numero de linhas

 

Com certeza Fabyo... sempre utilizei este método, nunca tive problemas, e aprendi com o seu tutorial http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.