2012-07-08 238 views
0

首先,对于下面的一些代码表示歉意。我是PHP的新手和学习,我知道我写的代码既不是最优雅也不是最高效的。MySQL PHP CSV文件导出

我正在尝试创建一个函数,该函数通过从MySQL中的表中导出数据来生成在Excel中使用的CSV类型文件。到目前为止,我已经得到了一切工作,除了我希望将我的表中的一个变量从“客户端ID”(一个数字)替换为“公司名称”(一个文本值),以便最终导出的文件更易于阅读。

我的代码迄今是这样的(再次道歉!),

//Connect with db 
global $smarty; 
$tpl_vars = $smarty->get_template_vars(); 
global $gCms; 
$db = &$gCms->GetDb(); 

//Check config settings 
$config = $tpl_vars['invoice_export_columns']; 
$headers = str_replace('"','\'',$config); 
$rows = str_replace('"','',$config); 
$start = $tpl_vars['from']; 
$start = date("'Y-m-d'", $start); 
$end = $tpl_vars['to']; 
$end = date("'Y-m-d'", $end); 

//Get client name 
$modops = cmsms()->GetModuleOperations(); 
$joms = $modops->get_module_instance('JoMS'); 
$client = $tpl_vars['clientrp']; 
$query = 'SELECT * FROM '.cms_db_prefix() .'module_joms_clients 
    WHERE company_name = ?'; 
$row = $db->GetRow($query, array($client)); 
$client = $row['client_id']; 
$clientid = "'$client'"; 

//Check available statuses 
if (isset($tpl_vars['csvdraft'])) { $draft = '\'14\''; } else { $draft = '\'0\''; } 
if (isset($tpl_vars['csvsent'])) { $sent = '\'15\''; } else { $sent = '\'0\''; } 
if (isset($tpl_vars['csvpaid'])) { $paid = '\'25\''; } else { $paid = '\'0\''; } 

//Connect with invoices 
$db = cmsms()->GetDb(); 
$table = 'cms_module_joms_invoice_headers'; 
$file = 'export'; 

//Create headers 
$result = mysql_query("SHOW COLUMNS FROM ".$table." WHERE Field IN ($headers);"); 
$i = 0; 
if (mysql_num_rows($result) > 0) 
{ 
    while ($row = mysql_fetch_assoc($result)) 
    {      
     $csv_output .= $row['Field'].", "; 
     $i++; 
    } 
} 
$csv_output .= "\n"; 

//Create body 
if ($clientid == "''") { 
$values = mysql_query("SELECT $rows FROM ".$table." WHERE invoicedate >= $start AND invoicedate <= $end AND (status_id = $draft OR status_id = $sent OR status_id = $paid) "); 
} else { 
$values = mysql_query("SELECT $rows FROM ".$table." WHERE invoicedate >= $start AND invoicedate <= $end AND (status_id = $draft OR status_id = $sent OR status_id = $paid) AND client_id = $clientid ");  
} 
while ($rowr = mysql_fetch_row($values)) 
{ 
    for ($j=0;$j<$i;$j++) 
    { 
     $csv_output .= $rowr[$j].", ";  
    } 
    $csv_output .= "\n"; 
} 

//Write file 
$myFile = "uploads/csv/invoice.csv"; 
$fh = fopen($myFile, 'w') or die("can't open file"); 
fwrite($fh, $csv_output); 
fclose($fh); 

它们是在表中称为CLIENT_ID一列和该当前正在在CSV体输出作为2位的数值。我想用这个来代替实际的名字。在代码早期,我已经设法做相反的事情(在//获取客户端名称下),但我不知道如何做到这一点,同时生成$ csv_output。

的$ csv_output看起来像这样,

invoicenumber CLIENT_ID invoicedate STATUS_ID TAXRATE amountnett
100 2 2012-06-14 00:00:00 15 19.6 50
103 3 2012-06-16 00: 00:00 15 20 23.5
104 2 2012-06-27 00:00:00 15 20 50

我想要做的是将client_id列中的值替换为' module_joms_clients'表。

我很欣赏这是一个棘手的问题来回答,但我想我会看看是否有人可以帮助。

编辑

我在下面尝试这种代码,但它不工作至今,我不知道为什么。

//Create body 
$values = mysql_query("SELECT $rows FROM ".$table." JOIN cms_module_joms_clients ON cms_module_joms_invoice_headers.client_id = cms_module_joms_clients.company_name WHERE invoicedate >= $start AND invoicedate <= $end AND (status_id = $draft OR status_id = $sent OR status_id = $paid) ");  
while ($rowr = mysql_fetch_row($values)) 
{ 
    for ($j=0;$j<$i;$j++) 
    { 
     $csv_output .= $rowr[$j].", ";  
    } 
    $csv_output .= "\n"; 
} 

存储所述客户端的信息被称为“cms_module_joms_clients”和客户端的名称的表被存储下的列“COMPANY_NAME”。客户端ID取自'cms_module_joms_invoice_headers'表,该行被称为'client_id'。

我认为这是对的,但我猜不是。

编辑

的 'cms_module_joms_clients' 表的结构是这样的,

enter image description here

和 'cms_module_joms_invoice_headers' 表的结构是这样的,

enter image description here

+1

退房http://php.net/manual/en/function .fpu tcsv.php写入CSV文件。看看在SQL中使用JOIN将表连接在一起以获取与'client_id'相对应的'company_name'字段。另外,请查看MySQL中的'UNION',以便您可以选择“标题行”作为查询的一部分。 – imm 2012-07-08 22:09:35

回答

0

明白了不。在世界上最好的代码,我将努力对!但它确实有以下工作,

$values = mysql_query('SELECT '.$rows.' 
     FROM '.cms_db_prefix().'module_joms_invoice_headers ih 
     LEFT JOIN '.cms_db_prefix().'module_joms_clients cl 
     ON ih.client_id = cl.client_id 
     WHERE invoicedate >= '.$start.' AND invoicedate <= '.$end.' AND (ih.status_id = '.$draft.' OR ih.status_id = '.$sent.' OR ih.status_id = '.$paid.') AND ih.client_id != 0 
     '); 

感谢大家的帮助

1

什么你'寻找是一个加入。我在表格结构中缺少一些信息,但您需要做的是包含“COMPANY_TABLE”。COMPANY_NAME AS在$行变量,改变你的选择是这样的COMPANY_NAME”:

$values = mysql_query(
    "SELECT 
     $rows 
    FROM ".$table." 
    JOIN 
     module_joms_clients 
    ON 
     CLIENT_TABLE.COMPANY_ID = module_joms_clients.COMAPANY_ID 
    WHERE 
     invoicedate >= $start AND invoicedate <= $end AND 
     (status_id = $draft OR status_id = $sent OR status_id = $paid) AND 
     client_id = $clientid" 
); 

如果包括对公司的一些细节和客户的表,我可以更新查询

+0

嗨。非常感谢您的帮助。我很乐意提供我所能提供的所有信息。你究竟需要什么?表结构? – user1098178 2012-07-09 08:46:30

+0

表结构是最有用的。你可以在MySQL shell中使用“DESCRIBE table_name”。 – crempp 2012-07-09 22:12:33