Jump to content
Profilmes

Dúvida - de Mysql para PDO

Recommended Posts

Olá galera, 

 

Preciso de ajuda com alguém que saiba atualizar dados mysql para PDO,

andei pesquisando sobre a situação do meu projeto e descobri que, o meu problema é com a antiguidade do Mysql no php

 

The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in

 

se alguém se depuser atualizar meu projeto ficaria muito grato. de momento não posso ajudar financeiramente, mas, pretendo guardar um dinheiro no próximo pagamento.

de coração mesmo

 

O projeto é super pequeno. tem 27KB 

 

jamison_1994@hotmail.com

whatsapp 11958215688

Share this post


Link to post
Share on other sites

Opa, porque você não tenta migrar? Caso ter dúvidas, vai perguntando aqui no fórum que o pessoal vai ajudar. É bem simples, e assim você aprende também pra dar manutenção se surgir algo.

 

Sugiro até migrar o pro mysqli primeiro, pra depois ir pra PDO.

Share this post


Link to post
Share on other sites
Em 25/09/2019 at 02:42, Profilmes disse:

Olá galera, 

 

Preciso de ajuda com alguém que saiba atualizar dados mysql para PDO,

andei pesquisando sobre a situação do meu projeto e descobri que, o meu problema é com a antiguidade do Mysql no php

 

The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in

 

se alguém se depuser atualizar meu projeto ficaria muito grato. de momento não posso ajudar financeiramente, mas, pretendo guardar um dinheiro no próximo pagamento.

de coração mesmo

 

O projeto é super pequeno. tem 27KB 

 

jamison_1994@hotmail.com

whatsapp 11958215688

@Profilmes Vou dar uma base de como fazer do MYSQL para PDO

Mais como o @marcosmarcolin disse seria bom migra para o MYSQLI para depois para o PDO. Assim fica até mais facil para você entender melhor...

Mais vou dar uma base aqui vamos lá....

Bom eu vejo muitos códigos publicados no SO implementando funções my_sql . E comentários de outras pessoas (inclusive eu) pressionando os questionadores a abandonar as funções do MySQL e começar a usar o PDO ou o MySQLI. Este post está aqui para ajudar. Você pode consultá-lo, pois fornece uma explicação de por que eles foram descontinuados e o que é PDO , além de um exemplo de código mínimo para implementar o PDO.

Em primeiro lugar:

A conversão de funções mysql para PDO não é um caso simples de pesquisa e substituição. O PDO é um complemento da Programação Orientada a Objetos para a linguagem PHP. Isso significa uma outra abordagem ao escrever o código, como nas funções mysql . Primeiro por que converter?

 

Por que as funções do mysql estão obsoletas?
A extensão mysql é antiga e existe desde o PHP 2.0, lançada há 15 anos (!!); que é uma fera decididamente diferente do PHP moderno, que tenta se livrar das más práticas de seu passado. A extensão mysql é um conector muito simples e de baixo nível para o MySQL, que carece de muitos recursos de conveniência e, portanto, é difícil de aplicar corretamente de maneira segura; portanto, é ruim para os noobs. Muitos desenvolvedores não entendem a injeção de SQL e a API do mysql é frágil o suficiente para dificultar a prevenção, mesmo que você esteja ciente disso. Está cheio de estado global (passagem implícita de conexão, por exemplo), o que facilita a gravação de códigos difíceis de manter. Como é antigo, pode ser excessivamente difícil de manter no nível principal do PHP.

A extensão mysqli é muito mais recente e corrige todos os problemas acima. O  PDO também é bastante nova e resolve todos esses problemas, além de mais.

Devido a estas razões * a extensão mysql será removida em algum momento no futuro.

 

Como implementar o PDO
O PDO oferece uma solução para conectar-se a vários bancos de dados. Esta resposta cobre apenas servidores MySQL e MSSQL .

Conectando-se a um banco de dados MySQL , pré-requisitos

Isso é bastante simples e não requer nenhuma configuração prévia do PHP. Instalações PHP modernas são fornecidas com um módulo que permite conexões PDO com servidores MySQL.

O módulo é php_pdo_mysql.dll

Conectando-se a um banco de dados MSSQL , pré-requisitos

 

Esta é uma configuração mais avançada. Você precisa php_pdo_sqlsrv_##_ts.dll ou php_pdo_sqlsrv_##_nts.dll drivers. Eles são específicos da versão.

O módulo é php_pdo_sqlsrv_##_ts.dll para a variante segura de rosca O módulo é php_pdo_sqlsrv_##_nts.dll para a variante segura de rosca

Conectando-se a um Banco de Dados Utilizando o PDO

Para conectar-se a um banco de dados, é necessário criar uma nova instância do PDO a partir da construção do PDO .

$connection = new PDO(arguments);

O construtor PDO recebe 3 argumentos necessários e 1 opcional.

1. Nome da fonte de dados ou DSN , principalmente, é uma sequência que contém informações sobre o driver, host e nome do banco de dados.
2. Nome de usuário
3. Senha
4. Opções

 

Conectando ao MySQL

 

$dsn = 'mysql:dbname=databasename;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

$dbh = new PDO($dsn, $user, $password);

Vamos dar uma olhada $dsn: Primeiro, ele define o driver ( mysql). Em seguida, o nome do banco de dados e, finalmente, o host.
Conectando ao MSSQL

$dsn = 'sqlsrv:Server=127.0.0.1;Database=databasename';
$user = 'dbuser';
$password = 'dbpass';

$dbh = new PDO($dsn, $user, $password);

 

Vamos dar uma olhada $dsn: Primeiro, ele define o driver ( sqlsrv). Em seguida, o host e, finalmente, o nome do banco de dados.

Quando você cria a instância, é feita uma conexão com o banco de dados. Você só precisa fazer isso uma vez durante a execução de um script PHP.

Você precisa agrupar a criação da instância do PDO em uma cláusula try-catch . Se a criação falhar, um rastreamento posterior será mostrado, revelando informações críticas sobre seu aplicativo, como nome de usuário e senha. Para evitar isso, pegue os erros.
try 
{
    $connection = new PDO($dsn, $user, $password);
}
catch( PDOException $Exception ) 
{   
     echo "Não é possível se conectar ao banco de dados.";
     exit;
}
Para lançar erros retornados pelo servidor SQL, adicione essas opções à sua instância do PDO usando setAttribute: $connection->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

Executando consultas
O PDO usa declarações preparadas . Essa é uma diferença real entre a abordagem do PDO e as funções mysql . Este último era muito suscetível à INJEÇÃO SQL . Alguém poderia criar uma consulta como esta:

$SQL = 'SELECT ID FROM users WHERE user = '.$username ;

Quando um site ou pessoa mal-intencionado publica o nome de usuário injector; DROP TABLE users. Os resultados serão devastadores. Você precisava revisar seu código escapando e encapsulando seqüências e variáveis com aspas. Isso tinha que ser feito para todas as consultas. Em sites maiores ou código mal mantido, o risco de ter um formulário que permita a injeção de SQL pode se tornar muito alto. As instruções preparadas eliminam a chance de injeção de SQL de primeira camada, como no exemplo acima.

Os drivers PDO agem como um intermediário entre o servidor PHP e o servidor de banco de dados, chamado camada de abstração de acesso a dados . Ele não reescreve suas consultas SQL, mas oferece uma maneira genérica de conectar-se a vários tipos de banco de dados e manipula a inserção de variáveis na consulta para você. As funções do Mysql construíram a consulta na execução do código PHP. Com o PDO, a consulta realmente é criada no servidor de banco de dados.

Um exemplo SQL preparado:

 

$SQL = 'SELECT ID, EMAIL FROM users WHERE user = :username';

Observe a diferença; Em vez de uma variável PHP usando $ fora da string, apresentamos uma variável usando : dentro da string. Outra maneira é

$SQL = 'SELECT ID, EMAIL FROM users WHERE user = ?';

 

Como executar a consulta real

Sua instância do PDO fornece dois métodos para executar uma consulta. Quando você não tem variáveis, pode usar query(), com variáveis use prepare(). query() é executado imediatamente após a chamada.

Observe a maneira orientada a objetos da chamada ( ->).

