# W każdy czwartek o 22:00 #
Spotkania ludności drupal.pl na IRC- odpal czat -
- dedykowany temat na forum -

drupal.pl w sieci Google!

Shoutbox

You're not permitted to post shouts.
DepecheMati

Widać, że pracownikom Google się nudzi - http://bit.ly/L6pAsn :-}

1 dzień 9 godzin ago
grzegorz.bartman

Wybiera się ktoś na DrupalCon do Monachium?

2 dni 10 godzin ago
malcolm

No, wspomnień czar ;)

6 dni 8 godzin ago
spamator12

@Mati thx :P
@malcolm gdzieś o tym słyszałem i to z tego forum nie pamiętam... Gra się w to jak w stare setlersy ?

6 dni 9 godzin ago

Przy probie użycia hook_insert wywala błąd: "Unknown column 'vid'"

12 odpowiedzi [Ostatni wpis]
bbruda
Portret użytkownika bbruda
Offline
Warszawa
Dołączył: 04.03.2010
Postów:
  • Drupal 6

Przyznam, że skończyły mi się pomysły...

Próbuje mojego sparsowanego xml-a dodać bezposrednio do drupala, mam wcześniej utowrzony typ zawartosci.
Przy probie użycia hook_insert wywala mi dziwny bład:

kawałek mojego kodu:

function mycontenttype_insert($node) {

petla po xml
   
db_query("INSERT INTO {mycontenttype} (vid, nid, name) VALUES ('%d', '%d', '$name')",
$node->vid, $node->nid, $node->name);

komunikat błedu:
user warning: Unknown column 'vid' in 'field list' query: INSERT INTO mycontenttype

no więc nie wiem jakim cudem mam unknown column vid, skoro to kolumna utorzona przez drupala?

być może drupal_write_record byłby tutaj lepszy ale musiałabym chyba najpierw skorzystać z hook_schema, nie bardzo mam teraz na to czas, do hook_schema zajrze przy okazji pisania hook_install ;)

wodzik
Portret użytkownika wodzik
Offline
Człuchów
Dołączył: 18.03.2009
Postów:

Daj więcej kodu, bo samo query wygląda ok. Próbowałaś może debugować?

bbruda
Portret użytkownika bbruda
Offline
Warszawa
Dołączył: 04.03.2010
Postów:

w sumie nie probowałam debugować, zaraz pogrzebie po netbeansie i zobaczymy co wyjdzie (w sumie jeszcze tego nie robiłam) ;) poniżej kod

<?php
                   
//insert into databse hotel
function hotels_insert($node) {
   
   
//simplexml load xml file
$link = variable_get('bluevendo_path',0);
$hotels = simplexml_load_file($link.'/hotelfulllist.xml') or die("Error: Cannot create object");

//db_query("DELETE FROM hotels") or die(db_error());

foreach ($hotels->hotel as $hotel) {
               
$hotel_atrybuty = $hotel->attributes();
               
$hotel_id = $hotel_atrybuty['id'];
                               
$hotel_tomid = $hotel_atrybuty['tomid'];
               
$hotel_name = $hotel->params->name;
                               
$hotel_city = $hotel->params->city;
                               
$hotel_cityid = $hotel->params->city[id];
               
$hotel_region = $hotel->params->region;
                               
$hotel_regionid = $hotel->params->region[id];
                   
$hotel_country = $hotel->params->country;
                               
$hotel_countryid = $hotel->params->country[id];
               
$hotel_standard = $hotel->params->standard;
               
$hotel_season = $hotel->params->seasontypename;
                               
$hotel_seasonid = $hotel->params->seasontypeid;
                               
$hotel_categoryname = $hotel->params->categoryname;
                               
$hotel_minage = $hotel->params->minage;
               
$hotel_types = $hotel->params->types;
                               
$hotel_label = $hotel->descriptions->description->label;
                               
$hotel_body = $hotel->descriptions->description->body;
               
$hotel_image = $hotel->images->image;
                               
$hotel_clasifications = $hotel->clasifications;
                               
$hotel_latitude = $hotel->geolocation->latitude;
                               
$hotel_longitude = $hotel->geolocation->longitude;
   
db_query("INSERT INTO {hotels} ( vid, nid, hotelid,tomid,name,city,cityid,region,regionid,country,countryid,standard,season,seasonid,categoryname,minage,types,label,body,image,clasifications,latitude,longitude) VALUES ('%d', '%d', '$hotel_id','$hotel_tomid','$hotel_name','$hotel_city','$hotel_cityid','$hotel_region','$hotel_regionid','$hotel_country','$hotel_countryid','$hotel_standard','$hotel_season','$hotel_seasonid','$hotel_categoryname','$hotel_minage','$hotel_types','$hotel_label','$hotel_body','$hotel_image','$hotel_clasifications','$hotel_latitude','$hotel_longitude')",
$node->vid, $node->nid, $node->hotelid,$node->tomid,$node->name,$node->city,$node->cityid,$node->region,$node->regionid,$node->country,$node->countryid,$node->standard,$node->season,$node->seasonid,$node->categoryname,$node->minage,$node->types,$node->label,$node->body,$node->image,$node->clasifications,$node->latitude,$node->longitude);

                               
                               
}
}

