Jump to content
Samuel Pietro

Select só exibe a ultima linha da tabela

Recommended Posts

Estou desenvolvendo um sistema para gerar arquivos de remessa para a CEF (Seguindo o padrão CNAB150) Até então tudo Okay.

Meu problema está na hora de gerar a remessa que só consta a ultima linha da respectiva tabela no Banco de dados.

Eu preciso que gere com todas as linhas que estiverem na tabela (Mais pra frente irei colocar alguns filtros para gerar por data ou por Numero de Serie)

Minha conexão com o Banco está assim:

<?php

define('SGBD', 'mysql');
define('HOST', 'localhost');
define('DBNAME', '******');
define('CHARSET', 'utf8');
define('USER', '*******');
define('PASSWORD', '******');
define('SERVER', 'linux');

class conexao {
    
    /*
     * Atributo estático de conexão
     */
    private static $pdo;

    /*
     * Escondendo o construtor da classe
     */
    private function __construct() {
        //
    }

    /*
     * Método privado para verificar se a extensão PDO do banco de dados escolhido
     * está habilitada
     */
    private static function verificaExtensao() {

        switch(SGBD):
            case 'mysql':
                $extensao = 'pdo_mysql';
                break;
            case 'mssql':{
                if(SERVER == 'linux'):
                    $extensao = 'pdo_dblib';
                else:
                    $extensao = 'pdo_sqlsrv';
                endif;
                break;
            }
            case 'postgre':
                $extensao = 'pdo_pgsql';
                break;
        endswitch;

        if(!extension_loaded($extensao)):
            echo "<h1>Extensão {$extensao} não habilitada!</h1>";
            exit();
        endif;
    }

    /*
     * Método estático para retornar uma conexão válida
     * Verifica se já existe uma instância da conexão, caso não, configura uma nova conexão
     */
    public static function getInstance() {

        self::verificaExtensao();

        if (!isset(self::$pdo)) {
            try {
                $opcoes = array(\PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8');
                switch (SGBD) :
                    case 'mysql':
                        self::$pdo = new \PDO("mysql:host=" . HOST . "; dbname=" . DBNAME . ";", USER, PASSWORD, $opcoes);
                        break;
                    case 'mssql':{
                        if(SERVER == 'linux'):
                            self::$pdo = new \PDO("dblib:host=" . HOST . "; database=" . DBNAME . ";", USER, PASSWORD, $opcoes);
                        else:
                            self::$pdo = new \PDO("sqlsrv:server=" . HOST . "; database=" . DBNAME . ";", USER, PASSWORD, $opcoes);
                        endif;
                        break;
                    }
                    case 'postgre':
                        self::$pdo = new \PDO("pgsql:host=" . HOST . "; dbname=" . DBNAME . ";", USER, PASSWORD, $opcoes);
                        break;
                endswitch;
                self::$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
            } catch (PDOException $e) {
                print "Erro: " . $e->getMessage();
            }
        }
        return self::$pdo;
    }

    public static function isConectado(){
        
        if(self::$pdo):
            return true;
        else:
            return false;
        endif;
    }

}

Minhas Functions

<?php
/*Campos Numéricos (“Picture 9”)
• Alinhamento: sempre à direita, preenchido com zeros à esquerda, sem máscara de edição;
• Não utilizados: preencher com zeros.
*/
function picture_9($palavra,$limite){
	$var=str_pad($palavra, $limite, "0", STR_PAD_LEFT);
	return $var;
}

/*
Campos Alfanuméricos (“Picture X”)
• Alinhamento: sempre à esquerda, preenchido com brancos à direita;
• Não utilizados: preencher com brancos;
• Caracteres: maiúsculos, sem acentuação, sem ‘ç’, sem caracteres especiais.
*/
	 
function picture_x( $palavra, $limite ){
	$var = str_pad( $palavra, $limite, " ", STR_PAD_RIGHT );
	$var = remover_acentos( $var );
	if( strlen( $palavra ) >= $limite ){
		$var = substr( $palavra, 0, $limite );
	}
	$var = strtoupper( $var );// converte em letra maiuscula
	return $var;
}	 
	 
function sequencial($i)
{
if($i < 10)
{
return zeros(0,5).$i;
}
else if($i > 10 && $i < 100)
{
return zeros(0,4).$i;
}
else if($i > 100 && $i < 1000)
{
return zeros(0,3).$i;
}
else if($i > 1000 && $i < 10000)
{
return zeros(0,2).$i;
}
else if($i > 10000 && $i < 100000)
{
return zeros(0,1).$i;
}
}

function zeros($min,$max)
{
$x = ($max - strlen($min));
for($i = 0; $i < $x; $i++)
{
$zeros .= '0';
}
return $zeros.$min;
}

function complementoRegistro($int,$tipo)
{
if($tipo == "zeros")
{
$space = '';
for($i = 1; $i <= $int; $i++)
{
$space .= '0';
}
}
else if($tipo == "brancos")
{
$space = '';
for($i = 1; $i <= $int; $i++)
{
$space .= ' ';
}
}

return $space;
}
?>

E Finalmente o meu Select

 $conexao = conexao::getInstance();
		
	$sql = 'SELECT * FROM RegistroE';
	$stm = $conexao->prepare($sql);
	$stm->execute();
	$Sql = $stm->fetchAll(PDO::FETCH_ASSOC);//Já tentei usar tmb $Sql = $stm->fetchAll(PDO::FETCH_OBJ); MAS O PROBLEMA PERSISTE

	foreach($Sql as $SqlReg):
$conteudo_meio=
picture_X($SqlReg->E_01,1)
.picture_X($SqlReg->E_02,25)  
.picture_9($SqlReg->E_03,4)   
.picture_X($SqlReg->E_04,14) 
.picture_9($SqlReg->E_05,8)
.picture_9($SqlReg->E_06,8) 
.picture_9($SqlReg->E_07,8) 
.picture_9($SqlReg->E_08,8)
.picture_9($SqlReg->E_09,8)
.complementoRegistro(96,"brancos")
.picture_9($SqlReg->E_11,1)
.complementoRegistro(1,"brancos")
 ;
endforeach;

Eu preciso da ajuda para listar todos os registros e não apenas o ultimo.

Share this post


Link to post
Share on other sites

Bem alguns avanços que consegui:

 

Eu subtitui a variavel

$conteudo_meio

por

print

e a consulta foi retornada com todos os regstros, mas eu me esbarrei em outro problema. Mais a frente no codigo eu preciso ler o conteudo que está no print, até tentei print onde eu preciso mas ai volta a exibir apenas a ultima linha.

E não minha pergunta é: Se isso for logicamente possivel, como eu coloco o conteudo do print dentro de uma variavel?

ACABEI DE VERIFICAR QUE ASSIM NÃO RESOLVE PRA MIM, POIS A FUNCTION function picture_x NÃO FUNCIONARA COMO ESPERADO, ELA CRIA ESPAÇOS EM BRANCOS NECESSARIOS PARA O PADRÃO DE 150 POSIÇÕES E print IRÁ OS SUPRIMIR MANTENDO APENAS UM UNICO ESPAÇO

Share this post


Link to post
Share on other sites
Em 17/04/2019 at 16:50, Samuel Pietro disse:

 


 $conexao = conexao::getInstance();
		
	$sql = 'SELECT * FROM RegistroE';
	$stm = $conexao->prepare($sql);
	$stm->execute();
	$Sql = $stm->fetchAll(PDO::FETCH_ASSOC);//Já tentei usar tmb $Sql = $stm->fetchAll(PDO::FETCH_OBJ); MAS O PROBLEMA PERSISTE

	foreach($Sql as $SqlReg):
$conteudo_meio=
picture_X($SqlReg->E_01,1)
.picture_X($SqlReg->E_02,25)  
.picture_9($SqlReg->E_03,4)   
.picture_X($SqlReg->E_04,14) 
.picture_9($SqlReg->E_05,8)
.picture_9($SqlReg->E_06,8) 
.picture_9($SqlReg->E_07,8) 
.picture_9($SqlReg->E_08,8)
.picture_9($SqlReg->E_09,8)
.complementoRegistro(96,"brancos")
.picture_9($SqlReg->E_11,1)
.complementoRegistro(1,"brancos")
 ;
endforeach;

 

Você só precisa adicionar a variável $conteudo_meio antes do foreach com valor nulo ou vazio e dentro do foreach após $conteudo_meio adicionar um ponto antes do = ficando da seguinte forma:

$conexao = conexao::getInstance();
$sql = 'SELECT * FROM RegistroE';
$stm = $conexao->prepare($sql);
$stm->execute();
$Sql = $stm->fetchAll(PDO::FETCH_ASSOC);
$conteudo_meio = null;
foreach($Sql as $SqlReg):
	$conteudo_meio .= 
	picture_X($SqlReg->E_01,1)
	.picture_X($SqlReg->E_02,25)
	.picture_9($SqlReg->E_03,4)
	.picture_X($SqlReg->E_04,14)
	.picture_9($SqlReg->E_05,8)
	.picture_9($SqlReg->E_06,8)
	.picture_9($SqlReg->E_07,8)
	.picture_9($SqlReg->E_08,8)
	.picture_9($SqlReg->E_09,8)
	.complementoRegistro(96,"brancos")
	.picture_9($SqlReg->E_11,1)
	.complementoRegistro(1,"brancos");
endforeach;

Da forma que estava o valor da variável $conteudo_meio estava sendo sempre substituído pelo próximo dado da tabela a cada loop.

 

Espero ter ajudado.

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 afetur
      Olá,
      Estou precisando inserir alguns dados diretamente no banco saindo dos campos inputs. Preciso que cada item do array seja
      cadastrado no banco, por exemplo o cliente vai comprar 3 ingressos, que os nomes dos 3 ingressos apareçam um a um nos registros.
       Ajustei os códigos abaixo, mas não funciona. Primeiro veja como está o html:
      <label for="nomeingresso">Ingresso:</label> <input type="text" id="ingresso" name="ingresso[]" placeholder="Ex.: Ingresso Conferência" class="form-control name_list" value="<?php echo $row_ingressos['ingresso'];?>" readonly required /> <label for="valoringresso">Valor:</label> <input type="text" class="form-control" id="valor" name="valor[]" placeholder="Ex.: 1.150,00" value="<?php echo $row_ingressos['valor'];?>" readonly required> <label for="nomeingresso">Quantidade:</label> <input type="number" id="quantidade" name="quantidade[]" class="form-control name_list" value="" min="0" required /> <input name="idingresso[]" type="hidden" id="idingresso" value="<?php echo $row_ingressos['id_ingresso']; ?>">  
      Bom, no código abaixo só funciona se eu tirar o foreach, com ele o código não insere os dados no banco. Estou testando o cadastro
      apenas com o campo ingresso para ver se funciona para depois adicionar os campos valor e quantidade, portanto não insere.
       
      function salvarIngresso(){ $ingresso = $_POST['ingresso']; $valor = $_POST['valor']; $quantidade = $_POST['quantidade']; try { // begin the transaction $this->pdo->beginTransaction(); // our SQL statements foreach($ingresso as $key => $ing){ $this->pdo->exec("INSERT INTO evn_pedidos_ing (ing) VALUES ('$ing');"); } // commit the transaction $this->pdo->commit(); echo "New records created successfully"; } catch(PDOException $e) { // roll back the transaction if something failed $this->pdo->rollback(); echo "Error: " . $e->getMessage(); } }  
      A função de conexão é esta abaixo:
       
      function __construct(){ $this->pdo = new PDO('mysql:host='.$this->host.';dbname='.$this->db, $this->usuario, $this->senha); }
      Para entender melhor qual é o passo a passo do que estou tentando fazer tem um link abaixo. Ao clicar no botão "Inscrever" surge
      o lightbox do Pagseguro, então ele automaticamente insere no banco. Vale ressaltar que só não funciona com o FOREACH, sem esta
      função o código cadastra normalmente, porém só leva o primeiro item do array.

      Agradeço pela ajuda.
    • By GSilva1
      Bom Dia.
      Será que alguém me pode ajudar? Na semana anterior estive com um professor a desenvolver um programa de insert, que também servirá para o Select/Delete/Update.
      Mas estou “preso”, pois, ele disse-me que eu poderia adaptar o código para as outras três opções. Passado quase uma semana não consegui fazer nada, será que alguém me consegue ajudar vendo o meu código? 
       
      Obrigado, Gonçalo Silva
      <?php $self = $_SERVER['PHP_SELF']; $host_name = "127.0.0.1"; $database = "visteon"; $username = "root"; $password = ""; $Tabela =""; try { $dbo = new PDO('mysql:host='.$host_name.';dbname='.$database, $username, $password); } catch (PDOException $e) { print "Error!: " . $e->getMessage() . "<br/>"; die(); } // Selecicionar Tabela if(!isset($_POST['submeterTabela']) && !isset($_POST['submeterDados'])) { $form ="<form action=\"$self\" method=\"post\">"; $result = $dbo->query("SHOW TABLES"); $form.= "<select name='Tabela' class='select_box'>"; while ($row = $result->fetch(PDO::FETCH_NUM)) { $form.= "<option value='$row[0]'>$row[0]</option>"; } $form.= "</select>"; $form.="<br><input type=\"submit\" name=\"submeterTabela\" value=\"Submeter\"class='button'>"; echo($form); } // Preencher dados if(isset($_POST['submeterTabela']) && !isset($_POST['submeterDados'])) { $Tabela=$_POST['Tabela']; $form ="<form action=\"$self\" method=\"post\">"; $form.="<input type=\"hidden\" name=\"Tabela\"class='tabela1'value=\"$Tabela\"> <br>"; $form.="Introduz Dados<br>"; $sql ="SHOW columns from ".$Tabela; $result = $dbo->query($sql); while ($row = $result->fetch(PDO::FETCH_NUM)) { $sql1="select Campo from descritivoscampos where Tabela='".$Tabela."' and Campo='".$row[0]."';"; $Resultado = $dbo->query($sql1); $linha = $Resultado->fetch(PDO::FETCH_NUM); $form .= "$linha[0]"; $form.="<input type=\"text\" name=\"$row[0]\" size=\"5\"><br>"; } $form.=" <br><input type=\"submit\" name=\"submeterDados\"class='botao'value=\"Submeter\">"; echo($form); } if(isset($_POST['submeterDados'])) { $Tabela=$_POST['Tabela']; $sql ="SHOW columns from ".$Tabela; $result = $dbo->query($sql); $sql1 = "insert into $Tabela("; $aux=0; while ($row = $result->fetch(PDO::FETCH_NUM)) { if ($aux!=0) $sql1 .=", "; if ($row[0]!='id') { $sql1 .="$row[0]"; $aux=1; } } $sql1 .=") values ("; $result = $dbo->query($sql); $aux=0; while ($row = $result->fetch(PDO::FETCH_NUM)) { if ($aux!=0) $sql1 .= ", "; if ($row[0]!='id') { $aa=$_POST[$row[0]]; $sql1 .="'$aa'"; //$sql1 .="$row[0]"; $aux=1; } } $sql1 .=");"; $conn = mysqli_connect($host_name, $username, $password, $database) or die("Could not connect."); $result = mysqli_query($conn, $sql1) or die("Could not execute SQL query"); if ($result) { echo("Informação introduzida com Sucesso!!"); } } ?> Sinceramente já não sei o que mais fazer necessito mesmo de uma ajuda. Obrigado.
    • By Samuel Pietro
      Tenho um select em PDO e preciso que a consulta retornada vire uma variavel, mas a variavel só pega a ultima linha da tabela e eu preciso que pegue todas as linhas que existirem.
       
      $conexao = conexao::getInstance(); $sql = 'SELECT * FROM RegistroE'; $stm = $conexao->prepare($sql); $stm->execute(); $Sql = $stm->fetchAll(PDO::FETCH_OBJ); foreach ($Sql as $SqlReg): $conteudo_meio = picture_X($SqlReg->E_01,1) .picture_X($SqlReg->E_02,25) .picture_9($SqlReg->E_03,4) .picture_X($SqlReg->E_04,14) .picture_9($SqlReg->E_05,8) .picture_9($SqlReg->E_06,8) .picture_9($SqlReg->E_07,8) .picture_9($SqlReg->E_08,8) .picture_9($SqlReg->E_09,8) .complementoRegistro(96,"brancos") .picture_9($SqlReg->E_11,1) .complementoRegistro(1,"brancos") ; endforeach; Como eu poderia está fazendo isto?
    • By jeff890
      Boa tarde pessoal.

      Estou precisando exibir na table, em forma de tabela, os resultado que uma query me retorna. O problema é que tenho que fazer isso de forma dinâmica, sem precisar acessar o nome das colunas da query. Quero que exiba os resultados automaticamente. Preciso exibir exatamente como o phpmyadmin exibe quando fazemos um query por la.
       
      Fiz assim (USANDO PDO)
       
      while($row = $stmt->fetch(PDO::FETCH_ASSOC)){                                                 foreach($row as $field => $value){                                                                            echo $field.": ".$value."<br>";                 }                 }     O problema é que dessa forma ele exibe o conteúdo em $field várias vezes. 
       
      Por exemplo:
      Da forma acima, é exibido assim:
      NOME | CPF | CURSO
      XXX | VVV | AAAA
      NOME | CPF | CURSO
      YY | BBB | DFAA
      NOME | CPF | CURSO
      YY | BBB | DFAA
       
      E assim sucessivamente, enquanto tiver resultados da query
       
      Mas preciso que fique assim:
      NOME | CPF | CURSO
      XXX | VVV | AAAA
      ]YY | BBB | DFAA
      YY | BBB | DFAA
       
      Entenderam?
    • By EHCampos
      Sou novo com PDO estou tentando fazer uma consulta em ordem decrescente porem não esta funcionando
      $usr= $pdo->prepare("SELECT * FROM usuario WHERE id = :id ORDER BY :rank DESC"); $usr->bindValue(':id', $_GET['id'], PDO::PARAM_INT); $usr->bindValue(':rank',$_GET['rank']); $usr->execute(); Quando executo um 
      $count = $usr->rowCount(); echo $count; Ele mostra corretamente a quantidade de registro.
      porem quando tento exibir os mesmos em um
      while($row=$usr->fetch( PDO::FETCH_ASSOC )) Ele não me retorna nem um resultado
       
      Se eu inserir diretamente no SELECT funciona normal
       
      $usr= $pdo->prepare("SELECT * FROM usuario WHERE id = :id ORDER BY $_GET['rank'] DESC"); $usr->bindValue(':id', $_GET['id'], PDO::PARAM_INT); //$usr->bindValue(':rank',$_GET['rank']); $usr->execute();  
×

Important Information

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