xpdo: некорректная выборка из базы

A
На сайте с 18.10.2007
Offline
125
893

<?php
$modx->addPackage('goods', $modx->getOption('core_path').'components/goods/model/','cust_');

$url = 'assets/files/import/test.xml';

$xml = simplexml_load_file($url);
foreach ($xml->Good as $Good) {
$GoodGUID = $Good->GUID;
$GoodCode = $Good->Code;
$GoodCode = str_replace("," , '.', $GoodCode);
$GoodCode = preg_replace("/[^x\d|*\.]/", "", $GoodCode);
$GoodArticul = $Good->Articul;
$GoodTitle = trim($Good->Title);
$GoodPrice = $Good->Price;
$GoodPrice = str_replace("," , '.', $GoodPrice);
$GoodPrice = preg_replace("/[^x\d|*\.]/", "", $GoodPrice);
$GoodAmount = $Good->Amount;

$g = $modx->getObject('goods', array(
'guid' => $GoodGUID
));

if (!$g) {
print $GoodGUID.' - Товар не найден, добавлен<hr />';
$g = $modx->newObject('goods', array(
'guid' => $GoodGUID,
'code' => $GoodCode,
'articul' => $GoodArticul,
'title' => $GoodTitle,
'price' => $GoodPrice,
'content' => '',
'alias' => '',
'amount' => $GoodAmount,
'published' => 1,
'hidemenu' => 0
));
} else {
print $GoodGUID.' - Товар найден, обновлен<hr />';
$g->fromArray(array(
'amount' => $GoodAmount
));
}
$g->save();
}

Есть такой код. При выполнении, если база пустая - первый товар добавляется как должен, а все остальные обновляют его. Почему-то вот этот запрос

	$g = $modx->getObject('goods', array(
'guid' => $GoodGUID
));

происходит некорректно и первый же товар, в независимости от его guid выбирается как подходящий. Вот пример отработавшего скрипта:

dfb3cc62-d709-11e1-86b8-4061865bb6fe - Товар не найден, добавлен
ccc8057a-d7b2-11e1-86b8-4061865bb6fe - Товар найден, обновлен
9a286cf8-daf0-11e1-86b8-4061865bb6fe - Товар найден, обновлен
f6378d08-dc85-11e1-86b8-4061865bb6fe - Товар найден, обновлен
06714e71-d7d5-11e2-885b-4061865bb6fe - Товар найден, обновлен

В итоге, независимо от количества позиций в xml, имею всего одну позицию в базе

Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
L1
На сайте с 21.09.2007
Offline
115
#1

Пробуйте очистить $g в конце foreach.

Возможно $g->save(); не очищает объект.

A
На сайте с 18.10.2007
Offline
125
#2
L3n1n:
Пробуйте очистить $g в конце foreach.
Возможно $g->save(); не очищает объект.

Я думал о таком варианте, не нашел информации как правильно.

unset($g);

в начале итерации не меняет ситуации

Насколько понимаю, проблема не в этом, потому что такой вариант условия ничего не меняет


if (!$modx->getObject('goods', array('guid' => $GoodGUID))) {
print $GoodGUID.' - Товар не найден, добавлен<hr />';
$g = $modx->newObject('goods', array(
'guid' => $GoodGUID,
'code' => $GoodCode,
'articul' => $GoodArticul,
'title' => $GoodTitle,
'price' => $GoodPrice,
'content' => '',
'alias' => '',
'amount' => $GoodAmount,
'published' => 1,
'hidemenu' => 0
));
} else {
print $GoodGUID.' - Товар найден, обновлен<hr />';
$g = $modx->getObject('goods', array(
'guid' => $GoodGUID
));
$g->fromArray(array(
'amount' => $GoodAmount
));
}
$g->save();
L1
На сайте с 21.09.2007
Offline
115
#3

unset в php частенько работает не корректно. Попробуйте $g=0;unset($g);

dell

A
На сайте с 18.10.2007
Offline
125
#4

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

L1
На сайте с 21.09.2007
Offline
115
#5

guid в базе случайно не integer?

siv1987
На сайте с 02.04.2009
Offline
427
#6

SHOW CREATE TABLE goods

Кроме того, значение guid не должно уже повторятся, в документации вроде сказано что метод возвращает объект только в случае если найдено только одна запись, не более и не меньше.

A
На сайте с 18.10.2007
Offline
125
#7

L3n1n, varchar.

Замена

$GoodGUID = $Good->GUID;
на
$GoodGUID = (string) $Good->GUID;
решила проблему.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий