<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PDO &#8211; Turbosite &#8211; Blog</title>
	<atom:link href="https://www.turbosite.com.br/blog/tag/pdo/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.turbosite.com.br/blog</link>
	<description></description>
	<lastBuildDate>Tue, 25 Nov 2014 12:34:07 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://www.turbosite.com.br/blog/wp-content/uploads/2026/09/cropped-logo_turbo_vermelha-32x32.png</url>
	<title>PDO &#8211; Turbosite &#8211; Blog</title>
	<link>https://www.turbosite.com.br/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>PDO ou MySQLi, qual usar?</title>
		<link>https://www.turbosite.com.br/blog/pdo-ou-mysqli-qual-usar/</link>
		
		<dc:creator><![CDATA[turboajuda]]></dc:creator>
		<pubDate>Tue, 25 Nov 2014 12:34:07 +0000</pubDate>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[MySQLi]]></category>
		<category><![CDATA[PDO]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">http://blog.turbosite.com.br/?p=3818</guid>

					<description><![CDATA[A extensão original MySQL do PHP está obsoleta, deixando como escolha o MySQLi e PDO MySQL. Porém, qual das duas é a melhor escolha? Explicaremos nesse artigo.]]></description>
										<content:encoded><![CDATA[<p>A <strong>PHP</strong> já anunciou o descontinuamento da extensão original do <strong>MySQL</strong>, nomeando-a como <a href="http://php.net/manual/en/migration55.deprecated.php">obsoleta</a> e já com planos para desligá-la completamente em versões futuras. A partir da versão <strong>PHP 5.5</strong>, tentativas de conexão e execução de querys com a antiga ferramenta irá gerar mensagens de alerta, denunciando que o método está obsoleto. A antiga forma de conexão com o MySQL  já está a caminho de deixar de existir.</p>
<p style="padding-left: 30px;"><span style="color: #ff0000;"><em>Deprecated: The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead</em></span></p>
<p>Querendo ou não, o desligamento da antiga ferramenta MySQL é inevitável. Sem dúvida, o trabalho para conseguir migrar todas as funções de conexão com o MySQL para uma outra ferramenta, em provavelmente grande parte de seus projetos, vai ser custosa e demorada. Porém, é muito provável que seus esforços serão recompensados. Em seu site, a PHP nos indica duas ferramentas de conexão com o MySQL: a MySQLi (Improved) e o PDO.</p>
<p style="padding-left: 30px;"><em>A <a href="http://php.net/manual/en/book.mysql.php">extensão original MySQL</a> está agora obsoleta e irá gerar erros <strong>E_DEPRECATED</strong> quando conectar à um banco de dados. Em seu lugar, use a extensão <a href="http://php.net/manual/en/book.mysqli.php">MySQLi</a> ou <a href="http://php.net/manual/en/ref.pdo-mysql.php">PDO MySQL</a>.</em></p>
<p>A equipe da <a href="https://www.turbosite.com.br/">Turbosite</a> retirou do blog <a href="http://code.tutsplus.com/pt/tutorials/pdo-vs-mysqli-which-should-you-use--net-24059">Code</a> um artigo que explica em detalhes o funcionamento e as diferenças de cada ferramenta. Detalhando código para conexão, querys, detalhes de segurança e desempenho. Abaixo você confere as diferenças entre essas duas ferramentas.</p>
<p>&nbsp;</p>
<h2>Comparativo</h2>
<table>
<thead>
<tr>
<th></th>
<th>PDO</th>
<th>MySQLi</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Suporte a Bancos de Dados</strong></td>
<td>12 drivers diferentes</td>
<td>Somente MySQL</td>
</tr>
<tr>
<td><strong>API</strong></td>
<td>Orientada a Objetos</td>
<td>Orientada a Objetos + Procedural</td>
</tr>
<tr>
<td><strong>Conexão</strong></td>
<td>Fácil</td>
<td>Fácil</td>
</tr>
<tr>
<td><strong>Parâmetros Nomeados</strong></td>
<td>Sim</td>
<td>Não</td>
</tr>
<tr>
<td><strong>Mapeamento de Objetos</strong></td>
<td>Sim</td>
<td>Sim</td>
</tr>
<tr>
<td><strong>Sentenças Preparadas (lado do cliente)</strong></td>
<td>Sim</td>
<td>Não</td>
</tr>
<tr>
<td><strong>Performance</strong></td>
<td>Rápido</td>
<td>Rápido</td>
</tr>
<tr>
<td><strong>Procedimentos Armazenados</strong></td>
<td>Sim</td>
<td>Sim</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<h2 class="nolinks">Conexão</h2>
<p>Criar uma conexão com uma base de dados é fácil em ambas as ferramentas:</p>
<pre class="lang:php decode:true ">// PDO
$pdo = new PDO("mysql:host=servidor;dbname=banco_de_dados", 'usuario', 'senha');
  
// MySQLi, forma procedural
$mysqli = mysqli_connect('servidor', 'usuario', 'senha', 'banco_de_dados');
  
// MySQLi, forma via orientação a objetos
$mysqli = new mysqli('servidor', 'usuario', 'senha', 'banco_de_dados');
</pre>
<p>&nbsp;</p>
<h2 class="nolinks">Suporte de API</h2>
<p>Tanto PDO quanto MySQli oferecem um API orientada a objetos, mas o MySQLi também oferece uma API procedural &#8211; facilitando o entendimento por parte dos novatos. Se você já é familiarizado com o driver nativo do MySQL para PHP, migrar para a interface procedural do MySQLi será extremamente simples. Por outro lado, uma vez que você compreender a PDO, você poderá usá-la com qualquer banco de dados que desejar!</p>
<p>&nbsp;</p>
<h2 class="nolinks">Suporte a Bancos de Dados</h2>
<p><img fetchpriority="high" decoding="async" class="size-full wp-image-3819 alignnone" src="https://www.turbosite.com.br/blog/wp-content/uploads/2014/11/tutorial_3.png" alt="tutorial_3" width="640" height="320" srcset="https://www.turbosite.com.br/blog/wp-content/uploads/2014/11/tutorial_3.png 640w, https://www.turbosite.com.br/blog/wp-content/uploads/2014/11/tutorial_3-300x150.png 300w" sizes="(max-width: 640px) 100vw, 640px" /></p>
<p>&nbsp;</p>
<p>A principal vantagem do PDO sobre o MySQLi é seu suporte aos drivers de diversos bancos de dados. No momento em que traduzimos esse artigo, o <strong>PDO dá suporte a 12 tipos diferentes de drivers</strong>, enquanto o MySQLi só dá <strong>suporte ao MySQL</strong>.</p>
<p>Caso queira saber quais os drivers que o PDO dá suporte no momento, use o código a seguir:</p>
<pre class="lang:php decode:true ">var_dump(PDO::getAvailableDrivers());</pre>
<p>O que isso significa? Bem, em situações que você precisar usar outro banco de dados, a PDO torna esse processo transparente. Então, <em>a única coisa que você precisará fazer</em> é mudar os parâmetros de conexão e algumas consultas, isso se elas usarem algum método que não seja suportado por outra base de dados. Já com o MySQLi, você precisará <em>reescrever todo o código que lida com banco de dados, </em> inclusive as consultas.</p>
<p>&nbsp;</p>
<h2 class="nolinks">Parâmetros Nomeados</h2>
<p>Essa é outra característica importante que o PDO tem. Vincular parâmetros com PDO é muito mais fácil usando a vinculação nomeada:</p>
<pre class="lang:php decode:true ">$params = [':usuario' =&gt; 'teste', ':email' =&gt; $email =&gt; ':ultimo_login' =&gt; time() - 3600];
  
$pdo-&gt;prepare('SELECT * FROM users WHERE username = :usuario AND email = :email AND las_login = :ultimo_login');
  
$pdo-&gt;execute($params);</pre>
<p>Ao contrário da maneira do MySQLi:</p>
<pre class="lang:php decode:true">$query = $mysqli-&gt;prepare('SELECT * FROM users WHERE username = ? AND email = ? AND lasT_login = ?');
  
$query-&gt;bind_param('teste', $mail, time() - 3600);
$query-&gt;execute();</pre>
<p>A vinculação dos parâmetros na forma de interrogação pode parecer menor, mas, nem de longe, é tão flexível quanto aos parâmetros nomeados, devido ao fato do desenvolvedor ser obrigado a saber a ordem dos parâmetros. Ela parece um <em>hack</em> feito para permitir vinculação de parâmetros em algumas circunstâncias.</p>
<p>Infelizmente, <strong>MySQLi não dá suporte a parâmetros nomeados</strong>.</p>
<p>&nbsp;</p>
<h2 class="nolinks">Mapeamento de Objetos</h2>
<p>Tanto PDO quanto MySQLi podem mapear resultados em objetos. Isso vem bem a calhar se você não quer usar uma camada de abstração de banco de dados customizada, mas ainda quer um comportamento semelhante ao de um <em>ORM</em>. Vamos imaginar que nós temos uma classe <code>User</code> com algumas propriedades nomeadas de forma idêntica aos campos da tabela do Banco de Dados:</p>
<pre class="lang:php decode:true  ">class User {
public $id;
public $first_name;
public $last_name;
  
public function info()
{
return "#" . $this-&gt;id . ": " . $this-&gt;first_name . " " . $this-&gt;last_name;
}
}</pre>
<p>Sem o mapeamento de objetos, nós precisaríamos preencher cada um dos campos (fosse manualmente ou através de um método construtor), anes de podermos usar o método <code>info()</code> corretamente.</p>
<p>Isso permite que nós predefinamos as propriedades antes mesmo do objeto ser construído! Por exemplo</p>
<pre class="lang:php decode:true">$query = "SELECT id, first_name, last_name FROM users";
  
// PDO
$result = $pdo-&gt;query($query);
$result-&gt;setFetchMode(PDO::FETCH_CLASS, 'User');
  
while ($user = $result-&gt;fetch()) {
echo $user-&gt;info() . "\n";
}
  
// MySQLi, forma procedural
if ($result = mysqli_query($mysqli, $query)) {
while ($user = mysqli_fetch_object($result, 'User')) {
echo $user-&gt;info() . "\n";
}
}
  
// MySQLi, forma orientada a objetos
if ($result = $mysqli-&gt;query($query)) {
while ($user = $result-&gt;fetch_object('User')) {
echo $user-&gt;info() . "\n";
}
}</pre>
<p>&nbsp;</p>
<h2 class="nolinks">Segurança</h2>
<p><img decoding="async" class="size-full wp-image-3820 alignnone" src="https://www.turbosite.com.br/blog/wp-content/uploads/2014/11/tutorial_1.png" alt="tutorial_1" width="640" height="320" srcset="https://www.turbosite.com.br/blog/wp-content/uploads/2014/11/tutorial_1.png 640w, https://www.turbosite.com.br/blog/wp-content/uploads/2014/11/tutorial_1-300x150.png 300w" sizes="(max-width: 640px) 100vw, 640px" /></p>
<p>&nbsp;</p>
<p>Ambas as bibliotecas proveem <strong>segurança contra injeção de SQL, desde que o desenvolvedor as use da maneira que elas foram planejadas para usar. </strong>Digamos que um <em>hacker</em> esteja tentando injetar algum código malicioso através de um parâmetro &#8216;username&#8217; de uma requisição HTTP GET:</p>
<pre class="lang:php decode:true">$_GET['username'] = "'; DELETE FROM users; /*"</pre>
<p>&nbsp;</p>
<p>Se nós falharmos em limpá-lo, ele será incluído na consulta exatamente como está  e deletará todas linhas da tabela <code>users</code> (tanto PDO quanto MySQLi suporta múltiplas consultas).</p>
<pre class="lang:php decode:true ">// PDO, limpeza manual
$username = PDO::quote($_GET['username']);
  
$pdo-&gt;query("SELECT * FROM users WHERE username = $username");
  
// MySQLi, limpeza manual
$username = mysqli_real_escape_string($_GET['username']);
  
$mysqli-&gt;query("SELECT * FROM users WHERE username = '$username'");</pre>
<p>&nbsp;</p>
<p>Como podem ver, <code>PDO::quote()</code> <strong>não só valida, mas fixa as aspas</strong>. Por outro lado, <code>mysqli_real_escape_string()</code> só limpará, forçando você a fixar as aspas manualmente.</p>
<pre class="lang:php decode:true">// PDO com sentenças preparadas
$pdo-&gt;prepare('SELECT * FROM users WHERE username = :username');
$pdo-&gt;execute([':username' =&gt; $_GET['username']]);
  
// MySQLi, sentenças preparadas
$query = $mysqli-&gt;prepare('SELECT * FROM users WHERE username = ?');
$query-&gt;bind_param('s', $_GET['username']);
$query-&gt;execute();</pre>
<p>&nbsp;</p>
<p>Recomendamos que você sempre use sentenças preparadas com consultas vinculadas ao invés da <code>PDO::quote()</code> e da <code>mysqli_real_scape_string()</code>.</p>
<p>&nbsp;</p>
<h2 class="nolinks">Performance</h2>
<p>Tanto PDO quanto MySQLi são bem rápidas, porém, MySQLi se sai mais rápida nos comparativos; ~2,5% para sentenças não preparadas e ~6,5% para as sentenças preparadas. Porém, a extensão nativa do MySQL é ainda mais rápida que ambas. Mas, como afirmei no começo, ela não é mais uma opção.</p>
<p>&nbsp;</p>
<h2 class="nolinks">Conclusão</h2>
<p>PDO possuí suporte a 12 drivers de bases de dados diferentes e parâmetros nomeados. MySQLi ganha em desempenho, comparado com o PDO  e possui uma sintaxe mais simples, facilitando a migração a partir do antigo MySQL. Com relação à segurança, ambas são seguras, desde que o desenvolvedor saiba usá-las da forma correta.</p>
<p>Em especial, deixaremos a conclusão desse artigo para o leitor. Caso você esteja procurando desempenho em suas querys e não quer esquentar a cabeça para aprender uma nova ferramenta de conexão com o banco de dados, talvez o <a href="http://php.net/manual/pt_BR/book.mysqli.php">MySQLi </a>seja sua melhor escolha. Caso você esteja procurando uma ferramenta mais completa e robusta, o <a href="http://php.net/manual/pt_BR/ref.pdo-mysql.php">PDO MySQL</a> seria a melhor escolha.</p>
<p>Deixe-nos sua resposta, faça um comentário abaixo falando qual ferramenta você escolheu o por quê.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
