Парсинг xml файла от 1с с помощью simplexml

alekciy

Новичок
PHP:
mysql_query('
	INSERT INTO
		product (
			  quantity
			, product_id
			, model
			, price
		)
	VALUES (
		  "' . $product['Количество'] . '"
		, "' . $product->СсылкаНаТовар['ИдентификаторВКаталоге'] . '"
		, "' . $product->ЗначениеСвойства['Значение'] . '"
		, "' . $product['Цена'] . '"
	)
');
База должна быть в utf8, файл должен быть в utf8, скрипт должен быть в utf8, SET NAMES utf8 запрос нужно выполнить сразу же после connect.
 

Serdes

Новичок
База должна быть в utf8, файл должен быть в utf8, скрипт должен быть в utf8, SET NAMES utf8 запрос нужно выполнить сразу же после connect.
Simplexml не понимает UTF-8
Warning: simplexml_load_file() [function.simplexml-load-file]: demo.xml:1: parser error : switching encoding: encoder error in C:\home\test1.ru\www\insert.php on line 5

Warning: simplexml_load_file() [function.simplexml-load-file]: <ПакетПредложений �дентификаторКаталога="12 in C:\home\test1.ru\www\insert.php on line 5

Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in C:\home\test1.ru\www\insert.php on line 5

Warning: simplexml_load_file() [function.simplexml-load-file]: demo.xml:1: parser error : Blank needed here in C:\home\test1.ru\www\insert.php on line 5

Warning: simplexml_load_file() [function.simplexml-load-file]: <ПакетПредложений �дентификаторКаталога="12 in C:\home\test1.ru\www\insert.php on line 5

Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in C:\home\test1.ru\www\insert.php on line 5

Warning: simplexml_load_file() [function.simplexml-load-file]: demo.xml:1: parser error : parsing XML declaration: '?>' expected in C:\home\test1.ru\www\insert.php on line 5

Warning: simplexml_load_file() [function.simplexml-load-file]: <ПакетПредложений �дентификаторКаталога="12 in C:\home\test1.ru\www\insert.php on line 5

Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in C:\home\test1.ru\www\insert.php on line 5

Warning: simplexml_load_file() [function.simplexml-load-file]: demo.xml:3: parser error : Extra content at the end of the document in C:\home\test1.ru\www\insert.php on line 5

Warning: simplexml_load_file() [function.simplexml-load-file]: <Предложение Количество="5" Цена="25" НормаУпаРin C:\home\test1.ru\www\insert.php on line 5

Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in C:\home\test1.ru\www\insert.php on line 5

Warning: Invalid argument supplied for foreach() in C:\home\test1.ru\www\insert.php on line 8
 

alekciy

Новичок
Ну пусть будет cp1251, тем более винда. Но пусть будет единая кодировка везде.
 

Serdes

Новичок
utf8_general_ci от utf8_unicode_ci чем отличатсся ? База данных у меня в utf8_general_ci кодировке
 

Serdes

Новичок
PHP:
<?  
    $db = mysql_connect('localhost','root','');
    mysql_select_db('oc',$db);
	mysql_set_charset('utf8');
        $importFile = 'demo.xml';
        $xml = simplexml_load_file($importFile);
        $data = array();
        
        foreach($xml->ПакетПредложений->Предложение as $product)
        {
        mysql_query('
            INSERT INTO
                product (
                      quantity
                    , product_id
                    , model
                    , price
                )
            VALUES (
                  ' . $product['Количество'] . '
                , ' . $product->СсылкаНаТовар['ИдентификаторВКаталоге'] . '
                , ' . $product->ЗначениеСвойства['Значение'] . '
                , ' . $product['Цена'] . '
            )
            ');
        echo '<p>';
        echo mysql_error();
        }
?>
........ я в ахуе,всё перевёл в UTF-8 без BOM ,не работает, выдаёт ошибку:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'диск Verbatim Slim Case 1 шт (700МВ, 8х-12х) , 25 ' at line 11

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Alcatel OTE DB/300/500/700 , 7 )' at line 11
 

fixxxer

К.О.
Партнер клуба
Замени mysql_query на echo. Сразу увидишь, что то, что ты генерируешь, похоже на sql очень отдаленно.
 

Serdes

Новичок
INSERT INTO product ( quantity , product_id , model , price ) VALUES ( 5 , 00007218 , CD-RW диск Verbatim Slim Case 1 шт (700МВ, 8х-12х) , 25 )

INSERT INTO product ( quantity , product_id , model , price ) VALUES ( 2 , 00001653 , АЗУ Alcatel OTE DB/300/500/700 , 7 )
Мне это не о чём н говорит, хотя, если логически подумать такой запрос вроде нормальный...
 

Serdes

Новичок
Порылся и пришёл к выводу что входные данные неправильные......Но все равно решить не могу проблему


Чуть погодя, а как экранировать название товара ну там у меня всякие слеши и тому подобное
 

alekciy

Новичок
INSERT INTO product ( quantity , product_id , model , price ) VALUES ( 5 , 00007218 , CD-RW диск Verbatim Slim Case 1 шт (700МВ, 8х-12х) , 25 )

INSERT INTO product ( quantity , product_id , model , price ) VALUES ( 2 , 00001653 , АЗУ Alcatel OTE DB/300/500/700 , 7 )
Мне это не о чём н говорит, хотя, если логически подумать такой запрос вроде нормальный...
Блииин... ну ёперный театр... Ну для кого и нафига это писал этот пост http://phpclub.ru/talk/threads/Парсинг-xml-файла-от-1с-с-помощью-simplexml.72423/page-2#post-646648 Куда делись двойные кавычки?! Причем в рамках данной темы это второй случай уже и точно так же бы проигнорировано замечание http://phpclub.ru/talk/threads/Парсинг-xml-файла-от-1с-с-помощью-simplexml.72423/#post-646636 о скобках. Мануал мы не читаем, советы игнорируем... "если с первого раза не получилось, то парашютный спорт не для вас" (с).
 

Serdes

Новичок
PHP:
<?  
    $db = mysql_connect('localhost','root','');
    mysql_select_db('oc',$db);
	mysql_set_charset('utf8');
        $importFile = 'demo.xml';
        $xml = simplexml_load_file($importFile);
        $data = array();
        
        foreach($xml->ПакетПредложений->Предложение as $product)
        {
        //Запись в таблицу product
		mysql_query
		('
            INSERT INTO
                product (quantity,product_id,price)
            VALUES ('.$product['Количество'].','.$product->СсылкаНаТовар['ИдентификаторВКаталоге'].','.$product['Цена'].')
            ');
        echo '<p>';
		//Запись в таблицу product_description
		mysql_query
		('
            INSERT INTO
                product_description (product_id,name)
            VALUES ('.$product->СсылкаНаТовар['ИдентификаторВКаталоге'].','.mysql_real_escape_string($product->ЗначениеСвойства['Значение']).')
            ');
        echo '<p>';
        echo mysql_error();
        }
?>
Вроде всё правильно, почитал мануал про экранизацию.........Кстати первый mysql_query выполняет и записывает в базу, а второй если вместо бук поставить число то и второй выполняется....
 

Serdes

Новичок
PHP:
<?  
    $db = mysql_connect('localhost','root','');
    mysql_select_db('oc',$db);
	mysql_set_charset('utf8');
        $importFile = 'demo.xml';
        $xml = simplexml_load_file($importFile);
        $data = array();
        
        foreach($xml->ПакетПредложений->Предложение as $product)
        {
        //Запись в таблицу product
		mysql_query
		('
           INSERT INTO
                product (quantity,product_id,price)
           VALUES ('.$product['Количество'].','.$product->СсылкаНаТовар['ИдентификаторВКаталоге'].','.$product['Цена'].')
            ');
        echo '<p>';
		//Запись в таблицу product_description
		mysql_query
		//echo
		("
            INSERT INTO
                product_description (product_id,name)
            VALUES ('$product->СсылкаНаТовар[\'ИдентификаторВКаталоге\']','$product->ЗначениеСвойства[\'Значение\']')
			");
        echo '<p>';
        echo mysql_error();
        }
?>
Всё записывает, ошибок но только в таблице product_description в столбце name везде ['Значение']
 

fixxxer

К.О.
Партнер клуба
1)почитай, как в php обрабатываются строки с двойными кавычками
2)прочитай синтаксис команды INSERT INTO, разберись где должны быть кавычки
3)напиши ПРАВИЛЬНЫЙ запрос РУКАМИ (отладь в том же phpMyAdmin-е или mysql-консоли), и потом добивайся, чтобы твой код (где временно стоит echo вместо mysql_query) выводил точно такое же.
 

Serdes

Новичок
Модифицировал для другого xml файла
PHP:
<?  
    $db = mysql_connect('localhost','root','');
    mysql_select_db('oc',$db);
	mysql_query("SET NAMES utf8");
        $importFile = 'xml_1c_2.xml';
        $xml = simplexml_load_file($importFile);
        $data = array();
        
        foreach($xml->Каталог->Товар as $product)
        {
        //Запись в таблицу product_to_category
		mysql_query
		('
           REPLACE INTO
                product_to_category (product_id,category_id)
           VALUES ('.$product['ИдентификаторВКаталоге'].','.$product['Родитель'].')
            ');
        echo '<p>';
		//Запись в таблицу product_description
		mysql_query
		("
            REPLACE INTO
                product_description (product_id,name)
            VALUES (".$product['ИдентификаторВКаталоге'].",'".$product['Наименование']."')
			");
        echo '<p>';
        echo mysql_error();
        }
		?><?
		        foreach($xml->Каталог->Группа as $category)
        {
        //Запись в таблицу  category_description
		mysql_query
		("
           REPLACE INTO
                 category_description (category_id,name)
           VALUES (".$category['Идентификатор'].",'".$category['Наименование']."')
            ");
        echo '<p>';
		//Запись в таблицу  category
		mysql_query
		("
            REPLACE INTO
                 category (category_id,parent_id)
            VALUES (".$category['Идентификатор'].",".$category['Родитель'].")
			");
        echo '<p>';
        echo mysql_error();
        }
?>
Ошибка Warning: Invalid argument supplied for foreach() in C:\home\test1.ru\www\insert_v2.php on line 9

Warning: Invalid argument supplied for foreach() in C:\home\test1.ru\www\insert_v2.php on line 30
Не могу понять в чём проблема
 
Сверху