[英]MySQL PHP CSV File Export
首先,为下面的一些代码道歉。 我是PHP和学习的新手,我知道我编写的代码既不是最优雅也不是最有效的代码。
我正在尝试创建一个函数,该函数通过从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看起来像这样,
发票编号client_id发票日期status_id税率金额nett
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
我想做的是用“ module_joms_clients”表中的client_id列中的值替换为company_name列中的值。
我感谢这是一个棘手的问题,但我想我会看看是否有人可以提供帮助。
编辑
我已经在下面尝试过此代码,但目前尚无法正常工作,我不确定为什么。
//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”表结构如下所示:
“ cms_module_joms_invoice_headers”表结构如下所示,
您正在寻找的是JOIN。 我缺少有关您的表结构的信息,但是您需要做的是在$ rows变量中包含“ 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"
);
如果您包括有关公司和客户表的一些详细信息,我可以更新查询。
得到它了。 不是世界上最好的代码,我将继续努力! 但这确实适用于以下情况,
$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
');
谢谢大家的帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.