Ir para conteúdo

Arquivado

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

Rodrigo Ferreira Santos

[Resolvido] Ler arquivo texto e fazer uma consulta sql retornando o resultado mais de mil linhas!

Recommended Posts

Salve lista, senhores estou com um scrip que pega uma lista de numero de titulos(boletos) e forma um array depois eu queria fazer uma consulta em uma banco de dados sql para ver se o boleto esta la no banco o arquivo txt tem 1200 linhas cada uma com um codigo de titulo mas quando faço a consulta ele retorna somente o ultima !! veja

 

parte do arquivo texte:

 

8768
6104
5993
5873
6297
5064
4783
5619
6523
8764
8758
6648
5878
6013
8726
6463

 

parte do script php:

$arquivo = file('titulos.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
            foreach ($arquivo as $item) {
                //echo $item .'<br>';
            }

//$arquivo = "3148";
            $server = 'localhost';
            $user = 'root';
            $pass = 'xxxxxxx';
            $database = 'mkradius';

            $link = mysqli_connect($server, $user, $pass, $database)
                    or die('Nao foi possivel conectar a base' . mysqli_errno($link));
            $select = mysqli_select_db($link, $database);

            $sql = "select nome,formapag,datavenc,status,deltitulo,gerourem,valor,nossonum,";
            $sql .= "titulo,linhadig,codigo_barras from vtab_titulos where titulo like '$item'";

 

Ainda tem mais codigo onde formo o boleto novamente para ser pago coso encontrado o restante esta ok mas essa parte ta complicada !!

 

se alguem puder me ajudar fico grato !!!

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rodrigo Ferreira Santos, joia!

Se entendi o problema, basta trocar isso:

$arquivo = file('titulos.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
            foreach ($arquivo as $item) {
                //echo $item .'<br>';
            }

Por isso: 

$arquivo = file('titulos.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

$itens = implode($arquivo, ',');

E isso:  

where titulo like '$item'";

Por isso:

WHERE titulo in ($itens)


 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola EdCesar obrigado por sua resposta amigo, fiz como citado acima mas nao deu resultado agora nem a ultima linha ele mostra, veja so eu tenho um arquivo texto com 1200 linhas cada um e um codigo de um titulo oque eu preciso e so gerar um array e fazer a consulta mas nao esta funcionando assim ! da forma que esta ele mostra somente o ultimo boleto quando dou um vardump na variavel ele mostra o array com todas as linhas e titulos !!

Compartilhar este post


Link para o post
Compartilhar em outros sites

A solução do @EdCesar faz todo sentido, conforme exemplo abaixo, estou utilizando o PDO com o SQLITE como banco, porem o exemplo é só prova de conceito.

<?php
///Cria e conecta ao banco na memória.
$pdo = new PDO('sqlite::memory:');

///Cria a tabela de teste
$pdo->exec('CREATE TABLE vtab_titulos(id integer primary key, nome varchar(255), titulo varchar(255))');
///Insere os dados
$pdo->exec('INSERT INTO vtab_titulos(id, nome, titulo) VALUES (1, "primeiro", 1111), (2, "segundo", 2222), (3, "terceiro", 3333), (4, "quarto", 4444)');

///Lê o conteúdo do arquivo
//$linhas = file("arquivo.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
///Simula o retorno da função file
$linhas = ['2222', '4444'];

///remove os espaços, necessário apenas caso o arquivo possua espaços em branco nas linhas e/ou exista algum problema na leitura devido ao final de linha do arquivo.
$linhas = array_map('trim', $linhas);

///Trata o conteúdo e adiciona as aspas, em principio adicionar as aspas é desnecessário, mas estou assumindo que no seu banco o campo titulo seja do tipo texto e isso possa estar causando algum problema.
$linhas = array_map([$pdo, 'quote'], $linhas);
///Equivalente a linha anterior
//$linhas = array_map(function($v) use ($pdo) { return $pdo->quote($v); }, $linhas);
///Exemplo utilizando a api do mysqli
//$linhas = array_map(function($v) use($link) { return "'".mysqli_real_escape_string($link, $v)."'"; }, $linhas);

//Concatena todos os valores do array separados por virgula
$itens = implode(', ', $linhas);

//Monta a consulta
$sql = "SELECT * FROM vtab_titulos WHERE titulo IN ($itens)";

//Executa a consulta
$st = $pdo->query($sql);

//Carrega os resultados
$rows = $st->fetchAll(PDO::FETCH_ASSOC);

//Imprime a consulta utilizada
echo $sql;
//Imprime o resultado da consulta
echo '<pre>', print_r($rows, true), '</pre>';
?>

Pode testá-lo em http://phpfiddle.org/.

 

Acredito que exista algum detalhe adicional no arquivo e/ou código posterior ao seu exemplo.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou postar todo o meu codigo aqui veja , esse script le um arquivo texto e gera um lista dos boletos com codigo de barras:

<html>
    <title></title>
    <head>
        <!-- Estilos necessários para o tema do tablesorter -->
        <link rel="stylesheet" href="css/blue/style.css">

        <!-- jQuery e Tablesorter -->
        <script src="js/jquery-latest.js"></script>
        <script src="js/jquery.tablesorter.min.js"></script>

        <!-- Meu script -->
        <script src="js/scripts.js"></script>
    </head><p>
    <table class="tablesorter" border="1" width="1300" align="center">
        <thead>
            <tr>
                <th>Nome</th>
                <th>forma pago</th>
                <th>Data pago</th>
                <th>Status</th>
                <th>Deletado?</th>
                <th>Gerou Remessa</th>
                <th>Valor</th>
                <th>Nosso Numero</th>
                <th>Numero Titulo</th>
                <th>Linha Digitavel / Codigo Barras</th>
                <th>Status</th>
            </tr>
        </thead>
        <tbody>
            <?php
            $arquivo = file('titulos.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
            foreach ($arquivo as $item) {
                //echo $item .'<br>';
            }

//$arquivo = "3148";
            $server = 'localhost';
            $user = 'root';
            $pass = 'xxxxxxxx';
            $database = 'xxxxxxxx';

            $link = mysqli_connect($server, $user, $pass, $database)
                    or die('Nao foi possivel conectar a base' . mysqli_errno($link));
            $select = mysqli_select_db($link, $database);

            $sql = "select nome,formapag,datavenc,status,deltitulo,gerourem,valor,nossonum,";
            $sql .= "titulo,linhadig,codigo_barras from vtab_titulos where titulo like '$item'";




//print_r($arquivo);
            ?>

            <?php
            $result = mysqli_query($link, $sql);
            while ($tbl = mysqli_fetch_array($result)) {
                $nome = $tbl["nome"];
                $formapag = $tbl["formapag"];
                $datavenc = $tbl["datavenc"];
                $status = $tbl["status"];
                $deltitulo = $tbl["deltitulo"];
                $gerourem = $tbl["gerourem"];
                $valor = $tbl["valor"];
                $nossonum = $tbl["nossonum"];
                $titulo = $tbl["titulo"];
                $linhadig = $tbl["linhadig"];
                $codigo_barras = $tbl["codigo_barras"];
                echo "<tr>";
                echo "<td>$nome</td>";
                echo "<td>$formapag</td>";
                echo "<td>$datavenc</td>";
                echo "<td>$status</td>";
                echo "<td>";
                if ($deltitulo == '0') {
                    echo "Nao";
                } else {

                    echo "Sim";
                }


                echo "</td>";
                echo "<td>$gerourem</td>";
                echo "<td>R$$valor</td>";
                echo "<td>$nossonum</td>";
                echo "<td>$titulo</td>";
                echo "<td>$linhadig<br>";
                echo fbarcode($codigo_barras);
                echo "</td>";
                echo "<td>";
                if (in_array($titulo, $arquivo)) {
                    echo "<font color=red><b>ESTA NO BANCO !</b></font>";
                } else {
                    echo "<font color=gren><b>NAO ESTA NO BANCO</b></font>";
                }
                echo "</td>";
                echo "</tr>";
            }
//var_dump($arquivo);
            ?>
        </tbody>
    </table>

            <?php

            function fbarcode($valor2) {

                $fino = 1;
                $largo = 3;
                $altura = 50;

                $barcodes[0] = "00110";
                $barcodes[1] = "10001";
                $barcodes[2] = "01001";
                $barcodes[3] = "11000";
                $barcodes[4] = "00101";
                $barcodes[5] = "10100";
                $barcodes[6] = "01100";
                $barcodes[7] = "00011";
                $barcodes[8] = "10010";
                $barcodes[9] = "01010";
                for ($f1 = 9; $f1 >= 0; $f1--) {
                    for ($f2 = 9; $f2 >= 0; $f2--) {
                        $f = ($f1 * 10) + $f2;
                        $texto = "";
                        for ($i = 1; $i < 6; $i++) {
                            $texto .= substr($barcodes[$f1], ($i - 1), 1) . substr($barcodes[$f2], ($i - 1), 1);
                        }
                        $barcodes[$f] = $texto;
                    }
                }


//Desenho da barra
//Guarda inicial
                ?>
        <html>
            <head>
                <title>Código de Barras 2 of 5 em PHP</title>
                <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
            </head>

            <body bgcolor="#FFFFFF" text="#000000">
                <br>
                <img src=p.gif width=<?= $fino ?> height=<?= $altura ?> border=0><img
                    src=b.gif width=<?= $fino ?> height=<?= $altura ?> border=0><img
                    src=p.gif width=<?= $fino ?> height=<?= $altura ?> border=0><img
                    src=b.gif width=<?= $fino ?> height=<?= $altura ?> border=0><img
    <?php
    $texto = $valor2;
    if ((strlen($texto) % 2) <> 0) {
        $texto = "0" . $texto;
    }

// Draw dos dados
    while (strlen($texto) > 0) {
        $i = round(esquerda($texto, 2));
        $texto = direita($texto, strlen($texto) - 2);
        $f = $barcodes[$i];
        for ($i = 1; $i < 11; $i += 2) {
            if (substr($f, ($i - 1), 1) == "0") {
                $f1 = $fino;
            } else {
                $f1 = $largo;
            }
            ?>
                            src=p.gif width=<?= $f1 ?> height=<?= $altura ?> border=0><img
                            <?php
                            if (substr($f, $i, 1) == "0") {
                                $f2 = $fino;
                            } else {
                                $f2 = $largo;
                            }
                            ?>
                            src=b.gif width=<?= $f2 ?> height=<?= $altura ?> border=0><img
                            <?php
                        }
                    }

// Draw guarda final
                    ?>
                    src=p.gif width=<?= $largo ?> height=<?= $altura ?> border=0><img
                    src=b.gif width=<?= $fino ?> height=<?= $altura ?> border=0><img
                    src=p.gif width=<?= 1 ?> height=<?= $altura ?> border=0>
                    <?php
                }

//Fim da função

                function esquerda($entra, $comp) {
                    return substr($entra, 0, $comp);
                }

                function direita($entra, $comp) {
                    return substr($entra, strlen($entra) - $comp, $comp);
                }

                ini_set('display_errors', true);
                error_reporting(E_ALL);
                ?>
        </p>    
</html>

 

No meu caso as linhas estao abaixo uma da outra assim veja :

2708
2827
2658
3326
3512
3593
2705
2485
2832
3089
2618
2930
2819
3571
3560
3508
3101
3563
3411
3344
3293
3091
2891
3390
3289
3389
2585
3020

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça as alterações que o @EdCesar sugeriu e altere a seguinte linha

$result = mysqli_query($link, $sql);

Para

echo '<pre>-----Inicio das informações-----';
var_dump($sql);

$result = mysqli_query($link, $sql);

var_dump($result);
echo mysqli_error($link);
echo '-----Fim das informações-----</pre>';

E se possível poste o que for impresso entre -----Inicio das informações----- e -----Fim das informações-----.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rodrigo Ferreira Santos, @HwapX beleza!


HwapX, parece que ele precisa fazer a buscar na base, com like mesmo
 

Rodrigo, o primeiro exemplo que o HwapX deu funciona perfeitamente!
Caso você realmente precise de um like, então apenas faça as modificações abaixo, na sugestão que lhe dei. E, caso funcione, sugiro revisar esse modelo de negocio, pois nesse caso, me parece que os dados estão sujeitos a distorções, por exemplo:

Se no arquivo contiver o valor 222, e na base existir 222, 2222, 11222 Então ira trazer os três resultados, isso estaria correto?

$itens = implode($arquivo, '|');

E

WHERE titulo REGEXP '$itens'

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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