drupal_set_message('Hoteletest zostały dodane do bazy danych.');
?>

to cały pliczek inc odpalany z menu modułu w petlach brakuje jeszcze paru rzeczy ale to poźniej dopisze, prosta petla chociaz duzo obiektów

wodzik
Portret użytkownika wodzik
Offline
Człuchów
Dołączył: 18.03.2009
Postów:

a daj jeszcze wynik DESCRIBE hotels; z mysqla. Nie ma na tekj kolumnie jakiegoś autoincrementa, czy literówki w nazwie?

bbruda
Portret użytkownika bbruda
Offline
Warszawa
Dołączył: 04.03.2010
Postów:

przez chwile nie wiedziałam o co ci chodzi ;)
tylko describe hotels owszem zwróci mi ale inna tabele, a hook_insert odwołuje sie do typu zawartości content_type_hotels {hotels} bo w tabeli hotels (taką też mam była mi potrzebna do testów pętli faktycznie nie ma pola vid, nid

dobra, chyba mam coś źle zdefiniowane, skoro hook_insert chce wrzucać dane do innej tabeli, moze to przez brak hook_node_info() tam chyba powinna być definicja base...

Michlis
Portret użytkownika Michlis
Offline
Dołączył: 05.10.2010
Postów:

Mam kilka uwag/pomysłów:

1. Wszystkie segmenty są trzymane w tabeli 'node', Drupal nie tworzy oddzielnej tabeli dla każdego rodzaju zawartości. To może być bezpośrednia przyczyna błędu.

db_query("INSERT INTO {hotels} ( vid, nid,

2. Lepiej jest dodawać nowe segmenty korzystając z API a nie bezpośrednio wstawiając nowy rekord do bazy, bo wtedy nie odpalają się standardowe hook'i, validacja itd.
Przyjżyj się node_submit i node_save.

3. Nie bardzo rozumiem, czemu wybrałaś hook_insert(). Wygląda na to, że aktualizujesz jakieś hotele na podstawie zewnętrznego pliku XML, tylko co ma do tego hook_insert?
Ten hook jest odpalany w momencie wstawiania nowego node'a do bazy (albo tuż po ;). Zauważ, że nie korzystasz wcale z parametru $node (poza insertem).

4. Skoro już doszliśmy do inserta, w pętli chcesz wstawić kilka hoteli, ale $node się nie zmienia, więc SQL wywali pewnie błąd, bo $node->nid musi być unikalny.

Nie lepiej podpiąć ten kod pod CRONa albo dodać gdzieś link w menu?

bbruda
Portret użytkownika bbruda
Offline
Warszawa
Dołączył: 04.03.2010
Postów:

Michlis, zaczen od końca;)
4. tak będzie to podpiete pod crona jak zadziała, link w menu też mam wywołujacy reczne dodanie, wiec user sam zdecyduje czy hotele sie dodadzą/updetuja przez crona czy recznie.

3. ucze sie, wybrałam insert bo sadziłam ze z mojej petli powstawiam sobie własnie nody do bazy, ale chyba walnełam sie na nazewnictwie :/
node=roadzaj zawartosci
segment=pojedynczy obiekt noda ?

2. ok popatrze na node_submit i node_save
czytałam troche o drupal_write_record() ale nie chciało mi sie odpalać do tego schema :/
lenistwo chyba nie popłaca

1. wiesz nie do końca cię rozumiem, skoro po utowrzeniu nowego typu zawartosci np hotels, utowrzyła mi sie tabela z czescią pól dla hotelu "content_type_hotels" to jakoś nie moge sie zgodzic z tym co napisałes ;)

