0

我需要将旧错误跟踪器 (Zentrack) 中的数据迁移到新的,我可以使用的唯一导入方法是从 CSV 导入。为此,我需要来自两个表、票证和日志的数据,因此我在 php.ini 中编写了下面的脚本。

<?php

error_reporting(E_ALL);

$host = "localhost"; 
$user = "dbuser"; 
$pass = "dbpass"; 
$db = "zentrk";

$users[1] = 'john';
$users[4] = 'sally';
$users[5] = 'nick';
$users[6] = 'ralph';

$r = mysql_connect($host, $user, $pass);

if (!$r) {
    echo "Could not connect to server\n";
    trigger_error(mysql_error(), E_USER_ERROR);
}

echo mysql_get_server_info() . "\n"; 

$r2 = mysql_select_db($db);

if (!$r2) {
    echo "Cannot select database\n";
    trigger_error(mysql_error(), E_USER_ERROR); 
}

$query_tickets = "select ZENTRACK_TICKETS.id, ZENTRACK_TICKETS.title, ZENTRACK_TICKETS.priority, ZENTRACK_TICKETS.status, ZENTRACK_TICKETS.description, ZENTRACK_TICKETS.otime, 
ZENTRACK_TICKETS.type_id, ZENTRACK_TICKETS.user_id, ZENTRACK_TICKETS.system_id, ZENTRACK_TICKETS.creator_id, ZENTRACK_TICKETS.proj_key
from ZENTRACK_TICKETS
where ZENTRACK_TICKETS.status = 'OPEN' 
and ZENTRACK_TICKETS.system_id in ('18', '3', '6', '1', '16', '7', '9', '4', '20') 
and ZENTRACK_TICKETS.type_id not in ('1', '10', '5')";

$rs = mysql_query($query_tickets);

if (!$rs) {
    echo "Could not execute query: $query";
    trigger_error(mysql_error(), E_USER_ERROR); 
} else {
    echo "Query: $query executed\n";
} 

$export = array();

$export[] = 'id,title,created date,priority,type,assigned,description,system,creator,project key,log1,log2,log3,log4,log5,log6,log7,log8,log9,log10
';
while ($row = mysql_fetch_assoc($rs)) {
   $line = '';
   $count = 0;
    $line .= $row['id'] . "," . $row['title'] . "," . date('d-M-y h:m a',$row['otime']) . "," . $row['priority'] . "," . $row['type_id'] . "," . $row['user_id'] . "," . $row['description'] . "," . $row['system_id'] . "," . $row['creator_id'] . "," . $row['proj_key'] . ",";      


    $logs = find_logs($id = $row['id']);
    foreach($logs as $log_entry) {
      $line .= $log_entry.",";
      $count++;
    }
    while($count < 10) {
      $line .= ",";
      $count++;
    } 

    $export[] = $line.'
';
}

mysql_close();


// print_r($export);

$file = 'tickets.csv';

file_put_contents($file, $export);

function find_logs($ticket) {

 $content = array();

 $query = "select ZENTRACK_LOGS.created, ZENTRACK_LOGS.user_id, ZENTRACK_LOGS.entry 
          from ZENTRACK_LOGS 
          where ZENTRACK_LOGS.ticket_id = $ticket 
          and ZENTRACK_LOGS.action <> 'EDIT' ";

   $rs = mysql_query($query);

   if (!$rs) {
    echo "Could not execute query: $query";
    trigger_error(mysql_error(), E_USER_ERROR); 
    } 

   while ($row = mysql_fetch_assoc($rs)) {
    $date = date('d-M-y h:m a',$row['created']);
    $content[] = $date . ";" . $row['user_id'] . ";" . $row['entry'];
   }

 return $content;
}
?>

我在使用这个脚本时遇到了两个问题,我确定这是因为我是 PHP 新手。

1) 我需要转义 $row['description'] 中的数据,因为它同时包含回车和 ,在保存到 CSV 时错误地将输出分成新行的文本中。我需要将这一行的内容保存在“”中,但我不知道该怎么做。

2)find_logs函数中$row['user_id']、$row['creator_id']和$row['user_id']返回的数据返回一个数字,我需要找到那个数字并替换成对应的字符串在 $users 数组中。最好的方法是什么?

4

1 回答 1

0

处理 csv 文件时使用fgetcsvfputcsv,为它提供一个数组,它会为你处理转义。

于 2013-08-03T20:38:30.570 回答