Ir para conteúdo

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 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 ILR master
      Fala galera.
      Espero que todos estejam bem.
      Seguinte: Tenho um arquivo xml onde alguns campos estão com : (dois pontos), como o exemplo abaixo:
       
      <item>
      <title>
      d sa dsad sad sadasdas
      </title>
      <link>
      dsadas dsa sad asd as dsada
      </link>
      <pubDate>sadasdasdsa as</pubDate>
      <dc:creator>
      d sad sad sa ad as das
      </dc:creator>
      </item>
       
      Meu código:
       
      $link = "noticias.xml"; 
      $xml = simplexml_load_file($link); 
      foreach($xml -> channel as $ite) {     
           $titulo = $ite -> item->title;
           $urltitulo = $ite -> item->link;
           print $urltitulo = $ite -> item->dc:creator;
      } //fim do foreach
      ?>
       
      Esse campo dc:creator eu não consigo ler. Como faço?
       
      Agradeço quem puder me ajudar.
       
      Abs
       
       
    • 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.
    • Por landerbadi
      Olá pessoal, boa tarde
       
      Tenho uma tabela chamada "produtos" com os seguintes campos (id, produto) e outra tabela chamada "itens" com os seguintes campos (id, prod_01, prod_02, prod_03, prod_04).
       
      Na tabela produtos eu tenho cadastrado os seguintes produtos: laranja, maçã, uva, goiaba, arroz, feijão, macarrão, etc.
       
      Na tabela itens eu tenho cadastrado os itens da seguinte maneira:
       
      1, laranja, uva, arroz, feijão;
      2, maçã, macarrão, goiaba, uva;
      3, arroz, feijão, maçã, azeite
       
      Meu problema é o seguinte: 
      Eu escolho um produto da tabela "produtos", por exemplo "uva".  Preciso fazer uma consulta na tabela "itens" para ser listado todos os registros que contenham o produto "uva" e que todos os demais produtos estejam cadastrados na tabela "produtos".
       
      No exemplo acima seria listado apenas dois registros, pois o terceiro registro não contém o produto "uva". 
       
      Alguém pode me ajudar? Pois estou quebrando a cabeça a vários dias e não consigo achar uma solução.
×

Informação importante

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