|
|
|
| Всем доброго дня! Имеется проблема, при заполнении таблицы при помощи импорта csv файла в столбец с тестом записываются значения только после точки или запятой, тире. Если в строке нет этих знаков, то строка остается пустой. В чем может быть проблема. Заносится русский текст. Если есть знак, то все вносится нормальным текстом. БД в кодировке cp1251. Таблицы тоже. Дело в том что есть колонка в которую идет запись не из csv файла, то там все нормально вносится. И еще интересная вещь, в другом столбце есть цена, так вот это тоже вносится нормально. Скорей всего потому что перед текстом есть точка.
979002 Провод жгут 3 27.24 Грн.
979003 Провод. жгут 4 25.31 Грн.
979006 Провод, жгут 8 27.24 Грн.
979008 Провод жгут 10 27.24 Грн.
979009 Провод жгут 1 27.24 Грн.
|
| |
|
|
|
|
|
|
|
для: magic
(09.08.2010 в 01:21)
| | как производится импорт? | |
|
|
|
|
|
|
|
для: Trianon
(09.08.2010 в 07:55)
| | Да, конечно, забыл сказать. Импорт производится insert ' ом. на локальной машине все грузится без проблем. А такая ситуация происходит на хосте. Когда то этот код я обсуждал здесь.
<?php
$query_id_postav = mysql_query ("select id_postavshik, gorod from art_postavshik where name_postav = '$postav'");
$id_postav = mysql_result($query_id_postav, 0, 'id_postavshik');
$gorod = mysql_result($query_id_postav, 0, 'gorod');
$id = '0';
$query = '';
$newline = "INSERT INTO $table_postav VALUES";
mysql_query ("TRUNCATE TABLE $table_postav");
$fp = fopen($csv_file, "r");
while($data = fgetcsv($fp, 1000, ";"))
{
list($kod_zapchas, $name_zapchas, $kolichestvo, $cena) = $data;
$cena = str_replace(',', '.', $cena);
$query .= "$newline ('$id_postav', '$kod_zapchas', '$name_zapchas', '$kolichestvo', '$cena', now(), '$gorod')";
$newline = ',';
}
fclose($fp);
if (mysql_query($query)) { echo "Прайс обновлен <br>"; }
else { exit(mysql_error()); }
?>
|
| |
|
|
|
|
|
|
|
для: magic
(09.08.2010 в 10:36)
| | еще неплохо было бы привести структуру таблицы и пример csv, который не проходит.
Только всё это уже после ознакомления с функцией mysql_real_escape_string() и применения ея в должных местах.
В Вашем скрипте я таких мест насчитал 7 штук. | |
|
|
|
|
|
|
|
для: Trianon
(09.08.2010 в 11:02)
| | Структура таблицы
CREATE TABLE `art_price_karina` (
`id_postavshik` int(11) NOT NULL default '0',
`kod_zapchasti` char(32) NOT NULL default '',
`name_zapchasti` char(32) NOT NULL default '',
`kolichestvo` char(32) default '',
`cena` char(32) default '',
`data_obnovlenya` date NOT NULL default '0000-00-00',
`gorod` char(32) default ''
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
|
CSV файл.
979002;Провод жгут ;3;27,24 Грн.
979003;Провод. жгут;4;25,31 Грн.
979006;Провод. жгут;8;27,24 Грн.
979008;Провод, жгут;10;27,24 Грн.
979009;Провод ,жгут;1;27,24 Грн.
979010;Провод жгут;9;27,24 Грн.
979011;Провод жгут;9;37,06 Грн.
979012;Провод жгут;4;37,06 Грн.
979013;Провод жгут;10;27,24 Грн.
979016;Провод жгут;11;37,06 Грн.
|
ID поставщика, время и город берется из другой таблицы БД, тут все нормально.
По поводу mysql_real_escape_string(), надо добавить сюда
<?php
while($data = fgetcsv($fp, 1000, ";"))
{
list($kod_zapchas, $name_zapchas, $kolichestvo, $cena) = $data."'";
$name_zapchas = "'".mysql_real_escape_string($name_zapchas)."'";
$kod_zapchas = "'".mysql_real_escape_string($kod_zapchas)."'";
$kolichestvo = "'".mysql_real_escape_string($kolichestvo)."'";
$cena = "'".mysql_real_escape_string($cena)."'";
$cena = str_replace(',', '.', $cena);
$query .= "$newline ('$id_postav', '$kod_zapchas', '$name_zapchas', '$kolichestvo', '$cena', now(), '$gorod')";
$newline = ',';
}
?>
|
| |
|
|
|
|
|
|
|
для: magic
(09.08.2010 в 11:26)
| | Зачем цена строковым значением, или расчетов с ней не предполагается? | |
|
|
|
|
|
|
|
для: sim5
(09.08.2010 в 12:18)
| | Нет расчетов с ценой не будет, это просто прайс. $id_postav, $data, $gorod берется из бд, зачем их обрабатывать? А по теме что можете сказать, на счет не корректного добавления. | |
|
|
|
|
|
|
|
для: magic
(09.08.2010 в 12:35)
| | А почему код заказчика и количество это строки? Исходя из того, что вышеуказанный код и количество, а также id поставки, это все таки должны быть числа:
<?
$id_postav = 12;
$gorod = "as";
while($data = fgetcsv($fp, 1000, ";")) {
$data = array_map('trim', $data);
array_walk($data, create_function('&$v','if(!is_numeric($v))
$v = "\'" . mysql_real_escape_string($v) . "\'";'));
//now() для примера изменен на date()
$data = "(" . $id_postav . "," . implode(',', $data) . "," . date('Y-m-d') . ",'" . mysql_real_escape_string($gorod) . "')";
//это оформленная строка значений для вставки
echo $data . '<br>';
}
|
И не вижу причины по которой бы не записалось это. | |
|
|
|
|
|
|
|
для: Trianon
(09.08.2010 в 11:02)
| | я 6 штук насчитала. | |
|
|
|
|
|
|
|
для: Лена
(09.08.2010 в 11:58)
| | там еще сверху в SELECT'е :) | |
|
|
|
|
|
|
|
для: Trianon
(09.08.2010 в 12:11)
| | Я в SELECT'е как раз и посчитала :)
Зачем экранировать $id_postav? | |
|
|
|
|
|
|
|
для: Лена
(09.08.2010 в 12:13)
| | А я почем знаю?
Апострофы стоят - значит надо. | |
|
|
|
|
|
|
|
для: Trianon
(09.08.2010 в 12:34)
| | А что апострофы, где апострофы? Можно по подробней как-то, я уже запутался кто о чем. Ну а че там по поводу ошибки добавления. | |
|
|
|
|
|
|
|
для: magic
(09.08.2010 в 12:41)
| | >А что апострофы, где апострофы? Можно по подробней как-то, я уже запутался кто о чем. Ну а че там по поводу ошибки добавления.
вот в этой строке:
$query .= "$newline ('$id_postav', '$kod_zapchas', '$name_zapchas', '$kolichestvo', '$cena', now(), '$gorod')";
|
раз стоят апострофы, значит значение между ними должно быть пропущено через процедуру экранирования спецсимволов. | |
|
|
|
|
|
|
|
для: Trianon
(09.08.2010 в 12:47)
| | Сделал вот так
<?php
$fp = fopen($csv_file, "r");
while($data = fgetcsv($fp, 1000, ";"))
{
list($kod_zapchas, $name_zapchas, $kolichestvo, $cena) = $data;
$id_postav = (int)$id_postav;
$kod_zapchas = mysql_real_escape_string($kod_zapchas);
$name_zapchas = mysql_real_escape_string($name_zapchas);
$kolichestvo = (int)$kolichestvo;
$cena = (float)str_replace(',', '.', $cena);
$gorod = mysql_real_escape_string($gorod);
$query .= "$newline ('$id_postav', '$kod_zapchas', '$name_zapchas', '$kolichestvo', '$cena', now(), '$gorod')";
$newline = ',';
}
fclose($fp);
?>
|
теперь правильно или есть еще замечания | |
|
|
|
|
|
|
|
для: magic
(09.08.2010 в 12:57)
| | зачем апострофы вокруг числовых значений?
Если стоят апострофы - где экранирование спецсимволов?
PS. Довольно наивно считать себя самым упрямым.... | |
|
|
|
|
|
|
|
для: Trianon
(09.08.2010 в 13:37)
| | Да я и не считаю себя упрямым. Особенно когда общаюсь с людьми которые пытаются меня чему то научить. Просто это по не знанию. А где можно все это почитать? Т.е. везде где числовые значения апострофы не ставятся?
Нужно переписать так:
<?php
$fp = fopen($csv_file, "r");
while($data = fgetcsv($fp, 1000, ";"))
{
list($kod_zapchas, $name_zapchas, $kolichestvo, $cena) = $data;
$id_postav = (int)$id_postav;
$kod_zapchas = mysql_real_escape_string($kod_zapchas);
$name_zapchas = mysql_real_escape_string($name_zapchas);
$kolichestvo = (int)$kolichestvo;
$cena = (float)str_replace(',', '.', $cena);
$gorod = mysql_real_escape_string($gorod);
$query .= "$newline ($id_postav, '$kod_zapchas', '$name_zapchas', $kolichestvo, $cena, now(), '$gorod')";
$newline = ',';
}
fclose($fp);
?>
|
| |
|
|
|
|
|
|
|
для: magic
(09.08.2010 в 12:57)
| | Даже не знаю что и делать. Получается что текст в наименовании товара вообще не вписывает, как писал в начале, если есть знак препинания то вписывает только после него. Что может быть. | |
|
|
|
|
|
|
|
для: magic
(09.08.2010 в 13:40)
| | а проблема лишь в столбике `name_zapchasti` ? | |
|
|
|
|
 77.5 Кб |
|
|
для: Trianon
(09.08.2010 в 13:48)
| | Да, получается id_postav - целое число, код запчасти в перемешку но вроде все загружает, name_zapchasti - один текст, количество целые числа, цена - тоже числа с точкой, дата - понятно, и город - тоже текст, но берется не из csv файла а из БД вытаскивается от поставщика. Получается проблема только с name_zapchasti.
В файле выложил скрин из admina. может поможет. Все что после точки в name_zapchasti грузит что интересно не зависимо на каком языке, а вот пустые поля это значит там нет знаков препинания. В CSV все поля заполнены | |
|
|
|
|
|
|
|
для: magic
(09.08.2010 в 13:57)
| | Как охота матюгнуться иногда, аж кулаки чешутся. Я ваш csv записываю без проблем тем кодом, который показал выше. Единственно, что у вас семь пятниц на неделе, ибо сперва вам цена пофигу, хватит и строки, тепереча как вижу float. Вам станцевать еще может быть? | |
|
|
|
|
 26.7 Кб |
|
|
для: magic
(09.08.2010 в 13:57)
| | у меня Ваш скрипт отрабатывает без вопросов.
см аттач.
если таблица (или обмен данными) в utf8, я посоветовал бы увеличить размер поля и сделать его varchar
`name_zapchasti` varchar(255); | |
|
|
|
|
|
|
|
для: Trianon
(09.08.2010 в 14:41)
| | на локале у меня тоже работает исключительно, а вот на сервере не хочет , изменил размер поля все равно проблема осталась. | |
|
|
|
|
|
|
|
для: magic
(09.08.2010 в 17:52)
| | результат работы fgetcsv на сервере пробовали выводить? | |
|
|
|
|
|
|
|
для: Trianon
(09.08.2010 в 17:55)
| | Получается вывожу на экран еще до записи в БД, он уже выдает обрезанные слова. Т.е получается БД как и не причем.. Что может быть с fgetcsv. | |
|
|
|
|
|
|
|
для: magic
(09.08.2010 в 18:57)
| | какая версия php на сервере? | |
|
|
|
|
|
|
|
для: Trianon
(09.08.2010 в 19:14)
| | версия php 5.2.10 | |
|
|
|
|
|
|
|
для: magic
(09.08.2010 в 20:34)
| | . | |
|
|
|
|
|
|
|
для: magic
(10.08.2010 в 02:44)
| | а язык локали у Вас на сервере случайно не utf-8? | |
|
|
|
|
|
|
|
для: Trianon
(10.08.2010 в 09:02)
| | Вообще же, судя по тому, что в версии 5.3.0 в функцию fgetcsv был внесен параметр escape (с умалчиваемым значением "обратный слэш"), то как это ни прискорбно, о надежном применении этой функции в прямых целях по отношению к csv-файлам MS Office можно забыть.
Впрочем, у Вас версия пораньше.
Я тут как-то давно показывал собственную реализацию... которая хороша всем, разве что не умеет кушать многострочные значения в ячейках CSV-файла. Надо будет всё же её допилить её на досуге, хоть эти самые многострочные значения и экзотика, с которой сталкиваешься раз в 5 лет в среднем... где б только взять тот досуг? | |
|
|
|
|
|
|
|
для: Trianon
(10.08.2010 в 09:02)
| | А как его можно посмотреть и поменять этот язык локали, и вообще возможно ли? | |
|
|
|
|
|
|
|
для: magic
(10.08.2010 в 10:55)
| | наверное | |
|
|
|
|
|
|
|
для: Trianon
(10.08.2010 в 10:57)
| | Ну и как? | |
|
|
|
|
|
|
|
для: magic
(10.08.2010 в 11:39)
| | Так навскидку не знаю.
Вам не кажется, что это явный оффтопик?
И что его сперва неплохо было бы поиском порешать? | |
|
|
|
|
 78 Кб |
|
|
для: Trianon
(10.08.2010 в 11:53)
| | Не знаю то или не то. В прикрепленном файле показывает вроде RU, HTTP_ACCEPT_LANGUAGE. | |
|
|
|
|
|
|
|
для: Trianon
(10.08.2010 в 11:53)
| | Ну в общем кому надо нашел в инете файл, который отрабатывает нормально, по крайней мере пока вроде. Получается что это функция fgetcsv глучит. Если кому интересно вот ссылка http://forum.dklab.ru/viewtopic.php?t=9549 | |
|
|
|