0

首先,为下面的一些代码道歉。我是 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 位数值输出。我想用这个代替实际的名字。在代码的前面,我设法反向执行相同的操作(在 //Get client name 下),但我不知道如何在生成 $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”表中 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' 表结构看起来像这样,

在此处输入图像描述

4

2 回答 2

1

您正在寻找的是一个 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"
);

如果您包含有关公司和客户表的一些详细信息,我可以更新查询。

于 2012-07-08T22:15:18.623 回答
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
        ');

感谢大家的帮助

于 2012-07-10T00:05:50.203 回答