PHP - Como Ligar à BD, Inserir, Eliminar, Procurar, Listar, Modificar

ScalaZone

Power Member
Bem, depois de muitas mensagens, pedidos e esclarecimento de dúvidas em relação ao PHP+MySql ... decidi postar fragmentos de código, que são os essenciais, das imensas possibilidades que temos em trabalhar com uma base de dados.

Ligar à base de dados:
<?php
//Ligacao a base de dados
$bd_util="nome do utilizador";
$bd_pw="password";
$bd="nome da base de dados";
$bd_con = mysql_connect("localhost(servidor, neste caso a nível local)", "$bd_util", "$bd_pw") or die("Erro na abertura!");
mysql_select_db("$bd", $bd_con);
?>
Inserir dados na base de dados:
include 'bdcon.php'; //um include que chama a ligação à BD

//Recebe o valor da variável "txt_nm_aluno2" que é enviada pelo método POST de uma form
$var_nm_aluno=$_POST['txt_nm_aluno2'];

//Insere os dados na base de dados dos dados dos alunos
$sql="insert into dados_alunos (txt_nm_aluno)values('$var_nm_aluno')";
$resultado = mysql_db_query("alunos",$sql);
$reg_ins=mysql_affected_rows();
echo "$reg_ins registo inserido com sucesso<p>";
mysql_close();}

Eliminar um registo na BD
O raciocinio é exactamente igual ao anterior, só com um aspecto diferente.
Na instrução SQL é substituida por esta:

$com_sql_distritos="DELETE FROM dados_alunos WHERE id like '$id_elemina'";
//Repara que na vez de "Insert" aparece agora "Delete"
Modificar um registo ou "update" a um registo
Antes de mais, já terão guardado em variáveis todo o conteúdo que querem modificar na BD.

$id_mod=$_POST["idd_aluno"];

//Ligacao a base de dados
//Chamam o vosso include ou simplesmente fazem aqui a conexão

$com_sql_distritos="UPDATE dados_alunos SET txt_nm_aluno = '".$_REQUEST['txt_nome_mod']."'";

Como já puderam reparar, a sintaxe do SQL mudou para "Update", simples né?
Fazer uma pesquisa na BD
//Guarda na variável "$var_nome" o valor da caixa de texto "txt_pesquisar_a" do formulário
$var_nome=$_POST['txt_pesquisar_a'];

//ligação à BD
include 'bdcon.php';

//Pesquisa//
$com_sql_distritos="SELECT * FROM dados_alunos WHERE txt_nm_aluno like '$var_nome'";
Listar dados
Para listar é tão simples como fazerem um ciclo while, até chegar ao ultimo registo (while ($linha = mysql_fetch_array($resul_distritos))).
Depois, basta escrever o echo à variável.

Bem mais do que isto não posso fazer.
Alguns bons programadores devem estar a gozar com esta situação, uma vez que tive o trabalho de disponibilizar literalmente, todo o código necessário a estas bases aplicações com uma base de dados.

Nada de PM's sobre este assunto.
Obrigado
:009:
 
Boas!

Eliminar um registo na BD

O raciocinio é exactamente igual ao anterior, só com um aspecto diferente.
Na instrução SQL é substituida por esta:

$com_sql_distritos="DELETE FROM dados_alunos WHERE id like '$id_elemina'";
//Repara que na vez de "Insert" aparece agora "Delete"

E se $id_elemina = "0' OR '1'='1"? (magic_quotes = off)

Não quero deitar por terra o teu trabalho, mas acho que este tipo de coisas é tão sensível que o ideal será ensinar explicando. Apenas isso tem a desvantagem do utilizador nem sempre saber o que está a fazer, e acaba por cair no erro mais comum de todos - SQL Injection.
 
Última edição:
Boas!



E se $id_elemina = "0' OR '1'='1"? (magic_quotes = off)

Não quero deitar por terra o teu trabalho, mas acho que este tipo de coisas é tão sensível que o ideal será ensinar explicando. Apenas isso tem a desvantagem do utilizador nem sempre saber o que está a fazer, e acaba por cair no erro mais comum de todos - SQL Injection.


É certo que tens razão, mas repara que o objectivo do ScalaZone também não era dar aqui um curso de PHP/MYSQL e ainda técnicas anti hacking. Sql injection, php injection, xss são preocupações que aqueles vêm perguntar como se liga à bd e se enfia lá dados não têm.

Mas não deixas de ter razão, a questão da segurança é extremamente importante nos dias que correm.
Como tal vou deixar aqui um pequeno contributo para ajudar os que têm menos conhecimentos a prevenirem-se contra SQL injection.

Antes de passarem um valor para a bd, apliquem-lhe esta função:


PHP:
    function mysql_prep( $value ) {
        $magic_quotes_active = get_magic_quotes_gpc();
        $new_enough_php = function_exists( "mysql_real_escape_string" ); // i.e. PHP >= v4.3.0
        if( $new_enough_php ) {
            
            if( $magic_quotes_active ) { $value = stripslashes( $value ); }
            $value = mysql_real_escape_string( $value );
        } else { 
            
            if( !$magic_quotes_active ) { $value = addslashes( $value ); }
            
        }
        return $value;
    }
Usar da seguinte forma:

PHP:
$valor_que_vai_para_bd=mysql_prep($valor);
.
 
Última edição:
Eu sei, e volto a repetir que não quero desvalorizar o trabalho tido, mas é que ver coisas destas (acessível apenas a Power Members - refiro-me ao site do Nesquik ter sido crackado) serve para lembrar que enquanto os developers não aprenderem que a segurança de uma aplicação é tão importante como a mesma, os sites deles vão, invariavelmente, acabar da mesma forma.
 
Por acaso comecei nestas andanças a semana passada e desde cedo houve pessoas que me alertaram para a possibilidade de injectarem texto nas queries à bd.

Ora...se eu que comecei há tão pouco tempo e já estou ciente desse facto como é que algo desse genero acontece no site da nesquik?
 
Por acaso comecei nestas andanças a semana passada e desde cedo houve pessoas que me alertaram para a possibilidade de injectarem texto nas queries à bd.

Ora...se eu que comecei há tão pouco tempo e já estou ciente desse facto como é que algo desse genero acontece no site da nesquik?

É uma boa pergunta e provavelmente quem fez o site estava ciente disso. Talvez não soubesse como proteger ou simplesmente não se quis dar ao trabalho..
 
Há muito mais formas de injectar código do que o simples "OR 1=1" :) muitas chegam a ser verdadeiramente complexas, e esse tipo de coisas pode passar despercebido ao programador. Não tem necessariamente de ser um mau programador, mas pelo menos devia estar a par dos problemas mais recentes; devia estar "em cima dos acontecimentos" (mas nem eu estou, por isso não posso falar muito :x )
Por exemplo, se te estiverem a aconselhar constantemente o uso da função mysql_real_escape_string, fica a saber que essa função teve um certo problema com caracteres dos charsets BIG5 e GBK. Link. Penso que isso tenha sido corrigido nas versões mais recentes, mas nem todos os alojamentos têm as versões mais actualizadas do software ;)

A questão aqui é que "de pequenino é que se torce o pepino" (isto é, é bom começar logo do princípio a ganhar boas práticas), e, por melhor que o programador daquele site seja, percebe-se assim que não chegou para evitar esta falha.

Agora o essencial é porem aquilo a trabalhar. Não sei há quanto tempo está assim, mas se está um concurso a decorrer, é bom que resolvam o mais rápido possível.
 
Php - bd

Boas!



E se $id_elemina = "0' OR '1'='1"? (magic_quotes = off)

Não quero deitar por terra o teu trabalho, mas acho que este tipo de coisas é tão sensível que o ideal será ensinar explicando. Apenas isso tem a desvantagem do utilizador nem sempre saber o que está a fazer, e acaba por cair no erro mais comum de todos - SQL Injection.


É assim,
como eu expliquei, ou secalhar esqueci-me de dizer. Não dei todos os passos, apenas os principais. É óbvio que faltam muitas questões de segurança e não só. Muitas validações, mas como disseram, e muito bem, não estou aqui para dar um curso!
Apenas de uma maneira geral, abordei o assunto.
Obrigado pela tua opinião.
Obrigado ao alakazan pelo seu contributo.

Ps: podem muito bem começar por aplicarem isto aos vossos exercicios na escola :x2:
 
Se tiver um ficheiro global, que trata de todos os REQUEST's, no topo algo do tipo fica bem:

foreach ($_POST as $key => $valor) {
$_POST[$key] = mysql_real_escape_string($valor);
}

Pelo que vocês não tem que se preocupar, pois o valor do POST já foi tratado e reposto para poderem usar directamente do $_POST
 
1º Boa programação
2º Não permitir acessos exterior à base de dados (apenas aberto para localhost)
3º Apenas acesso com um username e com uma password segura
 
A 1ª é usar por exemplo "mysql_real_escape_string" antes de enviar os dados para a base de dados, a 2ª depende da configuração dos servidores, mas por exemplo num alojamento podes conseguir aceder à base de dados a partir do teu pc, e isso pode ser inseguro.
 
phpmyadmin? Isso está no servidor, no cPanel podes definir ips para acederem de fora do servidor, com programas próprios ou sites que estejam noutros servidores.
 
Back
Topo