Jump to content
Matheus B. Siqueira

[ Resolvido ] Falha ao retornar dados com PDO

Recommended Posts

Meu PDO, não está retornando nenhum valor, e está dando erro ao tentar baixar o arquivo:

 

Screenshot_8.png.e2f0492a9700c44fce6edd04befff496.png

 

 

<?php
 
 //se não tiver o parametro, mata a aplicação.
 if (isset($_POST['codigo_video'])) {
    $codigo_video = $_POST['codigo_video'];
}



 //Aqui está um exemplo simples de como fazer uma conexão PDO
 $host = 'localhost';
 $db   = 'onteach';
 $user = 'root';
 $pass = 'root';
 $charset = 'utf8mb4';
 
 $dsn = "mysql:host=$host;dbname=$db;charset=$charset";

 try {
      $pdo = new PDO($dsn, $user, $pass);
 } catch (PDOException $e) {
      throw new PDOException($e->getMessage(), (int)$e->getCode());
 }

 //$pdoQuery = $pdo->query("SELECT conteudo.arquivo FROM conteudo WHERE conteudo.conteudo_video = '{$codigo_video}'");
 try{

    $ready = $pdo->prepare("SELECT conteudo.arquivo FROM conteudo WHERE conteudo.conteudo_video = :codigo_video");
    $ready->bindParam(':codigo_video', $codigo_video);

  //  $ready = $pdo->prepare($pdoQuery);
  //  $ready->execute();

 }catch(PDOException $e){
     echo $e->getMessage();
 }
 while($rs = $ready->fetch(PDO::FETCH_ASSOC));{

    $local = 'upload/';
    $local_arquivo = $local.$rs;

    header('Content-type: octet/stream');
    // Indica o nome do arquivo como será "baixado". Você pode modificar e colocar qualquer nome de arquivo
    header('Content-disposition: attachment; filename="'.$rs.'";'); 
    // Indica ao navegador qual é o tamanho do arquivo
    header('Content-Length: '.filesize($local_arquivo));
    // Busca todo o arquivo e joga o seu conteúdo para que possa ser baixado
    readfile($local_arquivo);
 }
print_r($rs);
?>

Alguém sabe resolver? Visto que o $rs não retorna o dado arquivo da tabela

Share this post


Link to post
Share on other sites

Nesta linha, você precisa passar o campo do result set.

 

//$local_arquivo = $local.$rs;
$local_arquivo = $local.$rs['arquivo'];

 

seria interessante também antes do download verificar se o arquivo existe:

 

if( file_exists($local_arquivo) ) {
	... headers e readfile
}

 

Share this post


Link to post
Share on other sites

O "problema" foi um pouco mais "fundo", contudo,

implementando as orientações de @André Severino,

segue, abaixo, possível solução:

 

CÓDIGO:

<?php

//se não tiver o parametro, mata a aplicação.
if (isset($_POST['codigo_video'])) {
    $codigo_video = $_POST['codigo_video'];
}

//Aqui está um exemplo simples de como fazer uma conexão PDO
$host = 'localhost';
$db = 'onteach';
$user = 'root';
$pass = 'root';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";

try {
    $pdo = new PDO($dsn, $user, $pass);
} catch (PDOException $e) {
    throw new PDOException($e->getMessage(), (int)$e->getCode());
}

//$pdoQuery = $pdo->query("SELECT conteudo.arquivo FROM conteudo WHERE conteudo.conteudo_video = '{$codigo_video}'");
try {
    $ready = $pdo->prepare("SELECT conteudo.arquivo FROM conteudo WHERE conteudo.conteudo_video = :codigo_video");
    $ready->bindParam(':codigo_video', $codigo_video);
    $ready->execute();
} catch(PDOException $e) {
    echo $e->getMessage();
}

while ($rs = $ready->fetch(PDO::FETCH_ASSOC)) {
    $local = 'upload/';
    $local_arquivo = $local.$rs['arquivo'];

    if (file_exists($local_arquivo)) {
        header('Content-type: octet/stream');
        // Indica o nome do arquivo como será "baixado". Você pode modificar e colocar qualquer nome de arquivo
        header('Content-disposition: attachment; filename="'.$rs['arquivo'].'";'); 
        // Indica ao navegador qual é o tamanho do arquivo
        header('Content-Length: '.filesize($local_arquivo));
        // Busca todo o arquivo e joga o seu conteúdo para que possa ser baixado
        readfile($local_arquivo);
    } else {
        echo "Arquivo nao existe!";
    }
}

 

Share this post


Link to post
Share on other sites
1 hora atrás, André Severino disse:

Nesta linha, você precisa passar o campo do result set.

 


//$local_arquivo = $local.$rs;
$local_arquivo = $local.$rs['arquivo'];

 

