Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблема с записью в БД
 
 автор: magic   (09.08.2010 в 01:21)   письмо автору
 
 

Всем доброго дня! Имеется проблема, при заполнении таблицы при помощи импорта csv файла в столбец с тестом записываются значения только после точки или запятой, тире. Если в строке нет этих знаков, то строка остается пустой. В чем может быть проблема. Заносится русский текст. Если есть знак, то все вносится нормальным текстом. БД в кодировке cp1251. Таблицы тоже. Дело в том что есть колонка в которую идет запись не из csv файла, то там все нормально вносится. И еще интересная вещь, в другом столбце есть цена, так вот это тоже вносится нормально. Скорей всего потому что перед текстом есть точка.

979002    Провод жгут     3    27.24 Грн.
979003    Провод. жгут    4    25.31 Грн.
979006    Провод, жгут    8    27.24 Грн.
979008    Провод жгут    10    27.24 Грн.
979009    Провод жгут    1    27.24 Грн.

  Ответить  
 
 автор: Trianon   (09.08.2010 в 07:55)   письмо автору
 
   для: magic   (09.08.2010 в 01:21)
 

как производится импорт?

  Ответить  
 
 автор: magic   (09.08.2010 в 10:36)   письмо автору
 
   для: 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_postav0'id_postavshik');
$gorod =  mysql_result($query_id_postav0'gorod');

$id '0';
$query '';
$newline "INSERT INTO $table_postav VALUES";
mysql_query ("TRUNCATE TABLE $table_postav");

$fp fopen($csv_file"r");
while(
$data fgetcsv($fp1000";"))
{
    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()); }
?>

  Ответить  
 
 автор: Trianon   (09.08.2010 в 11:02)   письмо автору
 
   для: magic   (09.08.2010 в 10:36)
 

еще неплохо было бы привести структуру таблицы и пример csv, который не проходит.
Только всё это уже после ознакомления с функцией mysql_real_escape_string() и применения ея в должных местах.
В Вашем скрипте я таких мест насчитал 7 штук.

  Ответить  
 
 автор: magic   (09.08.2010 в 11:26)   письмо автору
 
   для: 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($fp1000";"))
{
               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 ',';
}
?>

  Ответить  
 
 автор: sim5   (09.08.2010 в 12:18)   письмо автору
 
   для: magic   (09.08.2010 в 11:26)
 

Зачем цена строковым значением, или расчетов с ней не предполагается?

  Ответить  
 
 автор: magic   (09.08.2010 в 12:35)   письмо автору
 
   для: sim5   (09.08.2010 в 12:18)
 

Нет расчетов с ценой не будет, это просто прайс. $id_postav, $data, $gorod берется из бд, зачем их обрабатывать? А по теме что можете сказать, на счет не корректного добавления.

  Ответить  
 
 автор: sim5   (09.08.2010 в 13:03)   письмо автору
 
   для: magic   (09.08.2010 в 12:35)
 

