ciao a tutti
mi trovo davanti ad un problema apparentemente stupido che però non riesco a risolvere: devo inserire una riga in una tabella del db(term_node).
non capisco perchè questo inserimento non dovrebbe funzionare. tra l'altro, non ricevo neanche un errore. secondo lui va tutto a buon fine, ma in realtà non va!help!
any idea del perchè?
$query = "SELECT max(nid) FROM node";
$queryResult = db_query($query);
while ($res = db_fetch_object($queryResult)){//nid del type
$nid = $res->nid;
}
$nid++;
$data = array(
'nid' => $nid,
'vid' => $nid,
'tid' => $maxTid,
);
$bool=drupal_write_record('term_node', $data);
if(!$bool)
echo "errore stronzo";
}
}
La funzione drupal_write_record http://api.drupal.org/api/function/drupal_write_record richiede un oggetto come secondo parametro, ma tu lo stai dando un array. Prova con:
$bool=drupal_write_record('term_node', (object)$data);
L'echo va benissimo, ma io avrei scritto "RTFM" ...
(Questo codice e suggerimento è stato offerto senza garanzie di funzionamento, ogni riferimento a persone o fatti realmente accaduti è puramente casuale, ecc, ecc)
Più imparo, più dubito.
purtroppo non è un errore di funzione. la funzione è chiamata in maniera giusta(la chiamo nello stesso modo nello stesso modulo altre volte e funziona).
E' proprio un problema di quella tabella del db che non capisco.non ha chiavi foreign key che mi leghino a valori di altre tabelle. i dati che ci metto sono tutti corretti(li metto anche nelle altre tab) ma non inserisce niente. rispetto i vincoli di chiave. inserisce solo nel caso che metta a 1 il valore di nid e vid, cosa che non ha alcun senso.
hai idea di dove potrei andare a vedere restrizioni sull'inserimento manuale in tabelle del db di drupal? o come, se possibile, si possa inserire forzatamente una row?
grazie
Allora approfondiamo...
No. Quella funzione vuole un oggetto (object). Solo perchè lui testa se è un array è lo converte in object:
// Convert to an object if needed.
if (is_array($object)) {
$object = (object) $object;
$array = TRUE;
}
else {
$array = FALSE;
}
non vuol dire che passare un array sia corretto. Se levano quel test in futuro?
In D6 nessuna tabella ha chiave foreign key, purtroppo. Prova:
SELECT * FROM KEY_COLUMN_USAGE K where TABLE_SCHEMA='sandbox' LIMIT 0,1000
e vedrai ('sandbox' è il nome della basedati nel mio caso).
Ma questo è un bene nel tuo caso - se no lo constraint non ti permetterebbe creare un riferimento ad un nid non esistente...
Io guarderei il modulo taxonomy se forse in te. Vedo nella funzione
taxonomy_node_save
(http://api.drupal.org/api/function/taxonomy_node_save) che cancella prima le righe per quel nid interm_node
e poi lo ricostruisce. E non usadrupal_write_record
per farlo.Il tuo codice mi dice che stai inserendo un nid, vid 'inventato' per un tid - ma non so dove viene quel tid.
Qualche ottimizzazione:
N.B. Inserire nid == 0 non è un buon idea, e nemmeno un nid che non esiste. Puoi non ho capito bene cosa stai cercando di fare...
Più imparo, più dubito.
ciao john
il codice completo della funzione è di seguito, cosi da dare una ragione a valori vacanti:
il mio obbiettivo è quello di impostare il valore di un campo della tassonomia (content_name) prendendolo dal titolo stesso della pagina del content.
quindi tramite delle interrogazioni al db vado a prendre in titolo del nodo, il suo nid, il vid del termine della tassonomia. poi creo il valore della tassonomia.
manca l'ultima parte, e cioè quella che associa il termine della tassonomia al nodo stesso. quando provo a scrivere in term_node, il valore del $nid viene automaticamente messo a 1, per quanto invece da stampe di debug risulti che $nid vale proprio quell' intero che a me serve.
guarderò il modulo tax, ottima idea :)