YiiFramework Загрузка данных в базу данных Yii

Alex7666

Новичок
Здравствуйте!
Подскажите, плиз, второй день бьюсь - и ничего не получается!
Мне нужно загрузить файл (cvs с разделителями таб) в базу данных с помощью запроса LOAD DATA LOCAL INFILE в фреймворке Yii.
Значит так:
В контролере код:
PHP:
public function actionIndex()
{
 
        $model= new ImportPrice;
        if(isset($_POST['ImportPrice']))
        {
            $model->attributes=$_POST['ImportPrice'];
            if($model->validate())
            {
                $csvFile=CUploadedFile::getInstance($model,'file');
                $tempLoc=$csvFile->getTempName();
                 
               $sql = "LOAD DATA LOCAL INFILE '".$tempLoc."'
        IGNORE INTO TABLE hot_page
        FIELDS TERMINATED BY '\t'
        LINES  TERMINATED BY '\r\n'
        IGNORE 1 LINES
        (id_page,title,text)";
 
    $connection=Yii::app()->db;
    $connection->createCommand($sql)->execute();
            }
 
        }
 
        $this->render("index",array('model'=>$model));
    }
При попытке загрузить в базу данных выдает ошибку:
PDOStatement::execute() [<a href='pdostatement.execute'>pdostatement.execute</a>]: LOAD DATA LOCAL INFILE forbidden

Судя из содержания ошибки - запрещено загружать. Но почему?
Как можно все таки на Yii загрузить файл.
Кстати пример был взят из сайта http://www.yiiframework.com/wiki/336/im ... a-command/

Но, когда загружаешь файлы штатным способом, к примеру:

PHP:
$pwdb=mysql_connect("127.0.0.1", "alex76", "123") or die("База даных не подключена");
mysql_query('SET character_set_database = utf8');
mysql_query('SET NAMES utf8');
$db=mysql_select_db("hotline", $pwdb) or die("База даных не выбрана! (A)");
 
$sql = "LOAD DATA LOCAL INFILE '".$patch."'
IGNORE INTO TABLE hot_page
FIELDS TERMINATED BY '\t'
LINES  TERMINATED BY '\r\n'
IGNORE 1 LINES
(id_page,title,text)";
 
if(mysql_query($sql)){echo 'Success';    } 
else {echo 'Error';}
Все нормально загружается. Может проблема в настройках подключения к базе данных файла main.php:

PHP:
db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=hotline',
'emulatePrepare' => true,
'username' => 'alex76,
'password' => '123',
'charset' => 'utf8',
             
),
Просто даже уже не знаю как быть... все перелопатил...

Спасибо за любые советы!!!
 

MiksIr

miksir@home:~$
Там какой-то баг был на эту тему в PDO. Попробуйте последние версии php. Ну или не используйте для этой задачи yii/pdo.
 

fixxxer

К.О.
Партнер клуба
атрибут PDO::MYSQL_ATTR_LOCAL_INFILE выставить в true.

setAttribute либо параметром конструктора PDO.

как это сделать в yii не знаю
 

Alex7666

Новичок
Да пробывал писать и это:
PHP:
'db'=>array(
			'connectionString' => 'mysql:host=localhost;dbname=hotline',
			'emulatePrepare' => true,
			'username' => 'yuriy',
			'password' => '1976',
			'charset' => 'utf8',
			'attributes'=>array(
				PDO::MYSQL_ATTR_LOCAL_INFILE =>true,
			),
		),