А почему код заказчика и количество это строки? Исходя из того, что вышеуказанный код и количество, а также id поставки, это все таки должны быть числа:
<?
$id_postav 
12;
$gorod "as";
while(
$data fgetcsv($fp1000";")) { 
   
$data array_map('trim'$data); 
   
array_walk($datacreate_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>';
}

И не вижу причины по которой бы не записалось это.

  Ответить  
 
 автор: Лена   (09.08.2010 в 11:58)   письмо автору
 
   для: Trianon   (09.08.2010 в 11:02)
 

я 6 штук насчитала.

  Ответить  
 
 автор: Trianon   (09.08.2010 в 12:11)   письмо автору
 
   для: Лена   (09.08.2010 в 11:58)
 

там еще сверху в SELECT'е :)

  Ответить  
 
 автор: Лена   (09.08.2010 в 12:13)   письмо автору
 
   для: Trianon   (09.08.2010 в 12:11)
 

Я в SELECT'е как раз и посчитала :)
Зачем экранировать $id_postav?

  Ответить  
 
 автор: Trianon   (09.08.2010 в 12:34)   письмо автору
 
   для: Лена   (09.08.2010 в 12:13)
 

А я почем знаю?
Апострофы стоят - значит надо.

  Ответить  
 
 автор: magic   (09.08.2010 в 12:41)   письмо автору
 
   для: Trianon   (09.08.2010 в 12:34)
 

А что апострофы, где апострофы? Можно по подробней как-то, я уже запутался кто о чем. Ну а че там по поводу ошибки добавления.

  Ответить  
 
 автор: Trianon   (09.08.2010 в 12:47)   письмо автору
 
   для: magic   (09.08.2010 в 12:41)
 

>А что апострофы, где апострофы? Можно по подробней как-то, я уже запутался кто о чем. Ну а че там по поводу ошибки добавления.

вот в этой строке:
$query .= "$newline ('$id_postav', '$kod_zapchas', '$name_zapchas', '$kolichestvo', '$cena', now(), '$gorod')";


раз стоят апострофы, значит значение между ними должно быть пропущено через процедуру экранирования спецсимволов.

  Ответить  
 
 автор: magic   (09.08.2010 в 12:57)   письмо автору
 
   для: Trianon   (09.08.2010 в 12:47)
 

Сделал вот так

<?php
$fp 
fopen($csv_file"r");
while(
$data fgetcsv($fp1000";"))
{
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);
?>

теперь правильно или есть еще замечания

  Ответить  
 
 автор: Trianon   (09.08.2010 в 13:37)   письмо автору
 
   для: magic   (09.08.2010 в 12:57)
 

зачем апострофы вокруг числовых значений?
Если стоят апострофы - где экранирование спецсимволов?

PS. Довольно наивно считать себя самым упрямым....

  Ответить  
 
 автор: magic   (09.08.2010 в 13:45)   письмо автору
 
   для: Trianon   (09.08.2010 в 13:37)
 

Да я и не считаю себя упрямым. Особенно когда общаюсь с людьми которые пытаются меня чему то научить. Просто это по не знанию. А где можно все это почитать? Т.е. везде где числовые значения апострофы не ставятся?
Нужно переписать так:

<?php 
$fp 
fopen($csv_file"r"); 
while(
$data fgetcsv($fp1000";")) 

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 в 13:40)   письмо автору
 
   для: magic   (09.08.2010 в 12:57)
 

Даже не знаю что и делать. Получается что текст в наименовании товара вообще не вписывает, как писал в начале, если есть знак препинания то вписывает только после него. Что может быть.

  Ответить  
 
 автор: Trianon   (09.08.2010 в 13:48)   письмо автору
 
   для: magic   (09.08.2010 в 13:40)
 

а проблема лишь в столбике `name_zapchasti` ?

  Ответить  
 
 автор: magic   (09.08.2010 в 13:57)   письмо автору
77.5 Кб
 
   для: Trianon   (09.08.2010 в 13:48)
 

Да, получается id_postav - целое число, код запчасти в перемешку но вроде все загружает, name_zapchasti - один текст, количество целые числа, цена - тоже числа с точкой, дата - понятно, и город - тоже текст, но берется не из csv файла а из БД вытаскивается от поставщика. Получается проблема только с name_zapchasti.
В файле выложил скрин из admina. может поможет. Все что после точки в name_zapchasti грузит что интересно не зависимо на каком языке, а вот пустые поля это значит там нет знаков препинания. В CSV все поля заполнены

  Ответить  
 
 автор: sim5   (09.08.2010 в 14:18)   письмо автору
 
   для: magic   (09.08.2010 в 13:57)
 

Как охота матюгнуться иногда, аж кулаки чешутся. Я ваш csv записываю без проблем тем кодом, который показал выше. Единственно, что у вас семь пятниц на неделе, ибо сперва вам цена пофигу, хватит и строки, тепереча как вижу float. Вам станцевать еще может быть?

  Ответить  
 
 автор: Trianon   (09.08.2010 в 14:41)   письмо автору
26.7 Кб
 
   для: magic   (09.08.2010 в 13:57)
 

