Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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...

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por douglas79
      Bom dia,

      Há alguns dias que venho instalar o apache, o php, mysql e o phpmyadmin manualmente e sem obter sucesso. Até consegui rodar o php, porém, quando vou baixar a úitima versão do MYSQL, não tem todos os pacotes nele instalados, inclusive no completo, só encontro o Router.
      Alguém pode me dizer o porquê que isso está ocorrendo?
      Desde já agradeço a ajuda de vocês, que será bem vinda!
      No aguardo!

      Uso a versão 8.3.9 do PHP
      Meu SO é o Windows 10 32 bits
    • Por landerbadi
      Tenho uma tabela chamada "item" com os seguintes campos: id, name, active. Nela tem cadastrado vários itens. No campo "active" eu coloco a letra "S" para informar que este item está ativo no sistema. Por exemplo: 1, casa, S 2, mesa, S 3, cama, S 4, moto S 5, rádio O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo active. E outra tabela chamada "product" com os seguintes campos (id, name) com os seguintes registros: 1, Produto A 2, Produto B 3, Produto C E uma terceira tabela chamada "product_item" com os seguintes campos (productID, itemID). No campo productID eu coloco o id de um produto da tabela "product" e no campo "itemID" eu coloco o id do produto da tabela "item". Exemplo: 1, 1 1, 3 1, 4 2, 3 2, 4 Sendo assim o produto A da tabela 'product" comtem os itens casa, cama e moto. Eu preciso fazer uma busca da seguinte maneira:  Eu escolho um registro da tabela "item", por exemplo "casa". Preciso fazer com que o php me liste todos os registros da tabela "product" que contenham a palavra "casa" e que os demais itens estejam ativos no siste. Ou seja, que contenham um "S" no campo "active"  Eu consegui fazer isso da seguinte maneira: SELECT P.id, P.name, GROUP_CONCAT(I.name ORDER BY I.name) AS items FROM product P JOIN product_item PI ON P.id = PI.productID JOIN item I ON I.id = PI.itemID AND I.active = 'S' WHERE P.id NOT IN ( SELECT PI.productID FROM product_item PI JOIN item I ON I.id = PI.itemID WHERE I.active IS NULL ) AND P.id IN ( SELECT PI.productID FROM product_item PI JOIN item I ON I.id = PI.itemID WHERE I.name = 'mesa' ) GROUP BY P.id, P.name; O problema que eu estou tendo é o seguinte:
      Quando eu jogo este código para o banco de dados onde eu já tenho os registros cadastrado o php fica lendo uma eternidade e não lista os produtos.
       
      Usando código no banco de dados que eu fiz para testes ele funciona perfeitamente pois nele tem poucos registros.
       
      No banco de dados principal a tabela "item" tem 11.196 registros. A tabela "product" tem 88.214 registros e a tabela "product_item" tem 518.378 registros. 
       
      Eu acredito que, devido o banco de dados ser muito grande, ele não consegue listar.
       
      Alguém sabe de algum meio de resolver isso?
       
       
    • Por landerbadi
      Boa tarde pessoal. Estou tentado fazer uma consulta no banco de dados porém estou tendo dificuldades. Tenho uma tabela chamada "itens" com os seguintes campos: id, item, ativo. Nela tem cadastrado vários itens. No campo ativo eu coloco a letra "S" para informar que este item está ativo no sistema. Por exemplo: 1, casa, S 2, mesa, S 3, cama, S 4, moto S 5, rádio O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "produtos" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, mesa, moto 2, mesa, casa, cama 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela produtos da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "mesa". Preciso fazer com que o php me liste todos os registros da tabela "produtos" que contenham a palavra "mesa". Até aqui tudo bem eu consigo listar. Estou fazendo assim: <?php $item = "mesa" $sql = mysqli_query($conn, "SELECT * FROM produtos WHERE item1 LIKE '$item' OR item2 LIKE '$item' OR item3 LIKE '$item' LIMIT 10"); while($aux = mysqli_fetch_assoc($sql)) { $id = $aux["id"]; $item1 = $aux["item1"]; $item2 = $aux["item2"]; $item3 = $aux["item3"]; echo $id . " - " . $item1 . ", " . $item2 . ", " $item3 . "<br>"; } ?> O problema é que está listando todos os registros que contém o item mesa. Eu preciso que o php verifique os demais item e me liste somente os registro em que todos os registros estejam ativos no sistema. No exemplo acima ele não deveria listar o registro 3. pois nesse registro contém o item "radio" e este item não está ativo no sistema. Ou seja, o registro "radio" na tabela itens não possui um "S" na coluna "ativo". Alguém sabe como resolver isso?
    • Por First
      Olá a todos!
       
      Eu estou criando um sistema do zero mas estou encontnrando algumas dificuldades e não estou sabendo resolver, então vim recorrer ajuda de vocês.
      Aqui está todo o meu código: https://github.com/PauloJagata/aprendizado/
       
      Eu fiz um sistema de rotas mas só mostra o conteúdo da '/' não sei porque, quando eu tento acessar o register nada muda.
      E eu também quero que se não estiver liberado na rota mostra o erro de 404, mas quando eu tento acessar um link inválido, nada acontece.
      Alguém pode me ajudar com isso? E se tiver algumas sugestão para melhoria do código também estou aceitando.
       
       
      Desde já, obrigado.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.