ничего не получается - заприщено и все!!! Что здесь уж поделаешь?
Как же тогда загрузить этот файл? Проблема вижу в самом PDO, который использует сам Yii
Как тогда в контролера можно написать код (протими штатными средствами РНР - подключатся к базе данных простым методом - тогда парадокс какойто - разве разработчики ничего не придумали для данных целей!!! Где же эти настройки нужно указывать... все вроде бы перепробывал - но увы(((
 

Alex7666

Новичок
Может пример приведете как все таки все эти параметры проставлять... буду очень вам благодарен... спасибо!!!
 

Ragazzo

TDD interested
Alex7666
в CDbConnection можно взять pdo instance, и попробовать сделать то что сказал fixxxer.
 

Alex7666

Новичок
в CDbConnection можно взять pdo instance, и попробовать сделать то что сказал fixxxer.

А можно пример привести - чтобы понятливей было... спасибо... (первый раз сталкиваюсб с этим)!!!
 

Ragazzo

TDD interested
PHP:
Yii::app()->db->setAttribute(PDO::MYSQL_ATTR_LOCAL_INFILE,true);
так попробуй. не проверял, лень)
 

Alex7666

Новичок
хорошо попробую если получится в любом случае отпишусь спасибо надеюсь на позитивный результат...
 

Ragazzo

TDD interested
Alex7666
смотри только чтобы у тебя соединение уже открыто было на момент setAttribute, а то не PDO поставишь значение а инстансу CDbConnection. Впрочем там в доках на этот метод все есть. (все равно эти атрибуты передатутся инстансу pdo потом при создании)
 

Alex7666

Новичок
Смотрите, у меня вот код в контролере:
PHP:
 $model= new ImportPrice;

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

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

            if($model->validate())
            {
                $csvFile=CUploadedFile::getInstance($model,'file');
                $tempLoc=$csvFile->getTempName();
$sql = "LOAD DATA LOCAL INFILE '".$tempLoc."'
							IGNORE INTO TABLE hot_page
							FIELDS TERMINATED BY '\t'
							LINES  TERMINATED BY '\r\n'
							IGNORE 1 LINES
							(id_page,title,text)";

$connection = Yii::app()->db->setAttribute(PDO::MYSQL_ATTR_LOCAL_INFILE,true); // это здесь прописывать - поправьте если не так!!!

//$connection=Yii::app()->db; - это старая запись
$connection->createCommand($sql)->execute();
Плправьте если что то не так... спасибо
 

Alex7666

Новичок
Да нет, не в пользователях дело - эти юзеры имеют одинаковые привилегии... мне вот интиресно что ребята написали
PHP:
Yii::app()->db->setAttribute(PDO::MYSQL_ATTR_LOCAL_INFILE,true);
только где и как его правильно происать чтобы заработало!!!
 

fixxxer

К.О.
Партнер клуба
да по идее работать должно и в первом и во втором твоих вариантах

попробуй сделать ручками через pdo - new Pdo итд. Если тоже не сработает, обнови php, что-то там проскакивало про соотв. баг в pdo_mysqlnd
 

Ragazzo

TDD interested
можно попробовать через FDW сделать (если с pdo проблемы), в mysql вроде это тоже есть.
 

fixxxer

К.О.
Партнер клуба
да просто обновить php надо. я уже 100% уверен что дело в этом баге - сообщение об ошибке совпадает в точности

если это хостинг, бежать оттуда, с тех пор было много критичных security фиксов

а в качестве временного воркэраунда сойдет и mysql_connect :)
 

Alex7666

Новичок
Написал так:
PHP:
$csvFile=CUploadedFile::getInstance($model,'file');
$patch = 'protected/data/files/'.$csvFile->getName();
$sql = "LOAD DATA LOCAL INFILE '".$patch."'
IGNORE INTO TABLE hot_page
FIELDS TERMINATED BY '\t'
LINES  TERMINATED BY '\r\n'
IGNORE 1 LINES
(id_page,title,text)";

$connection = Yii::app()->db->setAttribute(PDO::MYSQL_ATTR_LOCAL_INFILE,true);
$connection->createCommand($sql)->execute();
Пишет:
Fatal error: Call to a member function createCommand() on a non-object in C:\xampp\public_html\hotline\www\protected\modules\admin\controllers\ImportController.php on line 5

Написал так:
PHP:
define('HOST_NAME','localhost');
				define('DB_NAME','hotline');
				define('DB_USER','yuriy');
				define('DB_PASS','1976');
				$driver = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",PDO::MYSQL_ATTR_LOCAL_INFILE=>true);

				$DBH = new PDO('mysql:host='.HOST_NAME.';dbname='.DB_NAME.'', DB_USER, DB_PASS, $driver );
				$DBH->exec($sql);
Пишет:
PDO::exec() [<a href='pdo.exec'>pdo.exec</a>]: LOAD DATA LOCAL INFILE forbidden

Что то не пойму с этим PDO!!!
Кстати я тестирую на XAMPP 1.7 версия РНР 5.3 - может в єтом проблема???
 

Alex7666

Новичок
Вы о чем это? Что мне делать в конце концов???
Как все таки мне в Yii загрузитьфайл???

PHP Version 5.3.8
 
Сверху