inserimento in tabella db non funziona

5 contenuti / 0 new
Ultimo contenuto
inserimento in tabella db non funziona

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...

natan wrote:
purtroppo non è un errore di funzione. la funzione è chiamata in maniera giusta(la chiamo nello stesso modo nello stesso modulo altre volte e funziona).

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?
natan wrote:
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.

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...
natan wrote:
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

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 in term_node e poi lo ricostruisce. E non usa drupal_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:

<?php
 
// la query può solo tornare un valore o FALSE
$res = db_result(db_query('SELECT max(nid) FROM {node}'));
$nid = $res ? 0 : $res + 1;
// la seguente solo se siamo securi che non esiste già...
db_query('INSERT INTO {term_node} (nid, vid, tid) VALUES (%d, %d, %d)', $nid, $nid, $maxTid);
?>

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 :)

<?php
function node_set_name($name,$type){
/*    global $nid;
    global $maxTid;
    */
   
$newName = $type."_name";
   
$nid;
   
$vid;$maxTid;
   
$query="SELECT t.vid as voc,t.name as title, v.name FROM term_data t join vocabulary v on t.vid=v.vid where t.name = '$name' and v.name = '$newName'";
   
$queryResult = db_query($query);
    if(
db_fetch_object($queryResult) == NULL){
       
$query="select max(tid) as max from term_data";
       
$queryResult = db_query($query);
        while(
$res = db_fetch_object($queryResult)){
           
$maxTid=$res->max;
        }
       
$maxTid+=1;
       
$query = "SELECT vid FROM vocabulary where name = '$newName'";
       
$queryResult = db_query($query);
        while(
$res = db_fetch_object($queryResult)){//vid del type
           
$vid=$res->vid;
        }
       
//aggiungo il nome all'elenco dei termini del vocabolario
       
$query = "SELECT * FROM node where title = '$name' and type ='$type'";
       
//$query = "SELECT max(nid) as nid FROM node";
       
$queryResult = db_query($query);
        while (
$res = db_fetch_object($queryResult)){//nid del type
           
$nid = $res->nid;
        }
       
$nid++;
       
$data = array(
           
'parent' => 0,
           
'tid' => $maxTid,
            );
       
$bool=drupal_write_record('term_hierarchy', $data);       
       
$data = array(
           
'name' => $name,
           
'vid' => $vid,
           
'tid' => $maxTid,
           
'description' => '',
            );
       
drupal_write_record('term_data', $data);
       
$data = array(
           
'nid' => $nid,
           
'vid' => $nid,
           
'tid' => $maxTid,
            );
       
$bool=drupal_write_record('term_node', $data);
        if(
$bool == false)
            echo
"errore stronzo";
            }
}
 
?>