seria interessante também antes do download verificar se o arquivo existe:

 


if( file_exists($local_arquivo) ) {
	... headers e readfile
}

 

Opa andré tudo certo?

Testei como você disse porém apareceu este erro gigante aqui..

 

Screenshot_10.png.d3ec2f31a7555d8b8f95404fad71202f.png

58 minutos atrás, ShadowDLL disse:

O "problema" foi um pouco mais "fundo", contudo,

implementando as orientações de @André Severino,

segue, abaixo, possível solução:

 

CÓDIGO:


<?php

//se não tiver o parametro, mata a aplicação.
if (isset($_POST['codigo_video'])) {
    $codigo_video = $_POST['codigo_video'];
}

//Aqui está um exemplo simples de como fazer uma conexão PDO
$host = 'localhost';
$db = 'onteach';
$user = 'root';
$pass = 'root';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";

try {
    $pdo = new PDO($dsn, $user, $pass);
} catch (PDOException $e) {
    throw new PDOException($e->getMessage(), (int)$e->getCode());
}

//$pdoQuery = $pdo->query("SELECT conteudo.arquivo FROM conteudo WHERE conteudo.conteudo_video = '{$codigo_video}'");
try {
    $ready = $pdo->prepare("SELECT conteudo.arquivo FROM conteudo WHERE conteudo.conteudo_video = :codigo_video");
    $ready->bindParam(':codigo_video', $codigo_video);
    $ready->execute();
} catch(PDOException $e) {
    echo $e->getMessage();
}

while ($rs = $ready->fetch(PDO::FETCH_ASSOC)) {
    $local = 'upload/';
    $local_arquivo = $local.$rs['arquivo'];

    if (file_exists($local_arquivo)) {
        header('Content-type: octet/stream');
        // Indica o nome do arquivo como será "baixado". Você pode modificar e colocar qualquer nome de arquivo
        header('Content-disposition: attachment; filename="'.$rs['arquivo'].'";'); 
        // Indica ao navegador qual é o tamanho do arquivo
        header('Content-Length: '.filesize($local_arquivo));
        // Busca todo o arquivo e joga o seu conteúdo para que possa ser baixado
        readfile($local_arquivo);
    } else {
        echo "Arquivo nao existe!";
    }
}

 

Segue o outro erro apresentado acima

Share this post


Link to post
Share on other sites

Este erro ira ocorrer porque, muito provavelmente,

você está tentando fazer o Download do Arquivo

via Ajax, e até onde sei, isso é impossível...

 

Não seria mais fácil você apenas "redirecionar o

usuário" passando o ID do conteúdo como um

parâmetro GET?

 

Segue exemplo para melhor compreensão:

 

CÓDIGO [ INDEX.PHP ]

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge">

		<title> TESTE </title>

		<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" />
	</head>

	<body>
		<div class="container">
			<table class="table">
				<thead>
					<tr>
						<th># ID</th>
						<th># FILE</th>
						<th>#</th>
					</tr>
				</thead>

				<tbody>
				<?php
				$conn = new PDO ('mysql:host=localhost;dbname=onteach', 'root', 'root');
				$conteudo = $conn->prepare("SELECT * FROM conteudo");
				$conteudo->execute();

				while ($key = $conteudo->fetch(PDO::FETCH_OBJ)):?>
					<tr>
						<td><?= $key->idConteudo ?></td>
						<td><?= $key->arquivo ?></td>
						<td>
							<a href="download.php?id=<?= $key->conteudo_video ?>" class="btn btn-danger">
								DOWNLOAD
							</a>
						</td>
					</tr>
				<?php endwhile; ?>
				</tbody>
			</table>
		</div>
	</body>
</html>

CÓDIGO [ DOWNLOAD.PHP ]

<?php

//se não tiver o parametro, mata a aplicação.
if (isset($_GET['id'])) {
    $codigo_video = $_GET['id'];
}

//Aqui está um exemplo simples de como fazer uma conexão PDO
$host = 'localhost';
$db = 'onteach';
$user = 'root';
$pass = 'root';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";

try {
    $pdo = new PDO($dsn, $user, $pass);
} catch (PDOException $e) {
    throw new PDOException($e->getMessage(), (int)$e->getCode());
}

//$pdoQuery = $pdo->query("SELECT conteudo.arquivo FROM conteudo WHERE conteudo.conteudo_video = '{$codigo_video}'");
try {
    $ready = $pdo->prepare("SELECT conteudo.arquivo FROM conteudo WHERE conteudo.conteudo_video = :codigo_video");
    $ready->bindParam(':codigo_video', $codigo_video);
    $ready->execute();
} catch(PDOException $e) {
    echo $e->getMessage();
}

