phpbar.de logo

Mailinglisten-Archive

[php] Kein File nach INTO OUTFILE Anweisung

[php] Kein File nach INTO OUTFILE Anweisung

Ulf Wendel ulf_(at)_redsys.de
Mon, 10 Jan 2000 23:35:44 +0000


Michael Schmitz wrote:
> $result=mysql_query("SELECT * FROM Kurse INTO OUTFILE 'Tester.txt'");
> 
> Aber es passiert nichts, es wird keine Fehlermeldung ausgegeben oder irgend eine andere Meldung.

Hallo Micheal,

zur Ausführung dieser select Variante muß der Datenbankadministrator Dir
entsprechende Recht erteilt haben (file privilige). Bitte erkundige Dich
bei deinem Provider, ob dies der Fall ist. Stelle weiterhin sicher, daß
die Datei die Du erstellen möchtest nicht bereits auf dem Server
existiert.

Sollte der Provider die notwendigen Rechte nicht erteilen, wirst Du die
CSV-Datei "von Hand" erstellen müssen:

$delimiter = ";";
$enclosedby = "'";

$outfile = "";

mysql_connect($host,$user,$password);
$result = mysql_db_query("database","select * from kruse");
while($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
  reset($row);
  while (list(, $v)=each($row))
    $outfile.=$enclosedby.$v.$enclosedby.$delimiter;  
  $outfile.=substr($outfile, 0, -1)."\n";
}

Beachte den zweiten Parameter bei mysql_fetch_array(). Wir
mysql_fetch_array nur mit einem Parameter(*) aufgerufen, das
zurückgelieferten Array numerisch und über Datenbankfeldnamen indiziert:

$row = array ( 0 => "wert in feld1", "feld1" => "wert in feld1" );

Mit dem zweiten Parameter (MYSQL_NUM) kannst Du PHP anweisen, entweder
nur eine numerische Indizierung vorzunehmen:

$row = array ( 0 => "wert in feld1" );

Oder nur eine Indizierung über die Feldnamen in der Datenbank
(MYSQL_ASSOC):

$row = array ("feld1" => "wert in feld1");

Für unsere Anwendung ist es unerheblich welche Variante gewählt wird,
wichtig ist, daß es zu keiner Ergebnisdoppelung in dem Array kommt,
welches mysql_fetch_array() liefert. Ohne Doppelung können wir einfach
alle Werte in einer Schleife ausgeben und eine Zeile einer typischen
CSV-Datei aufbauen:

reset($row);
while (list(, $v)=each($row)) 
  $outfile .= $enclosedby.$v.$enclosedby.$delimiter  #$outline .= '$v';

Leider erhalten wir eine Zeile wie:

'wert in feld1';'wert in feld2';

Das Semikolion am Ende leitet eine weitere Spalte ein, obwohl keine
Daten folgen. Damit beim Import keine dritte Spalte erkannt wird, muß es
entfernt werden. Ein Zeilenumbruch komplettiert die Zeile:

$outfile = substr($outfile, 0, -1)."\n";

Ulf

(*) Ab PHP 3.0.7. Mein PHP 3.0.12 uffe Arbeit reagiert nicht auf
MYSQL_NUM, MYSQL_ASSOC und MYSQL_BOTH, sondern 0,1 und 2. Ich weiß nicht
ob dies ein Bug oder Feature ist.


php::bar PHP Wiki   -   Listenarchive