Ir para conteúdo
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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por ILR master
      Fala pessoal.
       
      Seguinte:
       
      Quero selecionar duas tabelas e mostrar com resultados intercalados. Abaixo segue um código explicando para vcs terem uma ideia.
       
      $consulta = "SELECT A.*, B.* FROM tabela1 A, tabela2 B'";
      $resultado = mysqli_query($conexao, $consulta) or die ("erro");
      while($busca = mysqli_fetch_array($resultado)){
       
      print $busca['cod_evento']; --> traz o código da tabela1 
      print $busca['titulo_evento']; -->  traz o titulo da tabela1
      print $busca['cod_noticia']; --> traz o código da tabela2
      print $busca['titulo_noticia']; --> traz o tituloda tabela2
       
      }
       
      Espero que entendam. Grato
       
    • Por gersonab
      Bom dia
      estou com uma dúvida de como proceder, tenho uma tabela de categoria e uma de subcategoria, a categoria pode ter várias subs, até ai tranquilo, quando faço update de uma sub altero normalmente a quantidade deste, até aí normal, porém me deparei com uma situação um pouco diferente, vou tentar ser o mais claro possível, de certa forma algumas subs são comuns só mudando o nome praticamente, aí eu preciso que ao efetuar o update em umas destas este ocorra nas demais, tipo:
       
      Se o id da sub for 5 , eu preciso fazer o mesmo update nos ids 6 e 7 ;
       
      Se o id da sub for 9 , eu preciso fazer o mesmo update no id 10
       
      se for 2 , fazer o update somente neste
       
      ainda não estou conseguindo ver uma lógica para isso, e ou uma nova coluna para cadastrar em comum nestes casos.
       
      qual seria a melhor opção
    • Por JoaoSilva75
      oi pessoal
       
      se eu entrar no link dos desenvolvedores php pesquisasar quem é programador e enviar uma mesma mensagem para uns 6 ou 8 membros do forum serei advertido   ou é spam ???????
       
      procuro um programador php para me fazer algo 
       
      mas não tem como postar aqui nessa sessão
       
    • Por clovis.sardinha
      Tenho uma consulta de autocomplete no bd que funciona no servidor local e não roda no servidor da web. 
      Ao enviar a consulta no servidor local  aparece no console :Fetch terminou o carregamento: GET ".../Cidade?cidade=sao%20paulo". A pesquisa é feita normalmente.
      Quando mando a mesma pesquisa para o servidor web(locaweb) aparece no console: Fetch terminou o carregamento: GET "..../Cidade?cidade=sao%2520paul".
      O número 25 aparece só no servidor web. Pelo que pesquisei 25 significa %, ou seja, está duplicando o caractere %. 
      Não consegui utilizar nenhuma função para evitar que isto ocorra. Alguém sabe se há alguma configuração no servidor web que possa ser alterada para evitar essa duplicação?
       
    • Por gersonab
      Boa tarde, estou quebrando a cabeça aqui para somar os dados agrupados de vários itens distintos de uma tabela e inserir em outra. tipo :
      $consulta31 = $pdo->query("SELECT SUM(valoror) AS val1, SUM(metros) AS metr, orc, idcatc, idmate FROM orcamencli WHERE orc=$orc GROUP BY idcatc, idmate"); $user331 = $consulta31->fetch(PDO::FETCH_ASSOC); $orcx = $user331['orc']; $idcatcx = $user331['idcatc']; $val1x = $user331['val1']; $metrx = $user331['metr']; $idmatex = $user331['idmate']; o resultado de cada item agrupado eu faria um outro calculo separado para inserir em outra tabela, tipo ...
      a tabela acima eu teria algo assim :
       
      orcx = 01 - 01 - 01 - 01 - 01 - 01 - 01 - 01 - 01
      idcatcx = 11 - 11 - 11 - 11 - 11 - 11 - 11 - 11 - 11
      val1x = 1,00 - 1,00 - 3,00 - 3,00 - 3,00 - 1,00 - 3,00 - 1,00 - 2,00
      metrx =  01 - 01 - 03 - 03 - 03 - 01 - 03 - 01 - 02
      idmatex =  11 - 11 - 21 - 21 - 21 - 31 - 31 - 31 - 31
       
      preciso inserir  na outra tabela o seguinte :
      orc = 01 - 01 - 01
      idcatc = 11 - 11 - 11
      val1 = 2,00 - 9,00 - 7,00 ( aqui não é só a soma dos valores , existe um outro cálculo )
      metr =  02 - 09 - 07
      idmate =  11 -  21 -  31
       
       a dúvida é --> como inserir estes valores separados de uma única vez em outra tabela.
×

Informação importante

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