$result = $connection->query($SQL);

O método de preparação

O método de preparação usa dois argumentos. A primeira é a string SQL e a segunda são opções na forma de uma matriz. Um exemplo básico

$connection->prepare($SQL, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));

No nosso exemplo de string SQL, usamos uma variável nomeada chamada :username. Ainda precisamos vincular uma variável, número inteiro ou string do PHP. Podemos fazer isso de duas maneiras. Crie uma matriz que contenha as variáveis nomeadas como keyou use o método bindParamou bindValue. Vou explicar a variante da matriz e o método bindValuepor uma questão de simplicidade.

Array
Você pode fazer algo assim para variáveis nomeadas, onde você fornece a variável como chave de matriz :

 

$queryArguments = Array(':username' => $username);

E isso para variáveis indexadas ( ?):

 

$queryArguments = Array($username);

Quando você tiver adicionado todas as variáveis necessárias, poderá recorrer ao método execute()para executar a consulta. Passando assim a matriz como argumento para a função execute.

$result = $connection->execute($queryArguments);

bindValue
O método bindValue permite vincular valores à instância do PDO . O método usa dois argumentos obrigatórios e um opcional. Os argumentos opcionais configuram o tipo de dados do valor.

Para variáveis nomeadas:

$connection->bindValue(':username', $username);

Para variáveis indexadas:

$connection->bindValue(1, $username);

Depois de vincular os valores à instância, você pode chamar execute sem passar nenhum argumento.

$result = $connection->execute();
NOTA: Você pode usar apenas uma variável nomeada uma vez! Usá-los duas vezes resultará em falha na execução da consulta. Dependendo das suas configurações, isso gera ou não um erro.

Buscando os resultados
Mais uma vez, abordarei apenas o básico para buscar resultados do conjunto retornado. O PDO é um complemento bastante avançado.

Usando fetche fetchAll

Se você fez uma consulta de seleção ou executou um procedimento armazenado que retornou um conjunto de resultados:

fetch
fetch é um método que pode levar até três argumentos opcionais. Ele busca uma única linha do conjunto de resultados. Por padrão, ele retorna uma matriz que contém os nomes das colunas como chaves e resultados indexados. Nosso exemplo de consulta pode retornar algo como

ID      EMAIL
1       someone@example.com

fetch retornará isso como:

Array
(
    [ID] => 1
    [0] => 1
    [EMAIL] => someone@example.com
    [1] => someone@example.com
)

Para ecoar toda a saída de um conjunto de resultados:

while($row = $result->fetch())
{
    echo $row['ID'];
    echo $row['EMAIL'];
}

Existem outras opções que você pode encontrar aqui: fetch_style ;

fetchAll
Busca todas as linhas em um objeto Array. Usando a mesma opção padrão que fetch.

$rows = $result->fetchAll();

Se você usou uma consulta que não retornou resultados como uma consulta de inserção ou atualização, pode usar o método rowCountpara recuperar a quantidade de linhas afetadas.

Uma classe simples:

class pdoConnection
{
    public $isConnected;
    protected $connection;
    public function __construct($dsn, $username, $password, $host, $dbname, $options=array())
    {
        $this->isConnected = true;
        try { 
            $this->connection = new PDO($dsn, $username, $password, $options); 
            $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->connection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); //sets the default to return 'named' properties in array.
        } 
        catch(PDOException $e) { 
            $this->isConnected = false;
            throw new Exception($e->getMessage());
        }
    }

    public function Disconnect(){
        $this->connection = null;
        $this->isConnected = false;
    }

    public function query($SQL)
    {
        try
        { 
            $result = $this->connection->query($SQL); 
            return $result;  
        }
        catch(PDOException $e)
        {
            throw new Exception($e->getMessage());
        }
    }
    public function prepare($SQL, $params=array())
    {
        try
        { 
            $result = $this->connection->prepare($SQL); 
            $result->execute($params);
            return $result;     
        }
        catch(PDOException $e)
        {
            throw new Exception($e->getMessage());
        }       
    }
}

Como usar:

$dsn = 'mysql:dbname=databasename;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

$db = new pdoConnection($dsn, $user, $password);

