Проблема с экранированием или wot? Есть решение

Ребята, появилась проблема при отладке под windows.

Стоит задача импортировать csv файл в бд.

Делаю так

Получаю путь:

$app_conf = wa()->getConfig()->getAppConfig('shop');

$tmp_path = $app_conf->getPluginPath('plugin_path'.DIRECTORY_SEPARATOR.'path');

Передаю путь в модель:

$model = new shopPluginnamePluginModel();

$model->import( $tmp_path.DIRECTORY_SEPARATOR.$this->file );

В модел:

public function import($file_path) {

$this->query("LOAD DATA LOCAL INFILE '$file_path' INTO TABLE `$this->table` CHARACTER SET 'cp1251' FIELDS TERMINATED BY ';'");

}

Получаю ошибку:

Query Error

Query: LOAD DATA LOCAL INFILE

'C:\server\wamp\htdocs\site\www\wa-apps\shop/plugins/pluginname\tmp\file.csv'

INTO TABLE `table` CHARACTER SET 'cp1251' FIELDS

TERMINATED BY ';'

Error: 7890

Message: Can't find file 'C:serverwamphtdocssitewwwwa-apps\shop/plugins/pluginname'.

magicq false

Куда копать?


1 ответ

  • 2
    Леонид Вакуленко Webasyst 26 января 2015 08:13 # Решение

    Если ещё актуально: подозреваю, что MySQL воспринимает \t в пути к файлу как табуляцию. Я бы попробовал без обратных слешей для начала.

    • +1
      Minya Jam Minya Jam 26 января 2015 08:26 #

      Я забил и сделал проще:

      if (stristr(PHP_OS, 'WIN'))
      $file_path = str_replace("\\", "/", $file_path);

      • +1

        Меня осенило. Надо же эскейпить переменные перед вставкой в SQL. Это самое простое и корректное решение.

        $file_path = $this->escape($file_path);

        • +1
          Minya Jam Minya Jam 26 января 2015 08:38 #

          а по умолчанию разве не эскейпит? При $this->query() ?

          • +1

            Конечно, нет. Если в query() приходит уже сформированная строка, поди отличи, что там надо эскейпить, а что нет.

            Удобно эскейпить вот так:

            $this->query('SELECT * FROM ... WHERE something=? AND something_else=? AND id IN (?)', array($something_value, $something_else_value, $array_of_ids));

            Тогда эскейпит. Вопросики заменяются на переменные в порядке следования. Кавычки добавляются, если в переменных приходят строки. Можно передавать массивы.

            Или можно ещё вот так:

            $this->query("SELECT * FROM ... WHERE id=:id OR something=:something", array( 'something' => ..., 'id' => ... ));

            • +1
              Minya Jam Minya Jam 26 января 2015 08:58 #

              Спасибо. Вот только почему в документацию не добавили escape метод

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите