Проблема с экранированием или 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 ErrorQuery: 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
Куда копать?
Эта тема в архиве. Добавление комментариев к ней отключено.










6 ответов
Если ещё актуально: подозреваю, что MySQL воспринимает \t в пути к файлу как табуляцию. Я бы попробовал без обратных слешей для начала.
Я забил и сделал проще:
if (stristr(PHP_OS, 'WIN'))
$file_path = str_replace("\\", "/", $file_path);
Меня осенило. Надо же эскейпить переменные перед вставкой в SQL. Это самое простое и корректное решение.
$file_path = $this->escape($file_path);
а по умолчанию разве не эскейпит? При $this->query() ?
Конечно, нет. Если в 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' => ... ));
Спасибо. Вот только почему в документацию не добавили escape метод