Programação para WEB
Regis Pires Magalhães
regispiresmag@gmail.com
PHP e MySQL
Opções de acesso
 Há várias formas de acessar o MySQL:
 Extensão MySQL
 É a mais usada atualmente.
 Excelente performance.
 Suporta conexões persistentes.
 Não suporta prepared statements.
 Extensão MySQLi (Improved / Melhorada)
 Possui funcionalidades extra como prepared
statements, conjunto de caracteres, codificação e
transações.
 Não suporta conexões persistentes. É possível que
sejam habilitadas como padrão na versão 6 do PHP.
 Possui uma interface procedural e uma interface OO.
Opções de acesso
 Há várias formas de acessar o MySQL:
 ADOdb
 Biblioteca bastante completa que padroniza o acesso a
vários bancos de dados.
 Acesso semelhante ao ADO da Microsoft, mas roda em
outros sistemas operacionais além do Windows.
 PEAR
 PHP Extension and Application Repository
 Extensa biblioteca com muitas finalidades, inclusive
acesso padronizado a diferentes bancos de dados.
 PDO – PHP Data Objects
 Interface que padroniza o acesso a bancos de dados.
 Embutido no PHP a partir da versão 5.1
Conexão com o MySQL
 mysql_connect
 Abre uma conexão com um servidor MySQL.
 mysql_close
 Fecha uma conexão com um servidor MySQL.
 Normalmente não é necessário, já que as conexões não
persistentes são automaticamente fechadas ao final da
execução do script.
 mysql_error
 Retorna o texto da mensagem de erro da operação MySQL
anterior.
Conexão com o MySQL
<?php
$link = mysql_connect('localhost', 'root', '');
if (!$link) {
die('Não foi possível conectar: ' . mysql_error());
}
echo 'Conexão bem sucedida';
mysql_close($link);
?>
Seleção de Base de Dados
 mysql_select_db
 Seleciona uma base de dados MySQL.
<?php
$con = mysql_connect('localhost', 'root', '');
if (!$con) {
die('Não foi possível conectar: ' . mysql_error());
}
$base = mysql_select_db('prog_web', $con);
if (!$base) {
die ('Erro ao usar a base: ' . mysql_error());
} else {
echo('Base de dados selecionada.');
}
?>
Operações na Base de Dados
 mysql_query
 Executa uma consulta ou comando SQL.
 mysql_fetch_assoc
 Obtém um linha do resultado como uma matriz
associativa
Codificação de Caracteres
 Algumas dicas para evitar problemas com
acentuação de caracteres:
 Bases de dados, tabelas e campos alfanuméricos
criados no MySQL devem usar codificação utf8 e
collation utf8_general_ci.
 O HTML gerado deve ter conjunto de caracteres
utf-8:
 Para isso, incluir a seguinte tag meta na tag head:
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
 O editor de textos usado deve gravar o arquivo no
formato utf-8 (sem BOM – Byte Order Mark).
Consulta e Exibição
<?php
$conexao = mysql_connect('localhost','root','')
or die ("Erro ao efetuar conexão.");
mysql_select_db("prog_web");
mysql_set_charset('utf8');
$result = mysql_query("SELECT * FROM pessoas",$conexao)
or die (" ERRO na consulta " . mysql_error());
?>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<title>IFPI-PHB</title>
</head>
<body>
<h1>Pessoas</h1>
<table border="1">
<tr><th>Nome</th><th>Fone</th><th>E-Mail</th></tr>
<?php while($pessoa = mysql_fetch_array($result)) { ?>
<tr>
<td><?= $pessoa['nome'] ?></td>
<td><?= $pessoa['fone'] ?></td>
<td><?= $pessoa['email'] ?></td>
</tr>
<? } ?>
</table>
</body>
</html>
Criação de Base de Dados
<?php
$con = mysql_connect('localhost', 'root', '');
if (!$con) {
die('Não foi possível conectar: ' . mysql_error());
}
$sql = 'CREATE DATABASE prog_web';
if (mysql_query($sql, $con)) {
echo 'A base de dados foi criada';
} else {
echo 'Erro ao criar a BD: ' . mysql_error();
}
?>
CRUD
 Create - Criar
 Read / Retrieve – Ler / Obter
 Update - Atualizar
 Delete – Apagar / Remover
