GET nach , trennen und in for einbauen

Liebe/-r Experte/-in,

ich habe folgendes Problem.

(Daten befinden sich ganz unten zum anschauen.)

Ich möchte eine CSV-Datei erstellen, die mit Angaben in der URL als get, ausgegeben wird.

Beispiel:

csv_erzeuger.php?feld=id,Artikelname,Preis

hier muss die GET-Variabel drin stehen:
$Spalte[] = str_replace(""", „“"", $Daten->HIER);

Dann sollen die genannten (man weiss ja nicht wieviele es sind…) da eingegeben werden.

Was nur funktioniert, ist OHNE den Parametern, da ich nicht weiss, wie ich nach dem , trenne, und die dann ausgebe.

Wie bekomme ich es hin, das ich die angegebenen Parametern, ausgebe?

Quatsch mit sauce ist auch mit im unten genannten Quelltext, probiert hatte ich es.

Wenn ich es so versuche, lädt die Seite mehrere MB!!! mit fehlermeldungen. über tausende seiten.

Vielen Dank!
Flo

PHP:

<?php #nur das relevante, db-connect usw. nicht)
$ResultPointer = mysql\_query("SELECT \* FROM $Tabellennamen"); for($i = 0, $Export = ""; $i \< mysql\_num\_rows($ResultPointer); $i++) { $Daten = mysql\_fetch\_object($ResultPointer); /\* function regex\_explode($string) { preg\_match\_all('/(?\<=^|,)(?:{[^{}]\*}|[^,]\*)/', $string, $matches); return current($matches); } $feld = $\_GET['feld']; echo ' '; print\_r(regex\_explode($feld)); echo ''; \*/ # $news = implode (",", $\_GET['feld']); # print $news; /\* $feld = $\_GET['feld']; $avar = explode(",", $feld); $len = count($avar); for ($i=0; $i\n", $i, $avar[$i]); printf("%: %s \n", $i, $avar[$i]); \*/ $Spalte[] = str\_replace("\"", "\"\"", $Daten-\>Auktionsende); $Spalte[] = str\_replace("\"", "\"\"", $Daten-\>Auktionsende); # $Spalte[] = date("d.m.Y", $Daten-\>Auktionsende); $Spalte[] = str\_replace("\"", "\"\"", $Daten-\>Artikelnummer); $Spalte[] = str\_replace("\"", "\"\"", $Daten-\>Artikelname); $Spalte[] = str\_replace("\"", "\"\"", $Daten-&gt:stuck\_out\_tongue\_winking\_eye:reis); $Spalte[] = str\_replace("\"", "\"\"", $Daten-\>Verkaeufer); $Spalte[] = str\_replace("\"", "\"\"", $Daten-\>Kommentar); $Spalte[] = str\_replace("\"", "\"\"", $Daten-\>Bild\_dateiname); $Spalte[] = str\_replace("\"", "\"\"", $Daten-\>Kategorie); for($j = 0; $j

Sorry. Bitte schreib in ordentlichem Deutsch, und verkürze den Quellcode auf das wirklich Notwendige. Ich verstehe deine Frage nicht.

Anstelle von count() und for() kannst du auch foreach() nehmen.

Anstelle von CSV solltest du dir evtl. json_encode() ansehen. Das ist im Grunde eine standardisierte Form von CSV.

Was du mit der „get-variablen“ vor hast, verstehe ich aber immer noch nicht.

hallo,

ich hoffe mal dien problem verstanden zu haben.

die zu exportierenden felder ueber die get-parameter auszulesen hast du ja schon drin:

$fields = explode(',', $\_GET['field']);

dann hast du ein array $fields mit den jeweiligen feldern.

um nur diese felder zu exportieren musst du mal folgendes versuchen (innerhalb der schleife ueber die datensatze zu verwenden):

$values = array();
foreach ($fields as $f) {
 $values[] = $Daten-\>{$f};
}
$Export.= implode(';', $values) . "\r\n";

dieser kleine block schreibt dir alle gewuenschten felder aus deinem $Daten-Objekt in die $Export.

habe daran nichts getestet da ich ja deine daten und entwicklungsumgebung nicht kenne, ist aber hoffentlich ein kleiner anschub auf die schnelle.

besten gruss,
timo

Hallo Flo,

ersetze das
for($i = 0, $Export = „“; $i TAB_NAME einzeln aufrufen.

Was du genau mit den ganzen str_replace Funktionen willst, ist mir unklar.
Maskieren kannst du auch mit der Funktion mysql_real_escape_string($_GET[‚feld‘])

Und um ein Array in eine CSV zu schreiben, gibt es auch eine Funktion: fputcsv()

Am besten schaust du dir mal die die PHP Doku an:
http://de2.php.net/manual/de/index.php

Liebe Grüße
Lars Friedrich
www.codingcoast.cc

Hallo,

bitte sei mir nicht böse, aber in deinem Fall würde ich mir mal ein gutes PHP Buch kaufen und mich auch mal mit der Grundmaterie von Webprogrammierung auseinander setzen.

Guck mal hier:
http://de.wikipedia.org/wiki/URL-Encoding
http://php.net/manual/de/function.urlencode.php

Liebe Grüße
Richie

Hi,

ich versteh die Anfrage nicht so ganz, aber ich versuch mal mein Glück.

csv_erzeuger.php?feld=id,Artikelname,Preis

Ich nehme an das man nun nur id,Artikelname und Preis im CSV haben möchte. Aber woher kommt das WHERE statement?

$fields[] = explode(",", $_GET[„feld“]);

var_dump($Spalte);

Output…
$fields[0] = id;
$fields[1] = Artikelname;
$fields[2] = Preis;

Der explode ist nicht notwendig, allerdings eine Prüfung der GET Variable, die ich hier mal weg lasse.

SELECT $_GET[„feld“] FROM TABLE WHERE ???=???

Ich komm allerdings nicht hinterher warum man nur bestimmte Felder ausgeben will und diese dann noch per GET übermitteln will. Wenn man keinen weiteren Prüfungen einbaut, erlaubt man es den gesamten DB Inhalb abzurufen.

Wenn man den Output der DB nimmt und es stat str_replace mit einem implode versucht, wäre es sicher einfacher.

Vielleicht wäre statt des mysql_fetch_object ein mysql_fetch_result angebrachter, es sei denn Du bist mit Objekten vertraut.

/STefan

Hallo Flo,

ich bin mir nicht sicher, ob ich dich richtig verstanden habe. Du willst eine CSV-Datei ausgeben mit nur den Spalten, die per GET-Request angefragt werden?

Erst einmal die GET-Anfrage an sich. Statt einer kommagetrennten Liste wäre es besser, die Werte in der folgenden Form auszugeben:

csv_erzeuger.php?feld[]=id&feld[]=Artikelname&feld[]=Preis

Der Vorteil ist, dass in PHP dann $_GET[‚feld‘] ein Array ist, das die gewünschten Spaltentitel enthält. Du kannst also sowas machen:

$Export = '';
for($i = 0; $i $spalte)) {
 continue;
 }
 $Export .= '"' . addslashes($Daten-\>$spalte) . '"'
 }
}
echo $Export;

(so in der Art / ungetestet)

Tipp: Wenn es um die CSV-Ausgabe geht, schau dir ruhig auch mal diese Funktion an: http://php.net/manual/de/function.fputcsv.php

Grüße
Stefan

#nur das relevante, db-connect usw. nicht)

Ohne Kenntnis der Inhalte der DB kann ich Dir herzlich wenig helfen…

Hallo Flo,

Du machst es Dir zu kompliziert. Mit explode() kommst Du an alle Daten heran.

Beispiel:

csv_erzeuger.php?feld=id%2CArtikelname%2CPreis

$sFeld = $\_GET['feld'];
$aTeile = explode(",", $sFeld);
echo $aTeile[0]; // id
echo $aTeile[1]; // Artikelname
echo $aTeile[2]; // Preis

Tipp: Das Komma als Trennzeichen entsprechend kodieren.

die frage ist etwas konfus, aber wenn ich es richtig verstanden habe, sollen über den url parameter „Feld“ die namen der gewünschten felder angegeben werden.

if (isset($_GET[‚feld‘])) {
$felder = explode(’,’,$_GET[‚feld‘]);
foreach($felder as $feld) {
if (isset($Daten->$feld)) {
echo $Daten->$feld . "
";
}
}
}

explode reicht aus um aus dem feld Parameter ein array mit feldnamen zu machen, dieses kann man dann durchlaufen und die felder des $Daten objektes ansprechen, in dem Format $Daten->$feld

hoffe das hilft :smile:

Moin moin!

Also so 100%ig habe ich deinen Ausführungen nicht folgen können, aber was ich verstanden habe: Du hast ein PHP-Script, dass dir eine CSV-Datei zurückgeben soll. Wenn kein Parameter per GET übergeben wird, sollen alle Spalten angezeigt werden, die aus einer DB ausgelesen werden (‚SELECT * …‘). Wenn du einen GET-Parameter übergibst sollen alle im Parameter enthaltenen Felder ausgegeben werden - in der Reihenfolge, in der sie übergeben werden.

Am einfachsten geht das denke ich, wenn man das alles über den Select abarbeiten lässt:

[code]<?php // SNIPP
if (isset ($_GET[‚feld‘]) === FALSE || empty ($_GET[‚feld‘]) === TRUE)
{
$sSelect = ‚*‘;
}
else
{
$aFeld = explode (’,’, $_GET[‚feld‘]);

foreach ($aFeld AS &$sFeld)
{
$sFeld = ‚'.mysql_real_escape_string ($sFeld).'‘;
}

$sSelect = implode (’,’, $aFeld);
}

$ResultPointer = mysql_query ('SELECT ‚.$sSelect.‘ FROM '.$Tabellennamen);
// *SNIPP*
?>[/code]

Danach kannst du dann die Ergebnismenge frei weiterverarbeiten, wie du es mit einem vollständigen Query auch tun würdest. Auf diese Weise liest du auch nicht zig Daten aus der DB aus, die du eventuell garnicht benötigst.

Du musst jetzt eigentlich nurnoch schauen, ob das jeweilige Feld überhaupt da ist, welches abgefragt werden soll, aber anstatt der zig str_replace()-Zeilen hätte ich hier ohnehin mit einer Schleife gearbeitet.

Die Daten aus dem GET-Parameter sollten im Übrigen immer mit mysql_real_escape_string() abgesichert werden, bevor du deren Inhalte in einen SQL-Query einbaust. Für Tabellen- und Spaltennamen ist es im Übrigen ratsam diese in die Backticks (`) zu setzen, um Probleme mit reservierten Wörtern zu umgehen.

Ich hoffe, dass dir das schon etwas weitergeholfen hat!?

MfG
Lutz

Ist das noch aktuell? Falls ja, der Code interessiert mich nicht. Poste einfach die Eingabe und was du damit machen willst. Ein konkretes Beispiel darf nicht fehlen.