Ошибка CSV при использовании implode

Пожалуйста, помогите, я новичок в Yii. Я хочу сгенерировать и экспортировать файл CSV из отмеченных строк в CGridView. Когда я использую статический SQL-запрос, он работает нормально, но когда я использую функцию implode в предложении WHERE, контроллер возвращает ошибку. Моя кнопка, вызывающая действие контроллера:

$this->widget('bootstrap.widgets.TbButtonGroup', array(
'type' => 'primary',
'size'=>'mini',
'buttons' => array(
    array(
        'label' => 'Export',
        'type' => 'success',
        'buttonType'=>'ajaxLink',
        'encodeLabel'=>true,
        'icon'=> 'th white',
        'url'=>Yii::app()->createUrl('/propertyPurchaseSale/ExportChecked'),
        'ajaxOptions'=>array(
        "type" => "post",
        "data" => "js:{ids:$.fn.yiiGridView.getSelection('property-purchase-sale-grid')}",
        "update" => '#', 'success'=>"js:function(data) {window.location.assign('/propertyPurchaseSale/ExportChecked');}"),                                                
                              array( //htmlOptions
                                    )                                    
                                ),
                array(
                    ...
                ),
                ),
            ));

Мое действие контроллера:

public function actionExportchecked() {
        header('Content-type: text/csv');
        header('Content-type: multipart/form-data');
        header('Content-Disposition: attachment; filename="Export_(' . date('H-i_d.m.Y') .').csv"');
        header('Content-Transfer-Encoding: binary'); 
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Content-Description: File Transfer');
                    $fp = fopen('php://output', 'w');

        if(Yii::app()->request->isAjaxRequest)
        {
            if(isset($_POST['ids']))
            {       
                $idx = $_POST['ids'];
                $count=Yii::app()->db->createCommand('SELECT COUNT(*) FROM property')->queryScalar();
                // $sql='SELECT * FROM property WHERE id  IN (981, 982, 985)';  --> when I use static values - all work
                $sql="SELECT * FROM property WHERE id IN('".implode("', '",$idx)."')";  // --> when I use join or implode function - data exist in firebug, but page return error 500

                $dataProvider=new CSqlDataProvider($sql, array(
                    'totalItemCount'=>$count,
                    'sort'=>array(
                        'attributes'=>array(
                             'fullname', 'address', 'phone', 'db_number', 'created_date'
                        ),
                    ),
                    'pagination'=>false,
                ));
                                    fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
                                    if ($fp)
                                    {                        
                        echo    PropertyPurchaseSale::model()->getAttributeLabel("id").";".
                                    PropertyPurchaseSale::model()->getAttributeLabel("fullname").";".
                                PropertyPurchaseSale::model()->getAttributeLabel("address").";".
                                PropertyPurchaseSale::model()->getAttributeLabel("phone").";".
                                PropertyPurchaseSale::model()->getAttributeLabel("db_number").";".
                                PropertyPurchaseSale::model()->getAttributeLabel("created_date").
                                " \r\n";                        
                        foreach ($dataProvider->getData() as $data) {
                            echo $data['id'] . '; ' . $data['fullname'] . '; ' . $data['address'] . '; ' . $data['phone'] . '; ' . $data['db_number'] . '; ' . $data['created_date'] . '; ' . "\r\n";
                        }
            }
                    exit;
                }
            }}

Помогите пожалуйста, что я делаю не так?


person maxim.ishchenko    schedule 30.06.2015    source источник
comment
Пожалуйста, отредактируйте свой вопрос, чтобы добавить ошибку, возвращаемую сервером. Вы найдете его в журналах ошибок.   -  person Antwane    schedule 30.06.2015


Ответы (1)


Моя рефлекторная реакция заключается в том, что нет ничего, подтверждающего, что $_POST['ids'] является массивом. Если это просто строка, то произойдет сбой, SQL будет неправильно отформатирован, и это приведет к ошибке уровня 500.

Возможно, это может сработать:

// check for empty, that way invalid entry won't go through
if(!empty($_POST['ids'])) {
    // Check if it is an array
    $input_idx = is_array($_POST['ids'])?
        // if so, then use it as an array
        $_POST['ids']:
        // If not, you need to turn it into an array. I'm only guessing that this should 
        // be a ','. It could be a " " or some other character(s)
        explode(',',$_POST['ids']);
    // Remove all non-numeric items in the array.
    $idx = array_filter($input_idx, 'is_numeric');
    if(!$idx) {
        // Do something with bad data.
    }
    // continue with the line $count = ...

Вы также должны убедиться, что данные безопасны, поскольку эти идентификаторы могут включать SQL-инъекцию. (Возможно, этот ответ)

person cwallenpoole    schedule 30.06.2015