1

我在将 csv 文件上传到数据库时遇到问题。这是我的看法:

<?php
$this->breadcrumbs = array(
__('People') => array('/contacts'),
__('Persons') => array('admin'),
__('Manage'),
);?>



<h1><?php echo __('People'); ?> <small><?php echo __('import contacts'); ?></small></h1><br/>
<div class="form">

<?php
$form = $this->beginWidget('bootstrap.widgets.TbActiveForm', array(
'id'=>'service-form',
'enableAjaxValidation'=>false,
'method'=>'post',
'type'=>'horizontal',
'htmlOptions'=>array(
    'enctype'=>'multipart/form-data'
)
)); ?>

<fieldset>


    <?php echo $form->errorSummary($model, 'Opps!!!', null, array('class'=>'alert alert-error span12')); ?>

    <div class="control-group">     
        <div class="span4">
                            <div class="control-group <?php if ($model->hasErrors('postcode')) echo "error"; ?>">
    <?php echo $form->labelEx($model,'file'); ?>
    <?php echo $form->fileField($model,'file'); ?>
    <?php echo $form->error($model,'file'); ?>
                        </div>


        </div>
    </div>

    <div class="form-actions">
        <?php $this->widget('bootstrap.widgets.TbButton', array('buttonType'=>'submit', 'type'=>'primary', 'icon'=>'ok white', 'label'=>'UPLOAD')); ?>
        <?php $this->widget('bootstrap.widgets.TbButton', array('buttonType'=>'reset', 'icon'=>'remove', 'label'=>'Reset')); ?>
    </div>

</fieldset>

<?php $this->endWidget(); ?>

</div><!-- form -->

这是我的模型:

<?php
class UserImportForm extends CFormModel
{
public $file;
/**
 * @return array validation rules for model attributes.
 */
public function rules()
{
    // NOTE: you should only define rules for those attributes that
    // will receive user inputs.
    return array(  
         array('file', 'file', 
                                        'types'=>'csv',
                                        'maxSize'=>1024 * 1024 * 10, // 10MB
                                        'tooLarge'=>'The file was larger than 10MB. Please upload a smaller file.',
                                        'allowEmpty' => false
                          ),
               );
}

/**
 * @return array customized attribute labels (name=>label)
 */
public function attributeLabels()
{
    return array(
        'file' => 'Select file',
    );
 }

}
?>

这是我在控制器中的功能

public function actionImportCSV()
    {
       $model=new UserImportForm;

       if(isset($_POST['UserImportForm']))
         {

           $model->attributes=$_POST['UserImportForm'];

           if($model->validate())
             {

              $csvFile=CUploadedFile::getInstance($model,'file');  
              $tempLoc=$csvFile->getTempName();

                $sql="LOAD DATA LOCAL INFILE '".$tempLoc."'
    INTO TABLE `contacts`
    ";
                $connection=Yii::app()->db;
                $transaction=$connection->beginTransaction();
                    try
                        {

                            $connection->createCommand($sql)->execute();
                            $transaction->commit();
                        }
                        catch(Exception $e) // an exception is raised if a query fails
                         {
                            echo "<pre>";
                            print_r($e);
                            echo "</pre>";
                            exit;
                            $transaction->rollBack();

                         }
                  $this->redirect(Yii::app()->createUrl("/contacts/importCSV"));


             }
         }  

       $this->render("importcsv",array('model'=>$model));
     }

我对 LOAD DATA 有疑问,因为 mySQL 版本不支持 LOAD DATA。任何人都知道如何替换加载数据以导入 csv 文件?

4

2 回答 2

1

如果您使用的是不支持 LOAD DATA 的 MySQL 版本,那么您确实使用的是非常旧的版本。当前的在线文档在每个提到的版本中都包含 LOAD DATA,尽管 LOCAL 子句仅支持早至 3.22.6。

也许真正的问题是,如果您不指定 FIELDS 子句,它会将文件视为

FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
LINES TERMINATED by '\n' STARTING  BY ''

被指定。那是一个 Unix(Linux) 文本格式的 TAB 分隔值文件。要使其以逗号分隔,请指定:

LOAD DATA LOCAL INFILE 'data.txt' INTO TABLE tbl_name
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';

如果您期望来自 Windows 机器的文件,您可能希望包括

LINES TERMINATED BY '\r\n'

在 FIELDS 子句之后。

于 2013-06-17T18:18:38.187 回答
1

请按照以下说明操作:

https://github.com/Ardem/yii-importcsv-extension

我按照 readme.md 文件中描述的简单步骤进行了 3 个简单的步骤,它的工作就像轻而易举。

于 2014-01-16T11:04:23.673 回答