Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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"
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:
bom, muito bom!
Fabyo, parabéns !
Excelente explicação ! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif
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 !!!
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+
Que otimo Fabyo !Estou aguardando :aplause:
Ola Pessoal, resolvi criar esse tutorial...
Olá Fabyo, você recomendaria que tamanho para Login, Senha e Email?
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) +-
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/](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?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
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
Obrigado pela ajuda Fabyo http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif
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
>
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
>
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
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
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
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
>
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
Sou novo no forum. Gostaria de parabenizar pela qualidade do forum.
Sou novo no forum. Gostaria de parabenizar pela qualidade do forum.
Em nome de toda a equipe, obrigado pelo reconhecimento :)
E aí Pessoal, tudo bom?
Duas dúvidas Fabyo:
>
E aí Pessoal, tudo bom?
Duas dúvidas Fabyo:
o campo email pode ser do tamanho que você achar necessário, agora motivo para usar 64 nao tem.. imagina um email em um subdominio de um site:
leandrooverabarral@staff.portaldigidesign.com.br -> só aqui 48 caracteres.. sacou?
agora sobre o md5, ele nao criptografa nada, ele apenas cria um hash de 32 caracteres (se nao me engano) "impossibilitando" uma engenharia inversa.. a nao ser que se tenha um dicionario com todas as combinações possiveis de letras e tal, algo impossivel.
agora usar ele dentro ou nao da instrução sql deve ser pelo mesmo motivo de resgatar as datas formatadas direto do banco, diminuição de linhas de código e mais agilidade no processamento das informações..
Espero ter respondido sua dúvida e não ter falado muita besteira! ehauehaueh
Abraço.
Att,
Leandro Barral []'..
Valeu, bom tutorial.
Porem está incorreto um detalhe dessa frase "(...)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(...)", se for salvo apenas 10 caracteres em uma VARCHAR(20) ira ter um tamanho de 11 e não 10 como diz o texto.
Fabyo: Parabéns pelo post, este foi um dois meus primeiros contatos com MySQL e ele realmente ajuda muito.
Qual valor devo usar para telefone que tenha a seguinte estrutura (47)3210-0123. Em meu caso utilizei Integer(10) mas não sei se é o certo. E também nõa sei se devo contar os outros caracteres como '(' e '-'.
A outra questão é em relação ao número da casa. Neste caso eu utilizei Smallinte(5).
Bom, se alguem souber me dizer se fiz certo ou não eu agradeço.
Depende muito da sua aplicação, se for algo simples voce pode gravar o numero ja com a mascara se isso nao for te atrapalhar nas pesquisas, mas voce tambem pode gravar em formato numerico sem a mascara, porque a mascara voce só usa para exibir pro usuario.
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 ;)