while ($rs = $ready->fetch(PDO::FETCH_ASSOC)) {
    $local = 'upload/';
    $local_arquivo = $local.$rs['arquivo'];

    if (file_exists($local_arquivo)) {
        header('Content-type: octet/stream');
        // Indica o nome do arquivo como será "baixado". Você pode modificar e colocar qualquer nome de arquivo
        header('Content-disposition: attachment; filename="'.$rs['arquivo'].'";'); 
        // Indica ao navegador qual é o tamanho do arquivo
        header('Content-Length: '.filesize($local_arquivo));
        // Busca todo o arquivo e joga o seu conteúdo para que possa ser baixado
        readfile($local_arquivo);
    } else {
        echo "Arquivo nao existe!";
    }
}

 

Vale a pena ressaltar que os códigos acima são

apenas exemplos, sendo assim, podendo existir

abordagens melhores que as utilizadas...

 

Share this post


Link to post
Share on other sites

@Matheus B. Siqueira tente esse script meu:

https://github.com/Spell-Master/sm-web/tree/master/javascript/FileTransfer

 

Basta informar local, nome do arquivo com sua extensão assim como eu transcrevi no exemplo:

No caso fora do laço de repetição do while

if (file_exists($local_arquivo)) {
?>
    <script>
      file = new FileTransfer();
      file.download('<?= $local_arquivo ?>', true);
    </script>
<?php
}

 

 

 

Share this post


Link to post
Share on other sites
24 minutos atrás, ShadowDLL disse:

Este erro ira ocorrer porque, muito provavelmente,

você está tentando fazer o Download do Arquivo

via Ajax, e até onde sei, isso é impossível...

 

Não seria mais fácil você apenas "redirecionar o

usuário" passando o ID do conteúdo como um

parâmetro GET?

 

Segue exemplo para melhor compreensão:

 

CÓDIGO [ INDEX.PHP ]


<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge">

		<title> TESTE </title>

		<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" />
	</head>

	<body>
		<div class="container">
			<table class="table">
				<thead>
					<tr>
						<th># ID</th>
						<th># FILE</th>
						<th>#</th>
					</tr>
				</thead>

				<tbody>
				<?php
				$conn = new PDO ('mysql:host=localhost;dbname=onteach', 'root', 'root');
				$conteudo = $conn->prepare("SELECT * FROM conteudo");
				$conteudo->execute();

				while ($key = $conteudo->fetch(PDO::FETCH_OBJ)):?>
					<tr>
						<td><?= $key->idConteudo ?></td>
						<td><?= $key->arquivo ?></td>
						<td>
							<a href="download.php?id=<?= $key->conteudo_video ?>" class="btn btn-danger">
								DOWNLOAD
							</a>
						</td>
					</tr>
				<?php endwhile; ?>
				</tbody>
			</table>
		</div>
	</body>
</html>

CÓDIGO [ DOWNLOAD.PHP ]


<?php

//se não tiver o parametro, mata a aplicação.
if (isset($_GET['id'])) {
    $codigo_video = $_GET['id'];
}

//Aqui está um exemplo simples de como fazer uma conexão PDO
$host = 'localhost';
$db = 'onteach';
$user = 'root';
$pass = 'root';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";

try {
    $pdo = new PDO($dsn, $user, $pass);
} catch (PDOException $e) {
    throw new PDOException($e->getMessage(), (int)$e->getCode());
}

//$pdoQuery = $pdo->query("SELECT conteudo.arquivo FROM conteudo WHERE conteudo.conteudo_video = '{$codigo_video}'");
try {
    $ready = $pdo->prepare("SELECT conteudo.arquivo FROM conteudo WHERE conteudo.conteudo_video = :codigo_video");
    $ready->bindParam(':codigo_video', $codigo_video);
    $ready->execute();
} catch(PDOException $e) {
    echo $e->getMessage();
}

while ($rs = $ready->fetch(PDO::FETCH_ASSOC)) {
    $local = 'upload/';
    $local_arquivo = $local.$rs['arquivo'];

    if (file_exists($local_arquivo)) {
        header('Content-type: octet/stream');
        // Indica o nome do arquivo como será "baixado". Você pode modificar e colocar qualquer nome de arquivo
        header('Content-disposition: attachment; filename="'.$rs['arquivo'].'";'); 
        // Indica ao navegador qual é o tamanho do arquivo
        header('Content-Length: '.filesize($local_arquivo));
        // Busca todo o arquivo e joga o seu conteúdo para que possa ser baixado
        readfile($local_arquivo);
    } else {
        echo "Arquivo nao existe!";
    }
}

 

Vale a pena ressaltar que os códigos acima são

apenas exemplos, sendo assim, podendo existir

abordagens melhores que as utilizadas...

 

Entendi amigo, vou tentar assim, naquela parte "