$SQL = 'SELECT ID, EMAIL FROM users WHERE user = :username';
$result = $db->prepare($SQL, array(":username" => 'someone'));

while($row = $result->fetch())
{
    echo $row['ID'];
    echo $row['EMAIL'];
}  

Bom é isso ai

qualquer vai perguntando aqui no fórum que os pessoal pode lhe ajudar mais...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By granderodeo
      Estou tentando pegar dados de duas tabelas logo no inicio da sessão quando o usuário realiza o login, quando utilizo o 
      SELECT * FROM usuarios, orders WHERE email = '$login' and senha= '$senha' Consigo realizar o login tranquilamente, até ai de boa, mais quando modifico o código para
       
      $comando="SELECT * FROM usuarios INNER JOIN orders ON usuarios.id_usuario = orders.id_usuario WHERE email.usuarios='$login' and senha.usuarios='$senha'"; Ele só me deixa fazer login se o usuário já tiver algum orders (pedido). O que estou tentando fazer é assim que o usuário loga, mostre também os pedidos que ele já fez etc, que são dados que estão em outra tabela. Alguém consegue ver meu erro?
    • By fsanchez
      Pessoal, o que estou fazendo de errado?
       
      estou tentando gerar um numero sequencial concatenando string e int, porem quando chega no numero 10 ele fica no 10 e nao soma +1.
       
       
      PED-2019/1
      ....
      PED-2019/10
       
      ....chega aqui ele deveria gerar 
       
      PED-2019/11..12..13
       
      consulta:
       
      select concat('PED-',YEAR(NOW()),'/',cast(SUBSTRING_INDEX(PED_Codigo,'/',-1) as UNSIGNED)+1) as NUM_PED from tbs_pedido order by PED_Codigo desc limit 1  
    • By rogerblower
      Pessoal tenho a seguinte tabela
      id | id_etapa | id_evento | posicao | nome | pontos
      1  |  1             |        2         |   1           | joao      |  10
      2  |  1             |        2         |   2           | pedro    |  9
      3  |  1             |        2         |   3           | maria    |  8
      4  |  1             |       2          |   4           | jose       |  7
      5  |  2             |      2          |   3           | joao       |  8
      6  |  2             |  2              |   1           | pedro    | 10
      7  |  2             |   2             |  2            | maria    |  9
      8  |  2             |  2              |   4          | jose        |  7
       
      O resultado da consulta pretendido é este
      Pos  |  nome |   pontos
      1      |  pedro   | 19
      2      |   joao   | 18
      3      |  maria  |  17
      4      |  jose  |  14
       
      Com esta consulta não ordenando a coluna posicao como esperado, ela repete a posicao e não faz a soma, ex:
       1     joao     10
       1     pedro     10
      $pontuacaoa = $pdo->prepare("SELECT * FROM contador WHERE id_evento = '$id_evento' GROUP BY nome, posicao ORDER BY pontos DESC posicao ASC"); Com esta outra consulta a soma esta correta o agrupamento nome esta correto, não se repetem, mas a coluna posicao fica fora de ordem;
       
      $pontuacaoa = $pdo->prepare("SELECT * FROM contador WHERE id_evento = '$id_evento' GROUP BY nome ORDER BY pontos DESC posicao ASC"); Não estou conseguindo acertar a consulta, alguém me ajuda?
    • By ndias
      Estou com duvida se minha conexão está encerrando.
       
      Utilizo PDO para me conectar:
       
      public static function getDb(){ try { $db = new \PDO( 'mysql:host=localhost;dbname=xyz;charset=utf8', 'xyz', 'xyz1234', array( \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION ) ); return $db; } catch (PDOException $e) { echo "Erro de Conexão " . $e->getMessage() . "\n"; exit; } } public function __construct(\PDO $db) { $this->db = $db; } public function verifica(){ $sql = "SELECT * FROM tabela "; $result = $this->db->query($sql); $rows = $result->fetch(); if($rows){ }else{ } } public function __destruct() { unset($this->db); foreach ($this as $key => $value) { unset($this->$key); } } Estou fazendo certo? Como posso verificar se a conexão está ficando aberta?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.