PHP e MySQL Programação de Servidores Marx Gomes Van der Linden http://marx.vanderlinden.com.br/
PHP e MySQL PHP possui 3 interfaces para se comunicar com um banco de dados MySQL. O conjunto de funções mysql_* O conjunto de funções mysqli_* A interface orientada a objeto PEAR::DB Uso geral para vários SGBDs diferentes http://marx.vanderlinden.com.br/ 2
mysql_connect mysql_connect($servidor, $usuario, $senha) Conecta ao servidor MySQL com os parâmetros especificados. Retorna um identificador de conexão em caso de sucesso, ou FALSE em caso de erro. http://marx.vanderlinden.com.br/ 3
mysql_error mysql_error() Retorna a última mensagem de erro emitida pelo MySQL die($msg) Exibe a mensagem especificada e encerra o programa. Usado apenas para debug. http://marx.vanderlinden.com.br/ 4
mysql_select_db mysql_select_db($nomedb, [$link]) Seleciona o banco de dados a ser usado. Retorna TRUE ou FALSE, em caso de sucesso e erro, respectivamente. Se $link não for especificado, utiliza a última conexão aberta. http://marx.vanderlinden.com.br/ 5
mysql_close mysql_close($link) Fecha a conexão com o banco de dados. Normalmente não é necessário: a conexão é fechada automaticamente após término da execução da página. Se $link não for especificado, utiliza a última conexão aberta. Retorna TRUE ou FALSE, em caso de sucesso e erro, respectivamente. http://marx.vanderlinden.com.br/ 6
Exemplo $link = mysql_connect('localhost', 'root', ''); if(!$link) die("erro ao conectar: ". mysql_error()); if(!mysql_select_db('music2')) die("erro ao selecionar o banco de dados:". mysql_error()); mysql_close(); http://marx.vanderlinden.com.br/ 7
Separando a conexão Geralmente, o código que realiza a conexão ao banco de dados é mantido em um arquivo separado contendo apenas estes comandos, com as informações necessários. O código, então, é incluído no início de cada arquivo. http://marx.vanderlinden.com.br/ 8
Separando a conexão http://marx.vanderlinden.com.br/ 9
mysql_query mysql_query($sql, [$link]) Envia uma consulta SQL ao servidor identificado por $link (opcional). Em caso de falha, retorna FALSE. http://marx.vanderlinden.com.br/ 10
mysql_query mysql_query($sql, [$link]) Em caso de sucesso: Para comandos que não resultam em uma tabela (INSERT, UPDATE, etc...), retorna TRUE. Para comandos que resultam em uma tabela (SELECT, SHOW, etc...), retorna um recurso que representa o resultado. http://marx.vanderlinden.com.br/ 11
mysql_num_[rows fields] mysql_num_rows ($res) Retorna o número de colunas do resultado especificado. mysql_num_fields ($res) Retorna a quantidade de campos do resultado especificado. http://marx.vanderlinden.com.br/ 12
Exemplo $res = mysql_query( 'SELECT * FROM cd NATURAL JOIN artista'); if(!$res) die("erro na consulta SQL: ". mysql_error()); $nlinhas = mysql_num_rows($res); $ncampos = mysql_num_fields($res); echo "A tabela retornada tem $ncampos campos e $nlinhas linhas."; http://marx.vanderlinden.com.br/ 13
Exemplo Resultado: A tabela retornada tem 5 campos e 7 linhas. http://marx.vanderlinden.com.br/ 14
mysql_fetch_(row assoc) mysql_fetch_row($res) Retorna uma linha do resultado como um array numérico, e avança o ponteiro interno do recurso para a próxima posição. Retorna FALSE se não há mais linhas no resultado. mysql_fetch_assoc($res) Como mysql_fetch_row, mas retorna a linha como um array associativo. http://marx.vanderlinden.com.br/ 15
Exemplo: mysql_fetch_row $res = mysql_query( 'SELECT * FROM cd NATURAL JOIN artista'); $nlinhas = mysql_num_rows($res); $ncampos = mysql_num_fields($res); echo "A tabela retornada tem $ncampos campos e $nlinhas linhas:<br>"; while($linha = mysql_fetch_row($res)){ echo implode(', ', $linha), '<br>'; } http://marx.vanderlinden.com.br/ 16
Saída http://marx.vanderlinden.com.br/ 17
Exemplo: mysql_fetch_assoc $res = mysql_query( 'SELECT * FROM cd NATURAL JOIN artista'); $nlinhas = mysql_num_rows($res); $ncampos = mysql_num_fields($res); echo "A tabela retornada tem $ncampos campos e $nlinhas linhas:<br>"; while($linha = mysql_fetch_assoc($res)){ echo "Artista: <strong>$linha[nome]</strong><br>"; echo "Título do CD: $linha[titulo]<br>"; echo "Lançamento: <em>$linha[lancamento]</ em><br>"; echo '<hr>'; http://marx.vanderlinden.com.br/ 18 }
Saída http://marx.vanderlinden.com.br/ 19
Exemplo require_once('bd.php'); $usuario = $_POST['usuario']; $senha = $_POST['senha']; $sql = "SELECT * FROM usuarios WHERE login = '$usuario' AND senha = '$senha'"; mysql_query($sql); http://marx.vanderlinden.com.br/ 20
Uso SELECT * FROM usuarios WHERE login = 'admin' AND senha = 'dj5c4v' http://marx.vanderlinden.com.br/ 21
SQL Injection SELECT * FROM usuarios WHERE login = 'admin' -- ' AND senha = '' http://marx.vanderlinden.com.br/ 22
Exemplo 2 require_once('bd.php'); $nome = $_GET['nome']; $sql = "SELECT * FROM clientes WHERE nome = '$nome'"; mysql_query($sql); http://marx.vanderlinden.com.br/ 23
Uso SELECT * FROM clientes WHERE nome = 'Ruppert Barnes' http://marx.vanderlinden.com.br/ 24
SQL Injection SELECT * FROM clientes WHERE nome = '' OR '1' http://marx.vanderlinden.com.br/ 25
mysql_real_escape_string mysql_real_escape_string($string) Retorna um string com os valores de escape adicionados aos caracteres \x00, \n, \r, \, ', " e \x1a, no string original. Sempre deve ser usada em qualquer string oriunda de uma fonte externa que vai ser incluída em uma consulta SQL. Evita a maioria dos ataques de SQL Injection. http://marx.vanderlinden.com.br/ 26
Exemplo require_once('bd.php'); $usuario = mysql_real_escape_string($_post['usuario']); $senha = mysql_real_escape_string($_post['senha']); $sql = "SELECT * FROM usuarios WHERE login = '$usuario' AND senha = '$senha'"; mysql_query($sql); http://marx.vanderlinden.com.br/ 27
Tentativa de Ataque SELECT * FROM usuarios WHERE login = 'admin\' -- ' AND senha = '' http://marx.vanderlinden.com.br/ 28
magic_quotes_gpc Há uma configuração de PHP que automaticamente adiciona caracteres de escape a qualquer variável submetida via GET ou POST magic_quotes_gpc On Off Útil por razões de segurança, mas pode entra em conflito com mysql_real_escape_string http://marx.vanderlinden.com.br/ 29
Problema com magic_quotes_gpc SELECT * FROM usuarios WHERE login = 'O\\\'Reilly' AND senha = 'grt4gf' http://marx.vanderlinden.com.br/ 30
Lidando com magic_quotes get_magic_quotes_gpc() Retorna TRUE ou FALSE, de acordo com o valor da configuração magic_quotes_gpc stripslashes($string) Retorna uma string sem os caracteres de escape, desfazendo o efeito de magic_quotes_gpc http://marx.vanderlinden.com.br/ 31
Lidando com magic_quotes_gpc SELECT * FROM usuarios WHERE login = 'O\'Reilly' AND senha = 'grt4gf' http://marx.vanderlinden.com.br/ 32
http://xkcd.com/327 http://marx.vanderlinden.com.br/ 33
http://xkcd.com/327 http://marx.vanderlinden.com.br/ 34