|
| |
|
|
| |
для: elenaki
(26.09.2006 в 19:28)
| | | Я имел в виду нечто такое:
foreach(array('ID','PRICE','OFFER','AVAILAB','FAMCAT','SUBCAT',
'MANUF','MARKA','DESCR','RETPRICE','KERDOS','ESHOP','APOPOU') as $name)
{
$val = $item[$name];
// nazvanie polya i znachenie
// print "\n<br><b>" . $name ."</b> ". $val;
|
В случае многострокового запроса(его совсем необязательно вытягивать в одну строку):
xml_parser_free($xml_parser);
// cikl perebora knig
$query = '';
$line_sep = "INSERT INTO price values \r\n" ;
foreach($books as $item)
{
$query .= "$line_sep ";
$line_sep = ",\r\n"
$field_sep = "(";
foreach(array('ID','PRICE','OFFER','AVAILAB','FAMCAT','SUBCAT',
'MANUF','MARKA','DESCR','RETPRICE','KERDOS','ESHOP','APOPOU') as $name)
{
$val = $item[$name];
// $name - nazvanie elementa
// $val - znachenie elementa
$query .= "$field_sep'".mysql_escape_string($val)."'";
$field_sep = ",";
}
$query .= ')';
}
//echo $query;
$res = mysql_query($query);
if(!$res) die("error in insert request: [$query] ". mysql_error());
|
| |
| |
|
|
| |
|
|
| |
для: Trianon
(26.09.2006 в 17:51)
| | | Вот если бы foreach, перечисляющий поля опирался не на тег, а на список столбцов в базе, это пустое поле никто даже и не заметил бы. вообще-то я от него избавился, поставив
$book["$tagName"]=''; под условие.
==========================================================================
не поняла. столбцы в базе - те же, что и тэги внутри <ttt></ttt>. вы предлагаете перед values
в команде insert перечислять поля? только те, в которых есть значения? и только их и
вставлять?
Скрипт сильно напрашивается быть слегка измененным в сторону формирования одного оператора INSERT на много добавляемых строк. Возможно даже все сразу.
=========================================================================
мне кажется, по одной лучше. во всяком случае, при ошибке я сразу вижу, на какой строке
он споткнулся. а будет один запрос - скажет ошибка в строке 1 и где ее искать, если строка
на сотни тысяч символов? | |
| |
|
|
| |
|
|
| |
для: elenaki
(26.09.2006 в 17:31)
| | | Вот если бы foreach, перечисляющий поля опирался не на тег, а на список столбцов в базе, это пустое поле никто даже и не заметил бы. вообще-то я от него избавился, поставив
$book["$tagName"]=''; под условие.
Скрипт сильно напрашивается быть слегка измененным в сторону формирования одного оператора INSERT на много добавляемых строк. Возможно даже все сразу. | |
| |
|
|
| |
|
|
| |
для: Trianon
(26.09.2006 в 17:12)
| | | если элементы в теге TTT пойдут в другом порядке
=========================================
не пойдут. XML делается из VisualBasic. он может быть только в таком виде и ни в каком другом. это было главным условием.
Можно так, например, сделать.
==========================
не годится. вставляет пустое поле перед самым первым, перед id.
все равно, спасибо. вроде, разобралась. все грузит. | |
| |
|
|
| |
|
|
| |
для: elenaki
(26.09.2006 в 15:55)
| | | У Вас пустые <offer/> а не </offer>
Можно так, например, сделать.
function startElement($parser, $name, $attrs)
{
global $book, $inBook, $tagName;
// esli vstretili nachalniy teg BOOK
if ($name=="TTT")
{
// ukajem, chto mi v nem
$inBook=true;
$tagName = "";
}
else
{
if($inBook)
{
$tagName = $name;
$book["$tagName"]='';
}
}
}
|
но метод всё равно аховый.
Вы представляете, что будет, если элементы в теге TTT пойдут в другом порядке? | |
| |
|
|
| |
|
|
| |
для: Trianon
(25.09.2006 в 21:13)
| | | нашла парсер, который парсит XML и дает мне инфу в нужном виде. одно плохо, пустые тэги типа </offer> или </subcat> (там, где нет никаких данных), он в упор не видит. а мне надо в запрос-то их все равно вставлять... что посоветуете? менять скриптом </offer> на <offer></offer>? или есть способ лучше? (парсер в аттаче, кому надо) | |
| |
|
|
| |
|
|
| |
для: elenaki
(25.09.2006 в 21:12)
| | | а в принципе, индексы ttt-тегов будут перечислены в массиве $index['VFPDATA'],
конечно, для этого придется оставить этот уровень в исходном тексте. | |
| |
|
|
| |
|
|
| |
для: elenaki
(25.09.2006 в 20:19)
| | | > а когда их много будет, откуда узнать, какой индекс вытягивать
А их не должно быть много. Каждую считанную порцию нужно парсить отдельно.
То есть можно конечно весь файл отпарсить, но если он большой, памяти может не хватить. Так что лучше - отдельно. | |
| |
|
|
| |
|
|
| |
для: Trianon
(25.09.2006 в 21:02)
| | | Hy, это я видела и раньше. выводит то, что в первой паре тэгов <ttt></ttt>. а следующую как? а сотую? а тысячную? a BCE? | |
| |
|
|
| |
|
|
| |
для: elenaki
(25.09.2006 в 20:19)
| | | А если так посмотреть?
$p = xml_parser_create();
xml_parse_into_struct($p, $simple, $vals, $index);
xml_parser_free($p);
foreach(array('ID','PRICE','OFFER','AVAILAB','FAMCAT','SUBCAT',
'MANUF','MARKA','DESCR','RETPRICE','KERDOS','ESHOP','APOPOU') as $key)
{
$val = $index[$key][0];
echo "<br>$key : ";
if(isset($vals[$val]['value']))
echo $vals[$val]['value'];
else
echo "---";
}
|
| |
| |
|
|
|