CRUD - Arquivos
 db_conecta.php
 Conexão com a base de dados
 pessoas_lista.php
 Lista todas as pessoas
 pessoas_mostra.php
 pessoas_exclui.php
 pessoas_insere.php
 pessoas_form.php
 Parte do formulário compartilhado por
'pessoas_insere.php' e 'pessoas_edita.php'
 pessoas_edita.php
CRUD - db_conecta.php
<?php
$conexao = mysql_connect('localhost','root','')
or die ('Erro ao efetuar conexão.');
mysql_select_db('prog_web');
mysql_set_charset('utf8');
?>
CRUD - pessoas_lista.php
<?php
include_once('db_conecta.php');
$result = mysql_query("SELECT * FROM pessoas",$conexao)
or die ('ERRO na consulta: ' . mysql_error());
?>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<title>IFPI-PHB</title>
</head>
<body>
<h1>Pessoas - Lista</h1>
<table border="1">
<tr><th>Nome</th><th>Fone</th>
<th>E-Mail</th><th colspan="3">Ações</th>
</tr>
<?php while($pessoa = mysql_fetch_array($result)): ?>
<tr>
<td><?= $pessoa['nome'] ?></td>
<td><?= $pessoa['fone'] ?></td>
<td><?= $pessoa['email'] ?></td>
<td><a href="pessoa_mostra.php?id=<?= $pessoa['id'] ?>">Mostra</a></td>
<td><a href="pessoa_edita.php?id=<?= $pessoa['id'] ?>">Edita</a></td>
<td><a href="pessoa_exclui.php?id=<?= $pessoa['id'] ?>"
onclick="return confirm('Tem certeza?');">Exclui</a></td>
</tr>
<?php endwhile; ?>
</table>
<p><a href="pessoa_insere.php">Insere</a></p>
</body>
</html>
CRUD - pessoa_mostra.php
<?php
include_once('db_conecta.php');
$id = $_GET['id'];
$result = mysql_query("SELECT * FROM pessoas where id='$id'",
$conexao) or die ('ERRO na consulta: ' . mysql_error());
$pessoa = mysql_fetch_array($result);
?>
<html>
<head>
<meta http-equiv="Content-type"
content="text/html; charset=utf-8" />
<title>IFPI-PHB</title>
</head>
<body>
<h1>Pessoas - Mostra</h1>
<p>Nome: <?= $pessoa['nome'] ?></p>
<p>Telefone: <?= $pessoa['fone'] ?></p>
<p>E-Mail: <?= $pessoa['email'] ?></p>
<p><a href="pessoas_lista.php">Volta</a></p>
</body>
</html>
CRUD - pessoa_exclui.php
<?php
include_once('db_conecta.php');
$id = $_GET['id'];
mysql_query("DELETE FROM pessoas where id='$id'",$conexao)
or die (' ERRO na exclusão: ' . mysql_error());
header('Location: pessoas_lista.php');
?>
CRUD - pessoa_insere.php
<?php
include_once('db_conecta.php');
$pessoa['nome'] = $_POST['nome'];
$pessoa['fone'] = $_POST['fone'];
$pessoa['email'] = $_POST['email'];
if (strlen(trim($_POST['nome'])) > 0) {
mysql_query("insert into pessoas (nome,fone,email) values
('{$pessoa['nome']}','{$pessoa['fone']}',
'{$pessoa['email']}')")
or die('Problema ao realizar operação: ' . mysql_error());
header("Location: pessoas_lista.php");
}
?>
<html>
<head>
<meta http-equiv="Content-type"
content="text/html; charset=utf-8" />
<title>IFPI-PHB</title>
</head>
<body>
<h1>Pessoas - Insere</h1>
<form action="pessoa_insere.php" method="post">
<?php include_once('pessoa_form.php'); ?>
<p><input type="submit" value="Insere" /></p>
</form>
<p><a href="pessoas_lista.php">Volta</a></p>
</body>
</html>
CRUD - pessoa_form.php
<p>Nome<br/><input type="text" name="nome"
value="<?= $pessoa['nome'] ?>" /></p>
<p>Telefone<br/><input type="text" name="fone"
value="<?= $pessoa['fone'] ?>" /></p>
<p>E-Mail<br/><input type="text" name="email"
value="<?= $pessoa['email'] ?>" /></p>
CRUD - pessoa_edita.php
<?php
include_once('db_conecta.php');
$result = mysql_query("SELECT * FROM pessoas where id='{$_GET['id']}'",
$conexao)
or die (" ERRO na consulta " . mysql_error());
$pessoa = mysql_fetch_array($result);
if (strlen(trim($_POST['nome'])) > 0) {
mysql_query("update pessoas set nome='{$_POST['nome']}',
fone='{$_POST['fone']}', email='{$_POST['email']}'
where id='{$_GET['id']}'")
or die('Problema ao realizar operação: ' . mysql_error());
header("Location: pessoas_lista.php");
}
?>
<html>
<head>
<meta http-equiv="Content-type"
content="text/html; charset=utf-8" />
<title>IFPI-PHB</title>
</head>
<body>
<h1>Pessoas - Edita</h1>
<form action="pessoa_edita.php?id=<?= $_GET['id'] ?>"
method="post">
<?php include_once('pessoa_form.php'); ?>
<p><input type="submit" value="Atualiza" /></p>
</form>
<p><a href="pessoas_lista.php">Volta</a></p>
</body>
</html>
PHP com MySQL
DETALHES EXTRA
Conexão com MySQL
 Usar UNIX socket é mais eficiente que usar a camada TCP/IP.
 Para a extensão mysql usar UNIX socket basta que esse
recurso esteja disponível e que o nome do host seja
localhost:
 Também é possível definir o acesso via UNIX Socket
explicitamente:
mysql_connect('localhost','root', '');
mysql_connect('localhost:/var/run/mysqld/mysqld.sock',
'root', '');
Conexão com MySQL
 mysql_pconnect
 Abre uma conexão persistente com um servidor
MySQL.
 Ao conectar, a função tenta encontrar uma
conexão que já esteja aberta.
 Se uma for encontrada, será usada ao invés de
abrir uma nova conexão.
 A conexão não será fechada quando a execução
do script terminar.
 Ela permanecerá aberta para uso futuro
 mysql_close() não irá fechar conexões estabelecidas
por mysql_pconnect().
Obtendo informações
<?php
$link = mysql_pconnect('localhost', 'root', '');
if (!$link) {
die('Falha na conexão: ' . mysql_error());
}
echo('Servidor: ' . mysql_get_host_info() . '<br/>');
echo('Cliente : ' . mysql_get_client_info() . '<br/>');
?>
Prepared Statements
 Vantagens:
 Velocidade
 É um meio eficiente de executar um comando
mais de uma vez. O comando é analisado e
preparado para execução no próprio banco de
dados.
 Segurança
 Reduz a possibilidade de SQL Injection.
 Não está disponível na biblioteca mysql.
Prepared Statements com mysqli
<?php
$con = mysqli_connect("localhost", "my_user", "my_password", "my_db");
if (mysqli_connect_errno()) {
echo("A conexão falhou: " . mysqli_connect_error());
exit();
}
$cidade = "Parnaíba";
if ($stmt = mysqli_prepare($con,
"SELECT bairro, cep FROM cidade WHERE nome =?")) {
mysqli_stmt_bind_param($stmt, "s", $cidade);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $bairro, $cep);
while (mysqli_stmt_fetch($stmt)) {
echo("$cidade fica no bairro $bairro e cep $cep");
}
mysqli_stmt_close($stmt);
}
mysqli_close($con);
?>
mysqli_stmt_bind_param
 bool mysqli_stmt_bind_param ( mysqli_stmt $stmt , string
$types , mixed &$var1 [, mixed &$... ] )
 type
 i - corresponde a uma variável de tipo inteiro
 d - corresponde a uma variável de tipo double
 s - corresponde a uma variável de tipo string
 b - corresponde a uma variável que contém
dados para um blob e enviará em pacotes
mysqli_stmt_bind_param
...
$stmt = mysqli_prepare($link, "INSERT INTO lang VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'sssd', $code, $lang, $official, $perc);
...

Prog web 05-php-mysql

  • 1.
    Programação para WEB RegisPires Magalhães regispiresmag@gmail.com PHP e MySQL
  • 2.
    Opções de acesso Há várias formas de acessar o MySQL:  Extensão MySQL  É a mais usada atualmente.  Excelente performance.  Suporta conexões persistentes.  Não suporta prepared statements.  Extensão MySQLi (Improved / Melhorada)  Possui funcionalidades extra como prepared statements, conjunto de caracteres, codificação e transações.  Não suporta conexões persistentes. É possível que sejam habilitadas como padrão na versão 6 do PHP.  Possui uma interface procedural e uma interface OO.
  • 3.
    Opções de acesso Há várias formas de acessar o MySQL:  ADOdb  Biblioteca bastante completa que padroniza o acesso a vários bancos de dados.  Acesso semelhante ao ADO da Microsoft, mas roda em outros sistemas operacionais além do Windows.  PEAR  PHP Extension and Application Repository  Extensa biblioteca com muitas finalidades, inclusive acesso padronizado a diferentes bancos de dados.  PDO – PHP Data Objects  Interface que padroniza o acesso a bancos de dados.  Embutido no PHP a partir da versão 5.1
  • 4.
    Conexão com oMySQL  mysql_connect  Abre uma conexão com um servidor MySQL.  mysql_close  Fecha uma conexão com um servidor MySQL.  Normalmente não é necessário, já que as conexões não persistentes são automaticamente fechadas ao final da execução do script.  mysql_error  Retorna o texto da mensagem de erro da operação MySQL anterior.
  • 5.
    Conexão com oMySQL <?php $link = mysql_connect('localhost', 'root', ''); if (!$link) { die('Não foi possível conectar: ' . mysql_error()); } echo 'Conexão bem sucedida'; mysql_close($link); ?>
  • 6.
    Seleção de Basede Dados  mysql_select_db  Seleciona uma base de dados MySQL. <?php $con = mysql_connect('localhost', 'root', ''); if (!$con) { die('Não foi possível conectar: ' . mysql_error()); } $base = mysql_select_db('prog_web', $con); if (!$base) { die ('Erro ao usar a base: ' . mysql_error()); } else { echo('Base de dados selecionada.'); } ?>
  • 7.
    Operações na Basede Dados  mysql_query  Executa uma consulta ou comando SQL.  mysql_fetch_assoc  Obtém um linha do resultado como uma matriz associativa
  • 8.
    Codificação de Caracteres Algumas dicas para evitar problemas com acentuação de caracteres:  Bases de dados, tabelas e campos alfanuméricos criados no MySQL devem usar codificação utf8 e collation utf8_general_ci.  O HTML gerado deve ter conjunto de caracteres utf-8:  Para isso, incluir a seguinte tag meta na tag head: <meta http-equiv="Content-type" content="text/html; charset=utf-8" />  O editor de textos usado deve gravar o arquivo no formato utf-8 (sem BOM – Byte Order Mark).
  • 9.
    Consulta e Exibição <?php $conexao= mysql_connect('localhost','root','') or die ("Erro ao efetuar conexão."); mysql_select_db("prog_web"); mysql_set_charset('utf8'); $result = mysql_query("SELECT * FROM pessoas",$conexao) or die (" ERRO na consulta " . mysql_error()); ?> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <title>IFPI-PHB</title> </head> <body> <h1>Pessoas</h1> <table border="1"> <tr><th>Nome</th><th>Fone</th><th>E-Mail</th></tr> <?php while($pessoa = mysql_fetch_array($result)) { ?> <tr> <td><?= $pessoa['nome'] ?></td> <td><?= $pessoa['fone'] ?></td> <td><?= $pessoa['email'] ?></td> </tr> <? } ?> </table> </body> </html>
  • 10.
    Criação de Basede Dados <?php $con = mysql_connect('localhost', 'root', ''); if (!$con) { die('Não foi possível conectar: ' . mysql_error()); } $sql = 'CREATE DATABASE prog_web'; if (mysql_query($sql, $con)) { echo 'A base de dados foi criada'; } else { echo 'Erro ao criar a BD: ' . mysql_error(); } ?>
  • 11.
    CRUD  Create -Criar  Read / Retrieve – Ler / Obter  Update - Atualizar  Delete – Apagar / Remover
  • 12.
    CRUD - Arquivos db_conecta.php  Conexão com a base de dados  pessoas_lista.php  Lista todas as pessoas  pessoas_mostra.php  pessoas_exclui.php  pessoas_insere.php  pessoas_form.php  Parte do formulário compartilhado por 'pessoas_insere.php' e 'pessoas_edita.php'  pessoas_edita.php
  • 13.
    CRUD - db_conecta.php <?php $conexao= mysql_connect('localhost','root','') or die ('Erro ao efetuar conexão.'); mysql_select_db('prog_web'); mysql_set_charset('utf8'); ?>
  • 14.
    CRUD - pessoas_lista.php <?php include_once('db_conecta.php'); $result= mysql_query("SELECT * FROM pessoas",$conexao) or die ('ERRO na consulta: ' . mysql_error()); ?> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <title>IFPI-PHB</title> </head> <body> <h1>Pessoas - Lista</h1> <table border="1"> <tr><th>Nome</th><th>Fone</th> <th>E-Mail</th><th colspan="3">Ações</th> </tr> <?php while($pessoa = mysql_fetch_array($result)): ?> <tr> <td><?= $pessoa['nome'] ?></td> <td><?= $pessoa['fone'] ?></td> <td><?= $pessoa['email'] ?></td> <td><a href="pessoa_mostra.php?id=<?= $pessoa['id'] ?>">Mostra</a></td> <td><a href="pessoa_edita.php?id=<?= $pessoa['id'] ?>">Edita</a></td> <td><a href="pessoa_exclui.php?id=<?= $pessoa['id'] ?>" onclick="return confirm('Tem certeza?');">Exclui</a></td> </tr> <?php endwhile; ?> </table> <p><a href="pessoa_insere.php">Insere</a></p> </body> </html>
  • 15.
    CRUD - pessoa_mostra.php <?php include_once('db_conecta.php'); $id= $_GET['id']; $result = mysql_query("SELECT * FROM pessoas where id='$id'", $conexao) or die ('ERRO na consulta: ' . mysql_error()); $pessoa = mysql_fetch_array($result); ?> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <title>IFPI-PHB</title> </head> <body> <h1>Pessoas - Mostra</h1> <p>Nome: <?= $pessoa['nome'] ?></p> <p>Telefone: <?= $pessoa['fone'] ?></p> <p>E-Mail: <?= $pessoa['email'] ?></p> <p><a href="pessoas_lista.php">Volta</a></p> </body> </html>
  • 16.
    CRUD - pessoa_exclui.php <?php include_once('db_conecta.php'); $id= $_GET['id']; mysql_query("DELETE FROM pessoas where id='$id'",$conexao) or die (' ERRO na exclusão: ' . mysql_error()); header('Location: pessoas_lista.php'); ?>
  • 17.
    CRUD - pessoa_insere.php <?php include_once('db_conecta.php'); $pessoa['nome']= $_POST['nome']; $pessoa['fone'] = $_POST['fone']; $pessoa['email'] = $_POST['email']; if (strlen(trim($_POST['nome'])) > 0) { mysql_query("insert into pessoas (nome,fone,email) values ('{$pessoa['nome']}','{$pessoa['fone']}', '{$pessoa['email']}')") or die('Problema ao realizar operação: ' . mysql_error()); header("Location: pessoas_lista.php"); } ?> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <title>IFPI-PHB</title> </head> <body> <h1>Pessoas - Insere</h1> <form action="pessoa_insere.php" method="post"> <?php include_once('pessoa_form.php'); ?> <p><input type="submit" value="Insere" /></p> </form> <p><a href="pessoas_lista.php">Volta</a></p> </body> </html>
  • 18.
    CRUD - pessoa_form.php <p>Nome<br/><inputtype="text" name="nome" value="<?= $pessoa['nome'] ?>" /></p> <p>Telefone<br/><input type="text" name="fone" value="<?= $pessoa['fone'] ?>" /></p> <p>E-Mail<br/><input type="text" name="email" value="<?= $pessoa['email'] ?>" /></p>
  • 19.
    CRUD - pessoa_edita.php <?php include_once('db_conecta.php'); $result= mysql_query("SELECT * FROM pessoas where id='{$_GET['id']}'", $conexao) or die (" ERRO na consulta " . mysql_error()); $pessoa = mysql_fetch_array($result); if (strlen(trim($_POST['nome'])) > 0) { mysql_query("update pessoas set nome='{$_POST['nome']}', fone='{$_POST['fone']}', email='{$_POST['email']}' where id='{$_GET['id']}'") or die('Problema ao realizar operação: ' . mysql_error()); header("Location: pessoas_lista.php"); } ?> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <title>IFPI-PHB</title> </head> <body> <h1>Pessoas - Edita</h1> <form action="pessoa_edita.php?id=<?= $_GET['id'] ?>" method="post"> <?php include_once('pessoa_form.php'); ?> <p><input type="submit" value="Atualiza" /></p> </form> <p><a href="pessoas_lista.php">Volta</a></p> </body> </html>
  • 20.
  • 21.
    Conexão com MySQL Usar UNIX socket é mais eficiente que usar a camada TCP/IP.  Para a extensão mysql usar UNIX socket basta que esse recurso esteja disponível e que o nome do host seja localhost:  Também é possível definir o acesso via UNIX Socket explicitamente: mysql_connect('localhost','root', ''); mysql_connect('localhost:/var/run/mysqld/mysqld.sock', 'root', '');
  • 22.
    Conexão com MySQL mysql_pconnect  Abre uma conexão persistente com um servidor MySQL.  Ao conectar, a função tenta encontrar uma conexão que já esteja aberta.  Se uma for encontrada, será usada ao invés de abrir uma nova conexão.  A conexão não será fechada quando a execução do script terminar.  Ela permanecerá aberta para uso futuro  mysql_close() não irá fechar conexões estabelecidas por mysql_pconnect().
  • 23.
    Obtendo informações <?php $link =mysql_pconnect('localhost', 'root', ''); if (!$link) { die('Falha na conexão: ' . mysql_error()); } echo('Servidor: ' . mysql_get_host_info() . '<br/>'); echo('Cliente : ' . mysql_get_client_info() . '<br/>'); ?>
  • 24.
    Prepared Statements  Vantagens: Velocidade  É um meio eficiente de executar um comando mais de uma vez. O comando é analisado e preparado para execução no próprio banco de dados.  Segurança  Reduz a possibilidade de SQL Injection.  Não está disponível na biblioteca mysql.
  • 25.
    Prepared Statements commysqli <?php $con = mysqli_connect("localhost", "my_user", "my_password", "my_db"); if (mysqli_connect_errno()) { echo("A conexão falhou: " . mysqli_connect_error()); exit(); } $cidade = "Parnaíba"; if ($stmt = mysqli_prepare($con, "SELECT bairro, cep FROM cidade WHERE nome =?")) { mysqli_stmt_bind_param($stmt, "s", $cidade); mysqli_stmt_execute($stmt); mysqli_stmt_bind_result($stmt, $bairro, $cep); while (mysqli_stmt_fetch($stmt)) { echo("$cidade fica no bairro $bairro e cep $cep"); } mysqli_stmt_close($stmt); } mysqli_close($con); ?>
  • 26.
    mysqli_stmt_bind_param  bool mysqli_stmt_bind_param( mysqli_stmt $stmt , string $types , mixed &$var1 [, mixed &$... ] )  type  i - corresponde a uma variável de tipo inteiro  d - corresponde a uma variável de tipo double  s - corresponde a uma variável de tipo string  b - corresponde a uma variável que contém dados para um blob e enviará em pacotes
  • 27.
    mysqli_stmt_bind_param ... $stmt = mysqli_prepare($link,"INSERT INTO lang VALUES (?, ?, ?, ?)"); mysqli_stmt_bind_param($stmt, 'sssd', $code, $lang, $official, $perc); ...