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 Rafael_Ferreira
      Não consigo carregar a imagem do captcha do meu formulário. Foi testado com o xampp e easyphp. Também não carregou a imagem de outros captcha. 
       
       
    • Por luiz monteiro
      Olá, tudo bem?
       
      Estou melhorando meu conhecimento em php e mysql e, me deparei com o seguinte. A tabela da base de dados tem um campo do tipo varchar(8) o qual armazena números. Eu não posso alterar o tipo desse campo. O que preciso é fazer um select para retornar o números que contenham zeros a direita ou a esquerda.
      O que tentei até agora
       
      Ex1
      $busca = $conexao->prepare("select campo form tabela where (campo = :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form']);
       
      Se a direita da string $_REQUEST['campo_form'] termina ou inicia com zero ou zeros, a busca retorna vazio.
      Inseri dados numéricos, da seguinte maneira para testar: 01234567;  12345670: 12345678: 12340000... entre outros nessa coluna. Todos os valores que não terminam ou não iniciam com zero ou zeros, o select funciona.
       
       
      Ex2
      $busca = $conexao->prepare("select campo form tabela where (campo = 0340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex3
      $busca = $conexao->prepare("select campo form tabela where (campo = '02340001' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex4
      $busca = $conexao->prepare("select campo form tabela where (campo like 2340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex5
      $busca = $conexao->prepare("select campo form tabela where (campo like '12340000') ");
      Esse número está cadastrado, mas não retorna.
       
      Ex6
      $busca = $conexao->prepare("select campo form tabela where (campo like '"12340000"' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex7
      $busca = $conexao->prepare("select campo form tabela where (campo like :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form'])
      Não retorna dados.
       
      O  $_REQUEST['campo_form'] é envio via AJAX de um formulário. 
      Usei o gettype para verificar o post, e ele retorna string.
      Fiz uma busca com número 12345678 para verificar o que o select retorna, e também retrona como string.
       
      Esse tipo de varchar foi usado porque os números que serão gravados nesse campo,  terão zeros a direita ou na esquerda. Os tipos number do mysql não gravam zeros, então estou usando esse. O problema é a busca.
      Agradeço desde já.
       
       
    • Por daemon
      Boa tarde,
       
      Eu tenho uma rotina que faz uma leitura do arquivo .xml de vários sites.

      Eu consigo pegar o tópico e a descrição, e mostrar a imagem que esta na pagina do link.
      Para isso utilizo esta função:
      function getPreviewImage($url) { // Obter o conteúdo da página $html = file_get_contents($url); // Criar um novo objeto DOMDocument $doc = new DOMDocument(); @$doc->loadHTML($html); // Procurar pela tag meta og:image $tags = $doc->getElementsByTagName('meta'); foreach ($tags as $tag) { if ($tag->getAttribute('property') == 'og:image') { return $tag->getAttribute('content'); } } // Se não encontrar og:image, procurar pela primeira imagem na página $tags = $doc->getElementsByTagName('img'); if ($tags->length > 0) { return $tags->item(0)->getAttribute('src'); } // Se não encontrar nenhuma imagem, retornar null return null; } // Uso: $url = "https://example.com/article"; $imageUrl = getPreviewImage($url); if ($imageUrl) { echo "<img src='$imageUrl' alt='Preview'>"; } else { echo "Nenhuma imagem encontrada"; }  
      Mas estou com um problema, esta funcão funciona quando coloco em uma pagina de teste.php. Preciso mostrar em uma página inicial diversas fotos de todos os links. (No caso acima só funciona 1).
    • 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');     }  
×

Informação importante

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