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

Форум MySQL

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

 

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

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

тема: Импорт из CSV в Mysql обрезание символов
 
 автор: emil116   (02.12.2011 в 01:50)   письмо автору
 
 

Здравствуйте! Есть сайт на CMS, делаю импорт в базу с каталогом товаров, на денвере импортируется всё и вся... Но когда начинается импорт на сервере слова групп обрезаются(например: в csv- автолампы маяк, а в базу заносятся как маяк, или еще- ВАЗ, ГАЗ, УАЗ в базу ,ГАЗ, УАЗ) В чем причина?
Как должно бытьhttp://hostingkartinok.com/image/01201112/89b64067f6f380366aa398a6d64bc32e.jpg

и как получается:
http://hostingkartinok.com/image/01201112/df18b7dfcb7c9be1ec41d9b3d194659f.jpg
http://hostingkartinok.com/image/01201112/eaa7cab63f636bc15fcafd2ffbe73462.jpg

Код формы:



<html>
<head>
<title>Импорт данных из CSV файла в базу MySQL</title>
</head>

<body>
<form action="/goto.php" method="post" enctype="multipart/form-data">
<label>Выберите файл для импорта:</label><br>
<input name="file" type="file" size="50"><br>
<input name="Load" type="submit" value="Load">
</form>
</body>
</html>






Код файла goto.php:



<?php
include "netcat/connect_io.php"// Соединение с базой

$url $_FILES["file"]["name"];
echo 
'Запись из файла: <b>'.$url.'</b><br>'// Имя файла

$file_exp explode("."$_FILES["file"]["name"]);
if (
$file_exp[1] != "csv") die("Неправильный формат файла."); // Допустимы файлы только с расширением csv


$handle fopen("".$url"r"); // Файл csv необходимо положить в папку tmp
while ($data fgetcsv($handle1000";")) { 
    
$sql mysql_query ("INSERT INTO Message57 
                                    (`Subdivision_ID`, `Sub_Class_ID`, `ItemID`, `Name`, `Price`, `GroupName`)
                                    VALUE 
                                    ('57', '142', '
$data[0]', '$data[1]', '$data[2]', '$data[3]')"
                                    
);
}
echo 
"Загрузка прошла успешно!<br>"// Всё что в запросе, меняем на свои данные
fclose ($handle);

// Ниже на экран выводятся спарсенные значения //
echo '<br><br><b>Все записи:</b><br>';
echo 
'<div style="font-size:10px">';
$row 1;
$fp fopen ("".$url,"r");
while (
$data fgetcsv ($fp1000";")) {
    
$num count ($data);
    print 
"<p> $num поля в линии $row: <br>";
    
$row++;
    for (
$c=0$c $num$c++) {
        print 
$data[$c] . "<br>";
    }
}
fclose ($fp);
echo 
"</div>";
?>

  Ответить  
 
 автор: cheops   (02.12.2011 в 13:26)   письмо автору
 
   для: emil116   (02.12.2011 в 01:50)
 

1. Выведите проблемный запрос в окно барузера - данные в нем нормальные или уже обрезанные? Ниже у вас выводятся значения - они выглядят нормальными, не обрезанными?
2. Все $data[0], ..., $data[3] в обязательном порядке перед вставкой прогоняйте через функцию mysql_escape_string().

Если не сложно, выполните оператор SHOW CREATE TABLE Message57 (на сервере, где проблемы) и прикрепите сюда результат.

  Ответить  
 
 автор: emil116   (02.12.2011 в 16:04)   письмо автору
 
   для: cheops   (02.12.2011 в 13:26)
 

данные выводятся в обрезанном виде, но с полем наименования товара такой проблемы нет!

  Ответить  
 
 автор: cheops   (02.12.2011 в 16:05)   письмо автору
 
   для: emil116   (02.12.2011 в 16:04)
 

Т.е. правильно ли я понимаю, что дело не в MySQL, а из fgetcsv() данные уже поступают в обрезанном виде?

  Ответить  
 
 автор: emil116   (02.12.2011 в 16:28)   письмо автору
 
   для: cheops   (02.12.2011 в 16:05)
 

CMS NetCat на denwere данные записываются правильно выводлятся тоже, но когда начинаю загружать на хостинге идет такое обрезание текста.

а вот с помощью этого записываются правильно кроме артикула что и на денвере что и на хосте
<?

/* config */
/**********/
$first 1// строка с которой начинаются значения
$arFields = array("0"=>"ItemID""1"=>"Name""2"=>"Price""3"=>"GroupName");  //  связь столбцов и полей компонента
$sub=92// id раздела
$cc=61;   // id компонента в разделе
$file="2.csv";
$class=57// id компонента
$control=0// столбец контроля (начиная с 0)
/**********/

require_once "vars.inc.php";
require 
$INCLUDE_FOLDER."index.php";

    
/* обработка csv */
    
$fp fopen($file,"r");
    while (
$data fgetcsv ($fp10000";")) {
        
$i++;
        if(
$i<$first || !trim($data[$control])) continue;
        
//if (!$data[$c]) $err[]="Строка $i: Ошибка нет идентификатора";
        //elseif(!$data[$class]) $err[]="Строка $i: Ошибка нет id шаблона";
        //else {


           
$insert "INSERT INTO Message$class(";
           foreach(
$arFields as $id=>$key$insert.="$key,\n";
                  
$insert.="
                  Subdivision_ID,
                  Sub_Class_ID,
                  Checked,
                  Created
           )           VALUES("
;
           foreach(
$arFields as $id=>$key$insert.="'".$data[$id]."',\n";
           
$insert.="
                     ItemID = '
$data[0]', 
                    Name = '
$data[1]', 
                    Price = '
$data[2]', 
                    GroupName = '
$data[3]'
           )

           "
;

           
//echo $insert;
           
$db->query($insert)  or die(mysql_error());
           
$success++;
           
//$err[]=$update;


     
}
echo 
"Обработано. Добавлено $success объектов.";
?>

  Ответить  
 
 автор: cheops   (02.12.2011 в 16:35)   письмо автору
 
   для: emil116   (02.12.2011 в 16:28)
 

К сожалению, невозможно воспроизвести ситуацию, у нас нет нет вашей CMS и вашего сервера, поэтому, мы можем ориентироваться только на ваш текст и ваши действия. Сейчас нужно понять, кто режет строки MySQL или fgetcsv() - в этом случае усилия по отладке, исправлению ситуации пойдут разными путями. Даже если мы не сможем с вами исправить ситуацию (например, это доступно только хостеру), мы сможем сформировать грамотное письмо в службу тех.поддержки, от которого она не отмахнется. Выведите данные после fgetcsv(), но до вставки в MySQL - есть там обрезка или нет? Если нет - это дело MySQL, если есть - значит виновата fgetcsv(). Так как система в ваших руках, никто кроме вас это сделать не сможет.

  Ответить  
 
 автор: emil116   (02.12.2011 в 16:41)   письмо автору
 
   для: cheops   (02.12.2011 в 16:35)
 

все теперь понял. с помощью какой функции вывести? fgets()???с этим с горем по полам разобрался!

  Ответить  
 
 автор: cheops   (02.12.2011 в 16:46)   письмо автору
 
   для: emil116   (02.12.2011 в 16:41)
 

Просто при помощи echo выведите SQL-запрос - все ли там на месте?
<?php
  
...
  echo 
"INSERT INTO Message57  
                                    (`Subdivision_ID`, `Sub_Class_ID`, `ItemID`, `Name`, `Price`, `GroupName`) 
                                    VALUE  
                                    ('57', '142', '
$data[0]', '$data[1]', '$data[2]', '$data[3]')";
  ...
?>

  Ответить  
 
 автор: emil116   (02.12.2011 в 17:02)   письмо автору
 
   для: cheops   (02.12.2011 в 16:46)
 

выводит уже срезанные значения!

  Ответить  
 
 автор: cheops   (02.12.2011 в 17:07)   письмо автору
 
   для: emil116   (02.12.2011 в 17:02)
 

Ага значит дело в fgetcsv (), если исправить второй параметр в 0, ситуация не исправляется?
fgetcsv ($fp, 0, ";")

  Ответить  
 
 автор: emil116   (02.12.2011 в 17:12)   письмо автору
 
   для: cheops   (02.12.2011 в 17:07)
 

выводит уже срезанные значения!
должно быть: Лампы головного света 12В NARVA
есть: 12В NARVA

fgetcsv ($fp, 0, ";") тоже самое.

в чем причина то может быть:(

  Ответить  
 
 автор: cheops   (02.12.2011 в 17:21)   письмо автору
 
   для: emil116   (02.12.2011 в 17:12)
 

Возможно дело в локали, скорее всего у вас UNIX-сервер, который по умолчанию не выставляет русскую локаль, в отличие от Windows. Попробуйте выставить локаль при помощи функции setlocale(), уточните в службе тех.поддержки вашего сервера как выставить для него русскую локаль (параметры отличаются от сервера к серверу).

  Ответить  
 
 автор: emil116   (02.12.2011 в 17:36)   письмо автору
 
   для: cheops   (02.12.2011 в 17:21)
 

&#65279;
<?php
include "netcat/connect_io.php"// Соединение с базой

header('Content-type: text/html; charset=utf-8');
    if(!
setlocale(LC_ALL'ru_RU.utf8')) setlocale(LC_ALL'en_US.utf8');
    if(
setlocale(LC_ALL0) == 'C') die('Не поддерживается ни одна из перечисленных локалей (ru_RU.utf8, en_US.utf8)');


$url $_FILES["file"]["name"];
echo 
'Запись из файла: <b>'.$url.'</b><br>'// Имя файла

$file_exp explode("."$_FILES["file"]["name"]);
if (
$file_exp[1] != "csv") die("Неправильный формат файла."); // Допустимы файлы только с расширением csv
echo(setLocale(LC_ALLNULL));

$handle fopen("".$url"r"); // Файл csv необходимо положить в папку tmp
while ($data fgetcsv($handle0";")) { 
 echo 
"INSERT INTO Message57   
                                    (`Subdivision_ID`, `Sub_Class_ID`, `ItemID`, `Name`, `Price`, `GroupName`)  
                                    VALUE   
                                    ('92', '61', '
$data[0]', '$data[1]', '$data[2]', '$data[3]')";



    
$sql mysql_query ("INSERT INTO Message57
                                    (`Subdivision_ID`, `Sub_Class_ID`, `ItemID`, `Name`, `Price`, `GroupName`)
                                    VALUE 
                                    ('92', '61', '
$data[0]', '$data[1]', '$data[2]', '$data[3]')"
                                    
);
}
echo 
"Загрузка прошла успешно!<br>"// Всё что в запросе, меняем на свои данные
fclose ($handle);

// Ниже на экран выводятся спарсенные значения //
echo '<br><br><b>Все записи:</b><br>';
echo 
'<div style="font-size:10px">';
$row 1;
$fp fopen ("".$url,"r");
while (
$data fgetcsv ($fp1000";")) {
    
$num count ($data);
    print 
"<p> $num поля в линии $row: <br>";
    
$row++;
    for (
$c=0$c $num$c++) {
        print 
$data[$c] . "<br>";
    }
}
fclose ($fp);
echo 
"</div>";
?>



попробывал менть значение групп,

12В NARVA Лампы головного света так выводит,
Лампы головного света 12В NARVA так нет.

хотя все в кодировке utf-8

  Ответить  
 
 автор: cheops   (02.12.2011 в 18:45)   письмо автору
 
   для: emil116   (02.12.2011 в 17:36)
 

А csv-файл у вас тоже в формате UTF-8?

  Ответить  
 
 автор: emil116   (02.12.2011 в 19:16)   письмо автору
 
   для: cheops   (02.12.2011 в 18:45)
 

Да, сначало сохраняю в экселе потом в нотпаде преобразовываю в utf-8

  Ответить  
 
 автор: cheops   (02.12.2011 в 19:56)   письмо автору
 
   для: emil116   (02.12.2011 в 19:16)
 

Может, кстати, и зря... у PHP нет поддержки UTF8 на уровне ядра, может стоить разобрать файл в однобайтовой кодировке, а уже потом на сервере после разбора преобразовать данные в UTF8 при помощи iconv().

  Ответить  
 
 автор: emil116   (04.12.2011 в 17:55)   письмо автору
 
   для: cheops   (02.12.2011 в 19:56)
 

&#65279;
<?php
include "netcat/connect_io.php"// Соединение с базой


header('Content-type: text/html; charset=utf-8');
    if(!
setlocale(LC_ALL'ru_RU.utf8')) setlocale(LC_ALL'en_US.utf8');
    if(
setlocale(LC_ALL0) == 'C') die('Не поддерживается ни одна из перечисленных локалей (ru_RU.utf8, en_US.utf8)');


$url $_FILES["file"]["name"];
echo 
'Запись из файла: <b>'.$url.'</b><br>'// Имя файла

$file_exp explode("."$_FILES["file"]["name"]);
if (
$file_exp[1] != "csv") die("Неправильный формат файла."); // Допустимы файлы только с расширением csv
echo(setLocale(LC_ALLNULL));

$handle fopen("".$url"r"); // Файл csv необходимо положить в папку tmp
while ($data fgetcsv($handle0";")) {
$data[0] = iconv('windows-1251','utf-8',$data[0]); //перекодировка
$data[1] = iconv('windows-1251','utf-8',$data[1]); //перекодировка
$data[2] = iconv('windows-1251','utf-8',$data[2]); //перекодировка
$data[3] = iconv('windows-1251','utf-8',$data[3]); //перекодировка
 
 
echo "INSERT INTO Message57   
                                    (`Subdivision_ID`, `Sub_Class_ID`, `ItemID`, `Name`, `Price`, `GroupName`)  
                                    VALUE   
                                    ('92', '61', '
$data[0]', '$data[1]', '$data[2]', '$data[3]')";



    
$sql mysql_query ("INSERT INTO Message57
                                    (`Subdivision_ID`, `Sub_Class_ID`, `ItemID`, `Name`, `Price`, `GroupName`)
                                    VALUE 
                                    ('92', '61', '
$data[0]', '$data[1]', '$data[2]', '$data[3]')"
                                    
);
}
echo 
"Загрузка прошла успешно!<br>"// Всё что в запросе, меняем на свои данные
fclose ($handle);

// Ниже на экран выводятся спарсенные значения //
echo '<br><br><b>Все записи:</b><br>';
echo 
'<div style="font-size:10px">';
$row 1;
$fp fopen ("".$url,"r");
while (
$data fgetcsv ($fp1000";")) {
    
$num count ($data);
    print 
"<p> $num поля в линии $row: <br>";
    
$row++;
    for (
$c=0$c $num$c++) {
        print 
$data[$c] . "<br>";
    }
}
fclose ($fp);
echo 
"</div>";
?>


не помагает!

  Ответить  
 
 автор: emil116   (08.12.2011 в 20:36)   письмо автору
 
   для: emil116   (02.12.2011 в 17:12)
 

Объсните пожалуйста!

Почему так в базу вносит: 12В NARVA Лампы головного света

а так: Лампы головного света 12В NARVA получается:12В NARVA

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

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