SQL Database exporteren naar Excel (.CSV-file)

Status
Niet open voor verdere reacties.

Timmy Ownage

Gebruiker
Lid geworden
11 jan 2008
Berichten
60
Hallo,

Ik zit met een probleem. Ik wil graag mijn data van twee SQL-tabellen exporteren naar excel en zo dat deze gecombineerd worden in 1 excel-bestand. Even uitleggen:
Mijn database ziet er zo uit:
Tabel vragen:
2zqhnww.png


Tabel antwoorden:
28tgjuq.png


Ik ben al een heel end met de code. De code ziet er nu zo uit:
Excel.php
PHP:
<?php
$host = "mysql11.000webhost.com";
$db = "*******_enquete";
$user = "********_enquete";
$pass = "*******";

// Connect to the database
$link = mysql_connect($host, $user, $pass);
mysql_select_db($db);
 
require 'exportcsv.inc.php';
 
$table="vragen"; // this is the tablename that you want to export to csv from mysql.

exportMysqlToCsv($table);
 
?>

exportcsv.inc.php
PHP:
<?php
 
function exportMysqlToCsv($table,$filename = 'export.csv')
{
    $csv_terminated = "\n";
    $csv_separator = ",";
    $csv_enclosed = '"';
    $csv_escaped = "\\";
    $sql_query = "select vraag from vragen where id>0";
	
    // Gets the data from the database
    $result = mysql_query($sql_query);
    $fields_cnt = mysql_num_fields($result);
 
    $schema_insert = '';
 
    for ($i = 0; $i < $fields_cnt; $i++)
    {
        $l = $csv_enclosed . str_replace($csv_enclosed, $csv_escaped . $csv_enclosed,
            stripslashes(mysql_field_name($result, $i))) . $csv_enclosed;
        $schema_insert .= $l;
        $schema_insert .= $csv_separator;
    } // end for
 
    $out = trim(substr($schema_insert, 0, -1));
    $out .= $csv_terminated;
 
    // Format the data
    while ($row = mysql_fetch_array($result))
    {
        $schema_insert = '';
        for ($j = 0; $j < $fields_cnt; $j++)
        {
            if ($row[$j] == '0' || $row[$j] != '')
            {
 
                if ($csv_enclosed == '')
                {
                    $schema_insert .= $row[$j];
                } else
                {
                    $schema_insert .= $csv_enclosed . 
					str_replace($csv_enclosed, $csv_escaped . $csv_enclosed, $row[$j]) . $csv_enclosed;
                }
            } else
            {
                $schema_insert .= '';
            }
 
            if ($j < $fields_cnt - 1)
            {
                $schema_insert .= $csv_separator;
            }
        } // end for
 
        $out .= $schema_insert;
        $out .= $csv_terminated;
    } // end while
 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Content-Length: " . strlen($out));
    // Output to browser with appropriate mime type, you choose ;)
    header("Content-type: text/x-csv");
    //header("Content-type: text/csv");
    //header("Content-type: application/csv");
    header("Content-Disposition: attachment; filename=$filename");
    echo $out;
    exit;
 
}
 
?>

Als ik momenteel met deze code excel.php uitvoer, dan krijg ik dit excel bestand:
167qj5y.png


Ik wil echter dat ook de antwoorden nog ingevoegd worden, namelijk in dit formaat:
289vk82.png


Zoals je al kon zien zijn de antwoorden in dit formaat weergegeven in de database: 3|2|1 1|2|3 etc. waar 1 correspondeert met antwoord 1, 2 met antwoord 2 enzovoort.

Mijn probleem is nu hoe ik dat netjes naast elkaar weer kan geven. De vragen heb ik dus nu al netjes onder elkaar. Ik wil nu dat de antwoorden nog naast de vragen worden weergegeven, zie ook de foto hier boven. Als dit lukt kan ik voor de "klant" een codetabel bijvoegen, waaruit hij kan aflezen welk nummer correspondeert met welk antwoord. Dit is overigens een examenopdracht voor informatica. Ik heb al ruim 10 uur geëxperimenteerd met coderen en dergelijke maar kom er niet uit. Als laatste wanhoopspoging heb ik hier maar een bericht geplaatst. Hopelijk kan iemand me helpen! Als er nog enige informatie ontbreekt, zeg het dan even en ik zal binnen enkele uren reageren.
 
Laatst bewerkt:
Heb je de 'Exporteer als excel stylesheet' al geprobeerd in phpMyAdmin? Volgensmij ondersteunt die dat ook gewoon namelijk?
 
Heb je de 'Exporteer als excel stylesheet' al geprobeerd in phpMyAdmin? Volgensmij ondersteunt die dat ook gewoon namelijk?
Ja, dat werkt prima maar dat mag niet van de leraar. Het moet per se in PHP of een andere programmeertaal.
 
Ah voor een schoolopdracht, dan wordt het idd lastig :)

Hm, ik heb hier helaas geen Excel en ik weet er ook weinig vanaf dus ik vrees dat ik je niet echt verder kan helpen dan :(
 
Ik denk dat je met de functie om de antwoorden in een array te pompen
PHP:
explode('|', $str)

wel een idee gaat krijgen hoe je verder moet.
 
Laatst bewerkt:
Ik denk dat je met de functie om de antwoorden in een array te pompen
PHP:
explode('|', $str)

wel een idee gaat krijgen hoe je verder moet.
Ik had inderdaad al iets geprobeerd met dit:
PHP:
$antwoord = explode('|',$data['antwoorden']);

Ik heb overigens verder niet echt een idee waar ik dat moet plaatsen in mijn 'exportcsv.inc.php'-file. Ik had al veel geprobeerd, maar zonder resultaat. Het verste dat ik kwam was dat die alle entries weghaalde, en er dus alleen nog maar de tabelnaam stond.
 
Laatst bewerkt:
Misschien iets omslachtig maar misschien we ter verduidelijking:

haal alle antwoorden op en een functie en genereer daar (met behulp van explode) een 2 dimensionale array mee (3 kolommen en rijen alnaar gelang je beantwoorders hebt)

Dan kun je een rij maken door eerst de vraag en dan te "loopen" door de antwoordarray en alle antwoorden op die vraag op te halen.
Dat doe je 3 keer (per vraag 1 x)

(zoals je ziet probeer ik te helpen door mee te denken en niet voor je te programmeren ;))
 
Misschien iets omslachtig maar misschien we ter verduidelijking:

haal alle antwoorden op en een functie en genereer daar (met behulp van explode) een 2 dimensionale array mee (3 kolommen en rijen alnaar gelang je beantwoorders hebt)

Dan kun je een rij maken door eerst de vraag en dan te "loopen" door de antwoordarray en alle antwoorden op die vraag op te halen.
Dat doe je 3 keer (per vraag 1 x)

(zoals je ziet probeer ik te helpen door mee te denken en niet voor je te programmeren ;))
Ja, ik ga het zo wel even proberen. Anders kan hopelijk iemand wel wat voor me programmeren. Ik laat wel zien wat ik heb.

Ik heb verder weinig ervaring met PHP, maar voel het programmeren wel goed aan. De leraar verwacht toch dat het ons lukt.

Je zegt trouwens dat ik dit drie keer moet doen, voor elke vraag een keer. Dat lijkt me een slecht idee, aangezien dit gewoon een test is en de echte enquête 20 vragen of meer zal bevatten.

EDIT: Dat ga ik zo niet doen... dan moet ik dat straks voor alle 20 vragen doen en daar wordt de code ook erg messy van... Kan je niet iets met een while-statement doen ofzo?
 
Laatst bewerkt:
Je kunt het natuurlijk ook kortter doen door in dezelfde array de vragen erbijin te zetten, dan is het daarna alleen nog maar weergeven vanuit de array
 
Je kunt het natuurlijk ook kortter doen door in dezelfde array de vragen erbijin te zetten, dan is het daarna alleen nog maar weergeven vanuit de array
Ik waardeer je hulp, eerlijk waar, maar zoals ik al zei heb ik weinig ervaring met PHP. Ik wil graag leren, maar ik heb echt geen flauw idee waar ik moet beginnen. Het meeste van deze code heb ik ook van internet en ik wil het graag zo veranderen dat het werkt zoals ik het wil. Ik ben bereid er wat voor te doen, maar ik heb nu echt geen flauw idee wat te doen. Je hoeft echt niet die hele code voor me te programmeren, ik ben al blij DAT iemand me helpt, maar op dit moment heb ik echt geen flauw idee waar ik moet beginnen... :/
 
Wat betreft het gebruik van een array zaten de vorige posters op de juiste lijn. Het enige afwijkende in dit geval is dat de data uiteindelijk van links naar rechts in de csv moet komen terwijl je data bij standaard php/html van boven naar onder weergeeft.
PHP:
<?php
	$out = "";
	$filename = "blaat.csv";
	$uitvoer = array();
	$link = mysql_connect("localhost", "root", "");
	mysql_select_db("test");
	$sql = "select vraag from vragen";
	$result = mysql_query($sql);
	if (!$result) { die(mysql_error());}
	if (mysql_num_rows($result) > 0) {
		$oplossingen = array();
		while ($row = mysql_fetch_assoc($result)) {
			$oplossingen[] = $row["vraag"];
		}
		$uitvoer[] = $oplossingen;
	}
	$sql = "select antwoorden from antwoorden";
	$result = mysql_query($sql);
	if (!$result) { die(mysql_error());}
	if (mysql_num_rows($result) > 0) {
		while ($row = mysql_fetch_assoc($result)) {
			$uitvoer[] = explode("|",$row["antwoorden"]);
		}
	}
	for ($u=0;$u<count($uitvoer[0]);$u+=1) {
		for ($i=0;$i<count($uitvoer);$i+=1) {
			$out .= $uitvoer[$i][$u].";";
		}
		$out .= "\n";
	}
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Content-Length: " . strlen($out));
    header("Content-type: text/x-csv");
    header("Content-Disposition: attachment; filename=$filename");
    echo $out;
    exit;
?>
Om dit op de lossen kun je als eerste deel van de multidimensionale array de vragen alvast erin zetten (regels 7 t/m 16). Om de data ook daadwerkelijk horizontaal weer te geven kun je een dubbele for loop gebruiken waarbij de ene loop afhankelijk is van het aantal vragen en de andere afhankelijk van de totale grootte van de array (regels 25 tot 30).
 
Wat betreft het gebruik van een array zaten de vorige posters op de juiste lijn. Het enige afwijkende in dit geval is dat de data uiteindelijk van links naar rechts in de csv moet komen terwijl je data bij standaard php/html van boven naar onder weergeeft.
PHP:
<?php
	$out = "";
	$filename = "blaat.csv";
	$uitvoer = array();
	$link = mysql_connect("localhost", "root", "");
	mysql_select_db("test");
	$sql = "select vraag from vragen";
	$result = mysql_query($sql);
	if (!$result) { die(mysql_error());}
	if (mysql_num_rows($result) > 0) {
		$oplossingen = array();
		while ($row = mysql_fetch_assoc($result)) {
			$oplossingen[] = $row["vraag"];
		}
		$uitvoer[] = $oplossingen;
	}
	$sql = "select antwoorden from antwoorden";
	$result = mysql_query($sql);
	if (!$result) { die(mysql_error());}
	if (mysql_num_rows($result) > 0) {
		while ($row = mysql_fetch_assoc($result)) {
			$uitvoer[] = explode("|",$row["antwoorden"]);
		}
	}
	for ($u=0;$u<count($uitvoer[0]);$u+=1) {
		for ($i=0;$i<count($uitvoer);$i+=1) {
			$out .= $uitvoer[$i][$u].";";
		}
		$out .= "\n";
	}
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Content-Length: " . strlen($out));
    header("Content-type: text/x-csv");
    header("Content-Disposition: attachment; filename=$filename");
    echo $out;
    exit;
?>
Om dit op de lossen kun je als eerste deel van de multidimensionale array de vragen alvast erin zetten (regels 7 t/m 16). Om de data ook daadwerkelijk horizontaal weer te geven kun je een dubbele for loop gebruiken waarbij de ene loop afhankelijk is van het aantal vragen en de andere afhankelijk van de totale grootte van de array (regels 25 tot 30).
Okeeeeeeeeee cheers bro :thumb:

Dit stukje geweldigheid ga ik even verwerken :)
 
Ik wil nu graag ook dat de vragen naast elkaar weergegeven worden, en de antwoorden eronder (dit bleek voor verwerking toch makkelijker te zijn...).

PHP:
<?php
    $out = "";
    $filename = "Enquete.csv";
    $uitvoer = array();
    $link = mysql_connect("mysql10.000webhost.com", "*****", "*******");
    mysql_select_db("***********");
    $sql = "select vraag from vragen";
    $result = mysql_query($sql);
    if (!$result) { die(mysql_error());}
    if (mysql_num_rows($result) > 0) {
        $oplossingen = array();
        while ($row = mysql_fetch_assoc($result)) {
            $oplossingen[] = $row["vraag"];
        }
        $uitvoer[] = $oplossingen;
    }
    $sql = "select antwoorden from antwoorden";
    $result = mysql_query($sql);
    if (!$result) { die(mysql_error());}
    if (mysql_num_rows($result) > 0) {
        while ($row = mysql_fetch_assoc($result)) {
            $uitvoer[] = explode("|",$row["antwoorden"]);
        }
    }
    for ($u=0;$u<count($uitvoer[0]);$u+=1) {
        for ($i=0;$i<count($uitvoer);$i+=1) {
            $out .= $uitvoer[$i][$u].";";
        }
        $out .= "\n";
    }
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Content-Length: " . strlen($out));
    header("Content-type: text/x-csv");
    header("Content-Disposition: attachment; filename=$filename");
    echo $out;
    exit;
?>

Dat is het script nu. Hij zet nu de vragen onder elkaar en de antwoorden ernaast. Ik wil nu graag alle vragen naast elkaar hebben, en daaronder (voor elke vraag) het bijbehorende antwoord. Ik heb al veel geprobeerd, maar zonder resultaat. Nog even een snelle schets ter illustratie:
66vhib.png


Dat is dus hoe ik graag wil dat het wordt. Kan iemand me helpen?
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan