2013-07-23 62 views
0

我正試圖將mysql表導出到csv。我遇到的問題是,每次代碼增加時,它都會在字段名稱中加入名爲'id'的字段。所以在第一場之後,我得到了id。之後又有兩個字段,我得到了id。之後三個領域,我得到id領域。我不知道爲什麼會發生。任何幫助是極大的讚賞。 (注意:我知道不使用mysql,我通常使用mysqli,但這是我現在使用的)。 這裏是我的代碼:當將mysql導出到csv時獲取隨機字段名稱

$hostname = "localhost"; //SET SERVER/HOSTNAME 
    $dbusername = "username"; //SET DATABASE USERNAME 
    $dbname = "dbname"; //SET DATABASE NAME 
    $dbpassword = "password"; //SET DATABASE USERNAME 

$dbhandle = mysql_connect($hostname, $dbusername, $dbpassword) 
    or die("Unable to connect to MySQL"); 

$selected = mysql_select_db($dbname,$dbhandle) 
    or die("Could not select Data Base"); 

    header("Content-type: application/csv"); 
    header("Content-Disposition: attachment; filename=test.csv"); 
    header("Pragma: no-cache"); 
    header("Expires: 0"); 



$query = "SELECT * FROM v88374"; 

$export = mysql_query ($query) or die ("Sql error : " . mysql_error()); 

$fields = mysql_num_fields ($export); 

for ($i = 0; $i < $fields; $i++) 
{ 
    $header .= mysql_field_name($export , $i) ."|" . "\t"; 

    echo $header; 
} 

while($row = mysql_fetch_row($export)) 
{ 
    $line = ''; 
    foreach($row as $value) 
    {            
     if ((!isset($value)) || ($value == "")) 
     { 
      $value = "\t"; 
     } 
     else 
     { 
      $value = str_replace('"' , '""' , $value); 
      $value = $value . '|' . "\t"; 
     } 
     $line .= $value; 
    } 
    $data .= trim($line) . "\n"; 
} 
$data = str_replace("\r" , "" , $data); 

if ($data == "") 
{ 
    $data = "\n(0) Records Found!\n";       
} 

print "$header\n$data"; 

exit(); 
+0

你爲什麼不使用['SELECT ... INTO OUTFILE'](http://dev.mysql.com/doc/en/select-into.html)? – eggyal

+0

*強制性的:*'mysql_ *'函數[在PHP 5.5中不推薦使用](http://php.net/manual/en/faq.databases.php#faq.databases.mysql.deprecated)。不建議您編寫新的代碼,因爲這會阻止您將來升級。相反,請使用[MySQLi](http://php.net/manual/en/book.mysqli.php)或[PDO](http://php.net/manual/en/book.pdo.php)和[是一個更好的PHP開發人員](http://jason.pureconcepts.net/2012/08/better-php-developer/)。 –

+0

@JasonMcCreary OP明確指出'注意:我知道不使用mysql,我一般使用mysqli,但這就是我現在使用的'我認爲我們得到了點... – amaster

回答

0

我認爲這將是下一個變化的更好的方法,它更容易一點:

$query = "SELECT * FROM v88374"; 
$export = mysql_query ($query) or die ("Sql error : " . mysql_error()); 
$query = "SHOW COLUMNS FROM v88374"; 
$rfields = mysql_query ($query) or die ("Sql error : " . mysql_error()); 
$rows = array(); 
$fields = array(); 

$tmp = mysql_fetch_assoc ($rfields); 
while($tmp) 
{ 
    $fields[] = $tmp['Field']; 
    $tmp = mysql_fetch_assoc ($rfields); 
} 
@mysql_free_result($rfields); 

$tmp = mysql_fetch_assoc ($export); 
while($tmp) 
{ 
    $rows[] = $tmp; 
    $tmp = mysql_fetch_assoc ($export); 
} 
@mysql_free_result($export); 

$header = implode("|\t", $fields); 
$ifields = count($fields); 
echo '<pre>';var_dump($ifields, $fields); 
$data = ''; 
foreach($rows as $row) 
{ 
    $line = ''; 
    for($i = 0; $i < $ifields; $i++) 
     $line .= ($line == '' ? '' : "\t").$row[$fields[$i]]; 
    $data .= $line."\n"; 
} 

echo $header."\n".$data; 
exit(); 

或者

$query = "SELECT * FROM v88374"; 
$export = mysql_query ($query) or die ("Sql error : " . mysql_error()); 
$rows = array(); 
$fields = array(); 

$tmp = mysql_fetch_field ($export); 
while($tmp) 
{ 
    $fields[] = $tmp->name; 
    $tmp = mysql_fetch_field ($export); 
} 

$tmp = mysql_fetch_assoc ($export); 
while($tmp) 
{ 
    $rows[] = $tmp; 
    $tmp = mysql_fetch_assoc ($export); 
} 
@mysql_free_result($export); 

$header = implode("|\t", $fields); 
$ifields = count($fields); 
echo '<pre>';var_dump($ifields, $fields); 
$data = ''; 
foreach($rows as $row) 
{ 
    $line = ''; 
    for($i = 0; $i < $ifields; $i++) 
     $line .= ($line == '' ? '' : "\t").$row[$fields[$i]]; 
    $data .= $line."\n"; 
} 

echo $header."\n".$data; 
exit();