ucze sie ciagle wiec nie wszystko jest dla mnie jasne i logiczne, szukam sposobu aby mojego sparsowanego xmla, z petli wrzucic od razu do bazy danych ale drupal info o jednym "obiekcie" trzyma w kilku tabelach, dlatego probuje to ogarnac
tabela node, tabela typu zawartosci, i jeszcze tabele to pól (gdzie mamy mozliwosc wieloktotnego dodania wartosci)

Michlis
Portret użytkownika Michlis
Offline
Dołączył: 05.10.2010
Postów:

Ad. 1)
Hmm, sprawdziłem na prawie czystej instalce D7 i po stworzeniu nowego rodzaju zawartości nie tworzy się tabel 'content_type_...', więc może tworzy ją jakiś inny moduł na swoje potrzeby?
Dalej będę się upierał, że wszystkich node'y siedzą w tabeli 'node' tzn. ich definicja. W D6 treść (body) jest w 'node_revision'. W D7 sporo się pozmieniało po dodaniu tabel 'field_...'.

Jedna rzecz mnie jeszcze zastanawia. Twój kod wygląda tak jakbyś miała pustą bazę i wrzucała wszystko jak leci z pliku XML. Nie sprawdzasz nigdzie czy hotel już istnieje, tak jakby aktualizacja nie wchodziła w grę, tylko dodajesz nowe dane. Na pewno tak ma być?

bbruda
Portret użytkownika bbruda
Offline
Warszawa
Dołączył: 04.03.2010
Postów:

Michlis, na tym etapie sprawdzanie czy coś jest w bazie to byłoby strzał w stope, co mam srpawdzac skoro nic nie chce mi sie dodac?

Mowa tutaj o Drupal 6, być moze D7 robi w bazie inne tabele, ja na razie musze cos dopisac do D6.

Tak docelowo, ma być sprawdzanie czy dane id wystepuje, potem update, jak nie wystepuje to insert.
Ale na razie utknełam na dodaniu czegos, jak widzisz dany typ zawartosci ma sporo pól, nie chce mis ie tego przepisywac do D7 bo wcale nie jestem pewna ze lepiej mi pojdzie na D7.

Jakieś pomysły, wskazówki?

Michlis
Portret użytkownika Michlis
Offline
Dołączył: 05.10.2010
Postów:

Zacznij od dodawania do bazy korzystając z API a nie bespośrednio z poziomu SQLa. Mam tu na myśli node_submit() i node_save(). Tutaj masz przykładowe tutoriale:
Migrating the Drupal way. Part I: creating a node....
Drupal 6 - Inserting & Updating Nodes Programmatically

bbruda
Portret użytkownika bbruda
Offline
Warszawa
Dołączył: 04.03.2010
Postów:

ok dzieki, przejże te linki, w miedzyczasie oglądam sobie jak wygląda i działa node_example i nodeapi_example

edit: zrobiłam test na szybko i działa ;)
to ide się grzebać w pisaniu jakie dane do którego pola mają wpaść...