Ukládání do souboru – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Ukládání do souboru – PHP – Fórum – Programujte.comUkládání do souboru – PHP – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
fix0
Stálý člen
7. 5. 2019   #1
-
0
-

Ahoj všem, prosím si o radu s pomocí ukládání řádků databáze do souboru CSV.

V ve sloupečku message mám několikařádkovou zprávu např:

Ahoj,

jak se máš.

Ale můj kód ořízne to "jak se máš." Tedy do CSV mi zapíše pro ten sloupeček "message" pouze první řádek zprávy, čili pouze "Ahoj," zbytek ořízne.

Ahoj,

Takhle vypadá klíčová část mého kódu:

$formular = $_GET["formular"];
$terminOd = $_GET["od"];
$terminDo = $_GET["do"];
    
$sql = "SET NAMES utf8;";
$sql = "
    SELECT $dbtableForms.id,$dbtableRegistration.id AS id,$dbtableRegistration.id_form,$dbtableRegistration.date,$dbtableRegistration.name,$dbtableRegistration.email,$dbtableRegistration.message
    FROM $dbtableRegistration LEFT JOIN `$dbtableForms` ON $dbtableRegistration.id_form=$dbtableForms.id
    WHERE ($dbtableRegistration.id_form = $formular) AND ($dbtableRegistration.date BETWEEN '$terminOd' AND '$terminDo');
    ";
//echo $sql;
$result=mysqli_query($conn, $sql);

function mysqli_field_name($result, $field_offset)
{
    $properties = mysqli_fetch_field_direct($result, $field_offset);
    return is_object($properties) ? $properties->name : null;
}

function convertToWindowsCharset($string) {
  $encoding = mb_detect_encoding($string);
  return iconv($encoding, "Windows-1252", $string);
}

if (!$result) die('Couldn\'t fetch records');
$num_fields = mysqli_num_fields($result);
$headers = array();
for ($i = 0; $i < $num_fields; $i++) {
    $headers[] = mysqli_field_name($result , $i);
}

$fp = fopen('php://output', 'w');
if ($fp && $result) {
    // //header('Content-Encoding: UTF-8');
    // //header('Content-Encoding: Windows-1252');
    // header('Content-Type: text/csv');
    // //header('Content-Type: text/csv; charset=utf-8');
    // //header('Content-Type: text/csv; charset=Windows-1252');
    // header('Content-Disposition: attachment; filename="export.csv"');
    // header('Pragma: no-cache');
    // header('Expires: 0');
    
    header('Content-Description: File Transfer');
    header('Content-Type: text/csv; charset=UTF-16LE');
    header('Content-Disposition: attachment; filename=export.csv');
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    fputs( $fp, "\xEF\xBB\xBF" );

    fputcsv($fp,$headers,";",'"');
    while ($row = $result->fetch_array(MYSQLI_NUM)) {
        fputcsv($fp,array_values($row),";",'"');
    }
    die;
}

$conn->close();

Děkuji všem moc za rady.

Nahlásit jako SPAM
IP: 2a00:1028:83c8:319e:f08a:c102:25de:1aca...–
MilanL+1
Grafoman
8. 5. 2019   #2
-
0
-

#1 fix
myslím že ti to visí na odřádkování v té zprávě, měl bys nahradit znak/y/ nové řádky v té zprávě

Nahlásit jako SPAM
IP: 185.112.167.–
fix0
Stálý člen
8. 5. 2019   #3
-
0
-

Už to mám hodně zvráceným způsobem, ale nefunguje to ještě ideálně:

while ($row = $result->fetch_array(MYSQLI_NUM)) {
		$row = implode(" ",$row);
		$row = preg_replace("/(\/[^>]*>)([^<]*)(<)/","\\1\\3",$row);
		$row = explode(" ",$row);
		//fputcsv($fp,array_values($row),";",'"');
		fputcsv($fp,$row,";",'"');
    } 

Dělá to následující neplechu, každé slovo = řádek v CSV. Namísto, aby celá zpráva byla v jednom sloupečku s názvem "message".

Očekávání: "Ahoj, jak se máš"

Realita: "Ahoj," | "jak" | "se" | "máš."

Máte někdo prosím nápad co s tím, aby se to parsovalo do jednoho sloupce? Napdlo mě nahradit mezery za pomlčky. Ale to asi není ideální řešení. :-DDD

Nahlásit jako SPAM
IP: 2a00:1028:83c8:319e:f08a:c102:25de:1aca...–
gna
~ Anonymní uživatel
1891 příspěvků
8. 5. 2019   #4
-
0
-

Tak nečaruj a prostě se podívej, co tam máš.

$row = explode(" ",$row); // takhle samozřejmě bude každé slovo v samostatném sloupci
fputcsv($fp,$row,";",'"');
Nahlásit jako SPAM
IP: 213.211.51.–
fix0
Stálý člen
8. 5. 2019   #5
-
0
-

Já vím co tam mám a taky vím proč je každé slovo ve svém sloupci, jen nevím jak to opravit.

No už jsem to začaroval nejvíc shit způsobem co šlo:

fputcsv($fp,array('ID formuláře', 'ID registrace', 'Datum', 'Čas','Zpráva'),";",'"');
    while ($row = $result->fetch_array(MYSQLI_NUM)) {
		$row = implode(" ",$row);
		$row = str_replace(array("\n", "\r"), '', $row);
		
		
		$parts = explode(" Zpráva:",$row);

                // jednořádkové záznamy v DB
		$mystring0 = $parts['0'];

                // poslední víceřádkový záznam v DB
		$mystring1 = $parts['1'];
		
		$mystring1 = str_replace(" ","_",$row);
		$row = $mystring0 . ' ' . $mystring1;

		//echo $row;
		$row = explode(" ",$row);
		
		//fputcsv($fp,array_values($row),";",'"');
		fputcsv($fp,$row,";",'"'); 
    } 


Výsledek je něco takového (to "Zpráva: " je tam vždy, proto taky to taky rozděluji podle toho slova na jednořádkové záznamy vlevo a na víceřádkové.:

1;56;2019-06-03;Zpráva:_Ahoj,_jak_se_máš.

Nahlásit jako SPAM
IP: 109.81.211.–
Kit+15
Guru
8. 5. 2019   #6
-
0
-

#1 fix
Zkusil jsem příklad trochu oříznout 

<?php

$fp = STDOUT;
$id = 42;
$name = "Adam Bernau";

$row = [];
$row[] = $id;
$row[] = $name;
$row[] = <<<EOT
Ahoj,

jak se máš?
EOT;

fputcsv($fp, $row, ";", '"');

a funguje přesně tak, jak má:

42;"Adam Bernau";"Ahoj,

jak se máš?"

Chyba bude asi někde jinde, než v generování CSV.

BTW: Bylo by dobré poslat do databáze jako první příkaz: 

SET NAMES utf8;
Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
fix0
Stálý člen
8. 5. 2019   #7
-
0
-

Funguje to přesně opačně, než má. Ale cítím že už se blížíme k výsledku. I když je ti jasné, že se to všechno načítá z databáze? Snad i v rámci toho EOT půjde použít proměnná.

Očekávání CSV OK:
42;"Adam Bernau";"Ahoj, jak se máš?"
 

Moje řešení CSV OK, text fail:

42;"Adam Bernau";"Ahoj,_jak_se_máš?" 

Tvé řešení CSV fail:

42;"Adam Bernau";"Ahoj,

jak se máš?"
 

V DATABÁZI JE TO NA NĚKOLIK ŘÁDKŮ A V CSV TO MÁM DÍKY TOMU NA NĚKOLIK SLOUPCŮ V TOM JE PROBLÉM. Potřebuji, aby se ještě před CSV parsováním sloučily ty databázové několikařádkové zprávy do jednoho řádku, aby zpráva vznikla jako celistvý sloupec.

Jak to mám já v http://programujte.com/…-do-souboru/#… mi to funguje, jen jsou tam použité ty podtržítka, jinak by to nefungovalo. Potřebuji to aby, to fungovalo i bez podtržítek.

Ale už asi vím jak to vyřešit, budu to vypisovat z databáze běžným způsobem po proměnných a tu proměnnou se sloupcem zpráva budu moci sjednotit do jednoho řádku.

while($row = $result->fetch_assoc()) {
         // sloučení do jednoho řádku
         $row['message'] = str_replace(array("\n", "\r"), '', $row['message']);

DoCSV($row['id'],$row['registrace'],$row['datum']$row['cas'],$row['message']);

-------------------------------------------------------------------------------------------------

SET NAME používám, jen nevím či správně. Žádné problémy neřeším, tak předpokládám, že ano:

$sql = "SET NAMES utf8;";
$sql = "SELECT $dbtableForms.id,$dbtab  bla bla bla...

Ale možná je to ignrované, protože se ta proměnná v zápětí přepíše tou druhou a nevykoná se nic, možná by to mělo být takhle:

$sql = "SET NAMES utf8;";
$sql .= "SELECT $dbtableForms.id,$dbtab  bla bla bla...
Nahlásit jako SPAM
IP: 109.81.211.–
Řešení
Kit+15
Guru
8. 5. 2019   #8
-
+1
-
Zajímavé
fix +
Vyřešeno Nejlepší odpověď

#7 fix

<?php

$fp = STDOUT;
$id = 42;
$name = "Adam Bernau";
$text = <<<EOT
Ahoj,

jak se máš?
EOT;

$row = [];
$row[] = $id;
$row[] = $name;
$row[] = preg_replace('/\s+/', ' ', $text);
fputcsv($fp, $row, ";", '"');

Výstup: 

42;"Adam Bernau";"Ahoj, jak se máš?"

BTW: Ten SQL dotaz je nutné i odeslat. Obávám se, že dva SQL dotazy v jednom požadavku to nesežere.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
fix0
Stálý člen
8. 5. 2019   #9
-
0
-

Hotovo, díky moc.

Nahlásit jako SPAM
IP: 92.240.177.–
Kit+15
Guru
20. 5. 2019   #10
-
0
-

#10 PH
Asi sis spletl vlákno. Tvůj kód v PHP nefunguje.

Nahlásit jako SPAM
IP: 81.19.3.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
4016 příspěvků
21. 5. 2019   #11
-
0
-

Asi spam, klikl jsem Nahlasit moderatorum.

Nahlásit jako SPAM
IP: 2001:718:2601:258:4dbc:3838:5a25:f2e0...–
Kit+15
Guru
21. 5. 2019   #12
-
0
-

#12 peter
To nevypadá na spam, spíš na houbičky.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 13 hostů

Podobná vlákna

Ukládání do souboru — založil Ukládání do souborů?

Ukládání do souboru — založil Garret Raziel

Ukládání do souboru — založil Scrat

Ukládání do souboru — založil blizzard384

Ukladani do souboru — založil Qvido

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý