Ir para conteúdo

POWERED BY:

Arquivado

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

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.

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • 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 Luiz Henrique
      Olá,
       
      Preciso fazer uma inserção no DB de registros referente a pagamentos, quando for no crédito será realizado o insert com sua respectiva data de compensação e valor da parcela exemplo:
       3 parcelas de 100.00 e cada registro em seu devido mês:
      INSERT INTO tabela (valor, data) VALUES (100, 2022-08-17),(100, 2022-09-17),(100, 2022-10-17) É mais eficiente fazer da forma acima ou colocar 3 INSERT?
      Ou existe forma melhor de fazer isso?
       
      Obrigado.,
       
    • Por Marcones Borges
      Olá, estou precisando de uma ajuda...
       
      Tenho duas tabelas
      ministros
      entradas
       
      Preciso exibir a lista dos ministros que não contam no relatório gerado em entradas.
       
      Fiz assim a combinação.
       

      $sql = "SELECT ministro.id, ministro.area, entrada.beneficiario, entrada.id_benificiario, entrada.id_benificiario, entrada.tipo_lancamento FROM ministro INNER JOIN entrada ON ministro.id = entrada.id_benificiario WHERE ministro.area = entrada.area_beneficiario AND ministro.nome = entrada.beneficiario AND entrada.id_benificiario='[{$id_exer}' AND entrada.tipo_lancamento='ministro'  "; $stm = $conexao->prepare($sql); $stm->execute(); $clientes = $stm->fetchAll(PDO::FETCH_OBJ);
       
      Fiz as combinações direitinho mais não consigui exbir os que estão na tabela ministro e não estão na tabela entrada.
    • Por Marcones Borges
      Olá, sou iniciante em php, estou tentando migrar um código de php 5.6 para pdo mais da erro, não roda....
      Alguém pode me ajudar?

      include '../Connections/functions.php';           function montaSelect()         {  $sql = "SELECT * FROM membros"; $result = $con->query($sql); if ($result->num_rows > 0 )  {   while($dados = $result->fetch_assoc())   {   $opt .= '<option value="'.$dados['id'].'">'.$dados['nome'].'</option>';   } } else {           $opt = '<option value="0">Nenhum Membro cadastrado</option>';     return $opt; }         }
       
      Este era o código original:
       

      // require 'topof.php'; // echo $usuario;         /**          * função que retorna o select          */         function montaSelect()         {                 $sql = "SELECT id, nome FROM membros '";                 $query = mysql_query( $sql );                 if( mysql_num_rows( $query ) > 0 )                 {                         while( $dados = mysql_fetch_assoc( $query ) )                         {                                 $opt .= '<option value="'.$dados['id'].'">'.$dados['nome'].'</option>';                         }                 }                 else                         $opt = '<option value="0">Nenhum Membro cadastrado</option>';                 return $opt;         }
    • Por Sapinn
      Recentemente, o seguinte erro estava aparecendo em meu site 'max_user_connections', depois de muitas pesquisas descobri que o problema era devido a uma conexão persistente de banco de dados, então o removi do meu código e funcionou. Outro problema surgiu agora, meu lastInsertId () está retornando 0. Quando eu uso a conexão persistente, ele funciona se eu removê-lo, ele falha. Eu nem sei mais o que fazer. Vou deixar as partes mais importantes do meu código aqui:
      Conexão:
      public function __construct()     {         $dsn = 'mysql:host='.$this->host.';dbname='.$this->bank;            try {             $this->dbh = new PDO($dsn,$this->user,$this->password);             $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);                               } catch (PDOException $e) {             print "Error!: " . $e->getMessage() . "<br/>";             die();         }               }     public function lastId Inserted(){         return $this->dbh->lastInsertId();     }  
      Pesquisando pelo último Id:
       
       if($this->saleModel->store($data)):                             $sale_id = $this->db->lastId Inserted();                                                         $data['sale_id'] = $sale_id;                             $this->sellModel->sellProduct($data);                             $total = $stock->quant_product - $data['quant_sale'];                             $this->ProductModel->decreaseSales($data['product_id'],$total);                             Url::redirect('sales/sellProducts/'.$sale_id.'');                         endif;  
×

Informação importante

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