у меня Ваш скрипт отрабатывает без вопросов.
см аттач.

если таблица (или обмен данными) в utf8, я посоветовал бы увеличить размер поля и сделать его varchar

`name_zapchasti` varchar(255);

  Ответить  
 
 автор: magic   (09.08.2010 в 17:52)   письмо автору
 
   для: Trianon   (09.08.2010 в 14:41)
 

на локале у меня тоже работает исключительно, а вот на сервере не хочет , изменил размер поля все равно проблема осталась.

  Ответить  
 
 автор: Trianon   (09.08.2010 в 17:55)   письмо автору
 
   для: magic   (09.08.2010 в 17:52)
 

результат работы fgetcsv на сервере пробовали выводить?

  Ответить  
 
 автор: magic   (09.08.2010 в 18:57)   письмо автору
 
   для: Trianon   (09.08.2010 в 17:55)
 

Получается вывожу на экран еще до записи в БД, он уже выдает обрезанные слова. Т.е получается БД как и не причем.. Что может быть с fgetcsv.

  Ответить  
 
 автор: Trianon   (09.08.2010 в 19:14)   письмо автору
 
   для: magic   (09.08.2010 в 18:57)
 

какая версия php на сервере?

  Ответить  
 
 автор: magic   (09.08.2010 в 20:34)   письмо автору
 
   для: Trianon   (09.08.2010 в 19:14)
 

версия php 5.2.10

  Ответить  
 
 автор: magic   (10.08.2010 в 02:44)   письмо автору
 
   для: magic   (09.08.2010 в 20:34)
 

.

  Ответить  
 
 автор: Trianon   (10.08.2010 в 09:02)   письмо автору
 
   для: magic   (10.08.2010 в 02:44)
 

а язык локали у Вас на сервере случайно не utf-8?

  Ответить  
 
 автор: Trianon   (10.08.2010 в 09:24)   письмо автору
 
   для: Trianon   (10.08.2010 в 09:02)
 

Вообще же, судя по тому, что в версии 5.3.0 в функцию fgetcsv был внесен параметр escape (с умалчиваемым значением "обратный слэш"), то как это ни прискорбно, о надежном применении этой функции в прямых целях по отношению к csv-файлам MS Office можно забыть.
Впрочем, у Вас версия пораньше.

Я тут как-то давно показывал собственную реализацию... которая хороша всем, разве что не умеет кушать многострочные значения в ячейках CSV-файла. Надо будет всё же её допилить её на досуге, хоть эти самые многострочные значения и экзотика, с которой сталкиваешься раз в 5 лет в среднем... где б только взять тот досуг?

  Ответить  
 
 автор: magic   (10.08.2010 в 10:55)   письмо автору
 
   для: Trianon   (10.08.2010 в 09:02)
 

А как его можно посмотреть и поменять этот язык локали, и вообще возможно ли?

  Ответить  
 
 автор: Trianon   (10.08.2010 в 10:57)   письмо автору
 
   для: magic   (10.08.2010 в 10:55)
 

наверное

  Ответить  
 
 автор: magic   (10.08.2010 в 11:39)   письмо автору
 
   для: Trianon   (10.08.2010 в 10:57)
 

Ну и как?

  Ответить  
 
 автор: Trianon   (10.08.2010 в 11:53)   письмо автору
 
   для: magic   (10.08.2010 в 11:39)
 

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

  Ответить  
 
 автор: magic   (10.08.2010 в 13:04)   письмо автору
78 Кб
 
   для: Trianon   (10.08.2010 в 11:53)
 

Не знаю то или не то. В прикрепленном файле показывает вроде RU, HTTP_ACCEPT_LANGUAGE.

  Ответить  
 
 автор: magic   (13.08.2010 в 13:21)   письмо автору
 
   для: Trianon   (10.08.2010 в 11:53)
 

Ну в общем кому надо нашел в инете файл, который отрабатывает нормально, по крайней мере пока вроде. Получается что это функция fgetcsv глучит. Если кому интересно вот ссылка http://forum.dklab.ru/viewtopic.php?t=9549

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования