Ir para conteúdo

POWERED BY:

Arquivado

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

Genneral

Ajuda para transformar código para PDO ou MySQLi

Recommended Posts

Prezados, boa noite!

Estou pegando um script velho que encontrei neste post fora deste forum e transformando-o para PDO para poder usar em um servidor com PHP 7, porém estou esbarrando logo no início. Segue abaixo o código original:

header( 'Cache-Control: no-cache' );
header( 'Content-type: application/xml; charset="utf-8"', true );

$con = mysql_connect( 'localhost', 'root', 'root' ) ;
mysql_select_db( 'cadastro', $con );

$cod_estados = mysql_real_escape_string( $_GET['cod_estados'] );

$cidades = array();

$sql = "SELECT cod_cidades, nome
		FROM cidades
		WHERE estados_cod_estados=$cod_estados
		ORDER BY nome";
$res = mysql_query( $sql );
while ( $row = mysql_fetch_assoc( $res ) ) {
	$cidades[] = array(
		'cod_cidades'	=> $row['cod_cidades'],
		'nome'			=> $row['nome'],
	);
}

echo( json_encode( $cidades ) );

Gostaria muito da ajuda de vocês para poder transcrevê-lo para PHP 7, estou tendo problemas logo onde começa na seguinte linha:

$cod_estados = mysql_real_escape_string( $_GET['cod_estados'] );

Quem tiver um tempinho para ajudar, agradeço. Estarei aqui para transcrevermos juntos!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite ! Seja bem vindo ao fórum. Recomendo a leitura das regras e dicas da área: ATENÇÃO: Orientações e Regras do Fórum de PHP

Quanto ao seu problema, veja os seguintes artigos abaixo:

MySQL obsoleto? Entenda Exatamente o Que Fazer
Como Atualizar Scripts PHP de MySQL Para MySQLi

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, obrigado por responderem :D

Este é o meu código atual, depois de transforma-lo parcialmente em PDO:

<?php
	define( 'MYSQL_HOST', 'local' );
	define( 'MYSQL_USER', 'banco' );
	define( 'MYSQL_PASSWORD', '' );
	define( 'MYSQL_DB_NAME', 'local' );

	try {
	    $PDO = new PDO( 'mysql:host=' . MYSQL_HOST . ';dbname=' . MYSQL_DB_NAME, MYSQL_USER, MYSQL_PASSWORD );
	    
	    $PDO->exec("set names utf8");
	    
	    $sql = "SELECT cod_cidades, nome
	    		FROM cidades
	    		ORDER BY nome";

		$result = $PDO->query( $sql );
		$rows = $result->fetchAll();
		print_r( $rows );
	} catch ( PDOException $e ){
	    echo 'Erro ao conectar com o MySQL: ' . $e->getMessage();
	}
?> 

O printr funciona corretamente mostrando o array com todas as cidades que tem no banco. Porém, eu preciso se eu defino este WHERE conforme está no código original ele da problema, e eu preciso deste WHERE para comparar com o $cod_estados que é captado no meu formulário HTML:

WHERE estados_cod_estados=$cod_estados 

Quando adiciono este "WHERE" acontece o seguinte erro na linha onde está o fetchAll()

Fatal error: Uncaught Error: Call to a member function fetchAll() on boolean

Teria que ter alguma forma de reproduzir a linha abaixo para o PDO, pois sem ela não da para fazer a comparação "estados_cod_estados=$cod_estados":

$cod_estados = mysql_real_escape_string( $_GET['cod_estados'] );

Obrigado a todos até o momento!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você poderia fazer umas buscas no google tipo selecionando dados com PDO que você iria obter uma linha de estudo bem bacana.

A função mysql_real_escape_string() não se faz necessário, uma vez que nós usaremos PDO Statements para blindar os valores passados, e mesmo se quisesse usar ela não funcionaria pois faz parte da extensão mysql_*

Mais caso seja necessário, de uma olhada no manual sobre PDO::quote, leia mais aqui

http://php.net/manual/en/pdo.quote.php

Sua query deverá ficar da seguinte forma:

<?php
	define( 'MYSQL_HOST', 'local' );
	define( 'MYSQL_USER', 'banco' );
	define( 'MYSQL_PASSWORD', '' );
	define( 'MYSQL_DB_NAME', 'local' );

	try {
	    $PDO = new PDO( 'mysql:host=' . MYSQL_HOST . ';dbname=' . MYSQL_DB_NAME, MYSQL_USER, MYSQL_PASSWORD );
	    
	    $PDO->exec("set names utf8");

		$result = $PDO->prepare("SELECT cod_cidades, nome FROM cidades
                           WHERE estados_cod_estado = :cod ORDER BY nome");
                $result->bindValue(':cod',$cod_estados);
                $result->execute();

		$rows = $result->fetchAll(PDO::FETCH_ASSOC);

		print_r( $rows );
	} catch ( PDOException $e ){
	    echo 'Erro ao conectar com o MySQL: ' . $e->getMessage();
	}
?> 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu havia tentado usando os statementes, porém eu não sabia ao certo onde inserir, pela query dava erro...não tive sucesso.

Aparentemente a conexão funcionou utilizando o seu código e me retornou na tela isto:

Array ()

O que é lógico, pq a partir do momento que eu seleciono no <select> um estado, ele começa a carregar as cidades.

Dessa forma eu preciso continuar a transcrição desta parte do código:

while ( $row = mysql_fetch_assoc( $res ) ) {
	$cidades[] = array(
		'cod_cidades'	=> $row['cod_cidades'],
		'nome'			=> $row['nome'],
	);

Estou testando aqui, qualquer coisa retorno.

Código até o momento retornando um array null:

<?php
	define( 'MYSQL_HOST', 'local' );
	define( 'MYSQL_USER', 'banco' );
	define( 'MYSQL_PASSWORD', '' );
	define( 'MYSQL_DB_NAME', 'local' );

	try {
	    $PDO = new PDO( 'mysql:host=' . MYSQL_HOST . ';dbname=' . MYSQL_DB_NAME, MYSQL_USER, MYSQL_PASSWORD );
	    
	    $PDO->exec("set names utf8");
 
		$result = $PDO->prepare("SELECT cod_cidades, nome FROM cidades WHERE estados_cod_estado = :cod ORDER BY nome");
                $result->bindValue(':cod',$cod_estados);
                $result->execute();
 
		while ($rows = $result->fetchAll(PDO::FETCH_ASSOC)){ //aqui que fica a dúvida
			$cidades[] = array(
				'cod_cidades'	=> $row['cod_cidades'],
				'nome'		=> $row['nome'],
			);	
		}

		print_r( $cidades);
	}catch ( PDOException $e ){
	    echo 'Erro ao conectar com o MySQL: ' . $e->getMessage();
	}

echo( json_encode( $cidades ) ); //este formato funciona no PDO?

Como o código acima não me mostra erro mas também não mostra os dados relacionados a cidades, não consigo saber se o erro está aí ou na chamada jQuery abaixo:

$(function(){
	$('#cod_estados').change(function(){
		if( $(this).val() ) {
			$('#cod_cidades').hide();
			$('.carregando').show();
			$.getJSON('/chamaCidades.php?search=',{cod_estados: $(this).val(), ajax: 'true'}, function(j){
				var options = '<option value="">Selecione a cidade</option>';	
				for (var i = 0; i < j.length; i++) {
					options += '<option value="' + j[i].cod_cidades + '">' + j[i].nome + '</option>';
				}	
				$('#cod_cidades').html(options).show();
				$('.carregando').hide();
			});
		} else {
			$('#cod_cidades').html('<option value="">– Escolha um estado –</option>');
		}
	});
	$('#cod_cidades').change(function(){
		if( $(this).val() ) {
			$('#cod_cartorios').hide();
			$('.carregando').show();
			$.getJSON('/chamaCartorios.php?search=',{cod_cidades: $(this).val(), ajax: 'true'}, function(j){
				var options = '<option value="">Selecione o cartorio</option>';	
				for (var i = 0; i < j.length; i++) {
					options += '<option value="' + j[i].id_cartorio + '">Cartorio ' + j[i].nome_oficial + '</option>';
				}	
				$('#cod_cartorios').html(options).show();
				$('.carregando').hide();
			});
		} else {
			$('#cod_cartorios').html('<option value="">– Escolha uma cidade –</option>');
		}
	});
});

Compartilhar este post


Link para o post
Compartilhar em outros sites
Me parece que agora falta criar/inicializar a variável $cod_estados (que vem de $_GET), pois você a está usando mas ela não existe (e provavelmente suas configurações estão ocultando mensagens de Warning do PHP, por isso você não viu avisos na tela).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou com as mensagens de warning ativas, porém não mostra nada mesmo..

Sobre a questão mencionada de inicializar a variável, eu tenho uma estrutura assim em meu site:

Form HTML com 3 selects:

  • Estado - Chama dados manualmente em <options>
  • Cidade - Chama por meio deste codigo jQuery que está acima, logo este código chama o arquivo "chamaCidades.php" onde ele faz busca no banco
  • Cartorio - Faz a mesma coisa que o de "cidade" porém pegando os cartórios com base na cidade (também no código jquery acima).

Basicamente: Form HTML -> Arquivo jQuery -> Arquivo de conexão com banco -> Form Html

Para mim parece muito confuso tudo isso heheh, não fui em quem fiz o código então fica mais complicado ainda :/

Inspecionando no Chrome, a partir do formulário eu recebo a seguinte notificação de erro:

Uncaught TypeError: Cannot read property 'length' of null

Relacionado a linha:

for (var i = 0; i < j.length; i++) {...}

Obrigado pelas respostas até o momento :D

Compartilhar este post


Link para o post
Compartilhar em outros sites
Acho que Warning não está ativo não, porque no último código que você mostrou, tanto a variável $cod_estados quanto a $cidades não foram criadas, então era para exibir algo (ou você não mostrou o código completo rs). Para ter certeza, ative as mensagens de erro logo após a abertura de tag do PHP:



<?php
ini_set("display_errors", 1);
error_reporting(E_ALL|E_STRICT);

define( 'MYSQL_HOST', 'local' );
//restante do código


E use o fetch ao invés de fetchAll para pegar linha por linha:



while ($rows = $result->fetch(PDO::FETCH_ASSOC)){


E também verifique se houve algum erro:



// coloque antes do while
var_dump($PDO->errorInfo());
var_dump($result->errorInfo());


O json_encode funciona normalmente, até porque ele não está relacionado ao PDO.


Outra coisa... no while você criou a variavel como $rows, mas depois você utiliza ela como $row (singular)... deixe tudo como $row.



O erro que você vê no Chrome "Uncaught TypeError" muito provavelmente é causado porque não há dados de retorno do banco, e como você não adicionou (no JavaScript) verificação se retornou dados, dá esse erro aí.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente, quem sabe sabe...ele mostrou alguns erros:

Notice: Undefined variable: cod_estados in /...chamaCidades.php on line 16
array(3) { [0]=> string(5) "00000" [1]=> NULL [2]=> NULL } array(3) { [0]=> string(5) "42S22" [1]=> int(1054) [2]=> string(53) "Unknown column 'estados_cod_estado' in 'where clause'" } 
Notice: Undefined variable: cidades in /...chamaCidades.php on line 32
null

Eu havia esquecido de definir:

$cidades = array();

Porém o $cod_estados vem de um GET, como no código antigo estava:

$cod_estados = mysql_real_escape_string( $_GET['cod_estados'] );

Agora como foi usados os statments, como ficaria a inicialização desta variável?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Você só não precisa da função mysql_real_escape_string, então é só removê-la para ficar assim:



$cod_estados = $_GET['cod_estados'];


Mas para evitar possíveis mensagens de Warning, é melhor você verificar se o parâmetro $_GET['cod_estados'] existe antes de utilizá-lo, desta forma:



$cod_estados = isSet($_GET['cod_estados']) ? $_GET['cod_estados'] : null;


E segundo a mensagem de erro Unknown column 'estados_cod_estado' in 'where clause', não existe uma coluna chamada "estados_cod_estado"...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Heheh, sem erros agora, só mostrando um array cheio de NULLS, a questão da tabela eu havia definido um nome errado estados_cod_estado, ficou faltando um 's'.

Resultado do arquivo de chamada do banco após os acertos/correções:

array(3) { [0]=> string(5) "00000" [1]=> NULL [2]=> NULL } array(3) { [0]=> string(5) "00000" [1]=> NULL [2]=> NULL } []

Acredito que o problema agora seja de leitura do arquivo jQuery. Sabe se é possível debugar um local específico dentro deste código jQuery que faz o select popular? O código está neste mesmo post aqui.

Pelo inspecionar se eu digito console.log(cod_estados) que é a ID onde tenho os estados no <select> recebo:

...removidas

Já se eu digito console.log(cod_cidades) ele deveria mostrar todos os options baseados no estado que eu escolhi, porém mostra isto apenas:

..removidas

E sem erros no inspecionar...bixo feio :/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bicho do céu. Removi os var_dump (s) e funcionou!! Caramba, você não sabe a quanto tempo to tentando fazer essa desgraça funcionar!

Vou testar mais..

Cara, você é f** mesmo...eu levaria uma vida em cima disso e não sairia da variável que não estava definida heheheh! Muito obrigado pelo seu tempo dedicado pra me ajudar!

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
    • Por violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, poderiam me ajudar.

      Estou com a seguinte dúvida:
      --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER.

      exemplo:
      código   ----   descrição
           1       -----   produto_A
       
      Grato,
       
      Cesar
×

Informação importante

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