<?= $key->conteudo_video ?>"

 

 

Como eu faço para ele puxar o valor do select?, como exemplo assim:

 

        <select name="conteudo" id="conteudo">
        </select>
 
//no jquery
var codigoVideo = $("#conteudo").val();

Share this post


Link to post
Share on other sites

Aparece Undefined Index conteudo:

 

  <?php
        $codigo_video = $_POST['conteudo'];
        $conn = new PDO ('mysql:host=localhost;dbname=onteach''root''root');
        $conteudo = $conn->prepare("SELECT * FROM conteudo WHERE conteudo.conteudo_video = '$codigo_video'");
        $conteudo->execute();
 
        while ($key = $conteudo->fetch(PDO::FETCH_OBJ)):?>
 
   <button href="baixar_arquivo.php?id=<?= $key->conteudo_video ?>" type="button" id="baixar_ctt" class="btn btn-secondary btn-sm" data-dismiss="modal">Baixar material</button></div>
   <?php endwhile?>
   

Share this post


Link to post
Share on other sites

Vamos lá,

 

Primeiro, antes de lhe mostrar um exemplo, poderia

enviar o código onde você seleciona o item que

deseja fazer o download?

Share this post


Link to post
Share on other sites

Claro https://pastebin.com/RYs5S36q

 

Lembrando que os valores que coloca no main.js, definem os options, que no fim, definem o valor do select que seria o campo que teria que baixar o arquivo

52 minutos atrás, ShadowDLL disse:

Vamos lá,

 

Primeiro, antes de lhe mostrar um exemplo, poderia

enviar o código onde você seleciona o item que

deseja fazer o download?

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By joao b silva
      amigos é o seguinte, eu crio um grid dinamicamente com bootstrap, porem a depender do conteúdo as colunas, na mesma linha ficam com tamanhos (height) diferentes, o que não acontece quando utilizamos <table></table>. Como posso resolver isso?
    • By Pellegrini2106
      Fala galera estou com uma duvida tenho um código em php  onde a classe e o método são passados por uma query string onde ele e passado desta forma:
      "http://localhost/projeto/?url=pessoa&metodo=cadastrarPessoa&id=1".
      Mas na verdade quero passar na forma de URL amigável pegando ao invés o arquivo pegasse  a classe e o método deste jeito "http://localhost/projeto/pessoa/cadastrarPessoa ou se tiver uma consulta pegando a classe, método e o resultado da consulta via URL  desta forma: "http://localhost/projeto/pessoa/1.
       
      Obrigado
       
      Olha o Código Fonte:
       
      .htaccess
      RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] index.php
       
      <?php /* Chama a Biblioteca Gerenciadora de Template TWIG */ require_once 'vendor/autoload.php'; /* Classe Core */ require_once 'app/core/Core.php'; /* Classe Controle */ require_once 'app/controle/menuControle.php'; require_once 'app/controle/pessoaControle.php'; require_once 'app/controle/erroControle.php'; $template = file_get_contents("app/visao/template/estrutura.php"); ob_start(); $core = new Core(); $core->Start($_GET); $saida = ob_get_contents(); ob_end_clean(); $tplPronto = str_replace('{{Area Dinamica}}', $saida, $template); echo $tplPronto; Core.php -> E a camada onde eu quero transformar a query string em URL amigavél que por sua vez chama a classe controle.
      <?php class Core { public function Start($urlGet) { $acao = 'index'; if (isset($urlGet['url'])) { $controle = $urlGet['url'] . 'Controle'; } else { $controle = 'menuControle'; } if (!class_exists($controle)) { $controle = "erroControle"; } if (isset($urlGet['metodo'])) { $acao = $urlGet['metodo']; } else { $acao = 'index'; } call_user_func(array(new $controle, $acao), array()); } }  
       
    • By Caio Vargas
      Fala pessoal estou com uma grande duvida ...
      fiz algumas pesquisa sobre o filtro de produtos ... ate consegui fazer alguma coisa porem eu estou em duvida ... pq pelas referencias que eu vi  tem uns que ja vem selecionado a categoria
      alguem tem algum exemplo de filtro 
    • By landerbadi
      Olá pessoal
       
      Tenho uma tabela mysql chamada “poesias” com os seguintes campos (id,autor,poesia) e uma outra tabela chamada “palavras” com os seguintes campos (id,palavra,ocorrencias).
       
      Na tabela poesias eu cadastrei uma serie de poesias, e na tabela palavras eu cadastrei uma lista de palavras.
       
      Eu preciso fazer com que o php pegue as palavras cadastradas na tabela palavra e grave no campo ocorrências as quantidades de vezes que determinada palavra aparece na tabela poesias.
       
      Alguém sabe como fazer isso?
       
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.