2016-01-02 14 views
7

Ho cercato di creare uno script PHP che sposta periodicamente le righe "completate" da una tabella sul mio sito Joomla su una tabella diversa. La query ho scritto funziona bene in phpMyAdmin:Spostamento di righe tra tabelle in Joomla

INSERT INTO my_calsgovdocs.sent_copy 
SELECT * FROM my_calsgovdocs.entered_copy 
WHERE `Status` LIKE '%Sent%'; 
DELETE FROM my_calsgovdocs.entered_copy 
WHERE `Status` LIKE '%Sent%'; 

ho cercato di tradurlo in un po 'di codice PHP che potrebbe funzionare all'interno di Joomla, e ho incollato quel codice qui sotto. Viene restituito un errore "T_STRING inatteso" che punta alla riga sottostante che inizia ->insert into e ora mi è venuto in mente che lo script non avrebbe funzionato perché "insert into" non è un nome di metodo valido! Finora non riesco a trovare un metodo equivalente da utilizzare all'interno di Joomla. Questo è stato il mio tentativo al codice:

try 
{ 
    $db->transactionStart(); 

    $query = $db->getQuery(true); 

    $query 
     ->insert into($db->quoteName('sent_copy')) 
     ->select('*') 
     ->from($db->quoteName('entered_copy')) 
     ->where($db->quoteName('Status') . ' LIKE ' . $db->quote('%Sent%') . ';') 
     ->delete from($db->quoteName('entered_copy')) 
     ->where($db->quoteName('Status') . ' LIKE ' . $db->quote('%Sent%')); 

    $db->setQuery($query); 
    $result = $db->execute(); 

    $db->transactionCommit(); 
} 
catch (Exception $e) 
{ 
    $db->transactionRollback(); 
    JErrorPage::render($e); 
} 

Qualcuno ha un'idea di come posso realizzare questo all'interno di Joomla? Preferirei (come avrai notato sopra) farlo in una transazione in modo che, se c'è un errore, non avrò un disastro nelle mie mani.

+0

Non si può avere uno spazio lì dentro. Non sono sicuro del motivo per cui non stai usando solo "insert". Tuttavia, se lo desideri, puoi semplicemente inserire 'insert into' come parte di una stringa di query piuttosto che utilizzare il costruttore di query. Il tutto non funzionerà comunque perché non è possibile mescolare 'insert' e' delete' in questo modo. – Elin

+0

C'è qualche ragione per cui non è possibile utilizzare un qualche tipo di stato/campo dello stato del flusso di lavoro all'interno della tabella per indicare lo stato 'completato'? Le query/viste successive possono quindi filtrare in base a questo anziché richiedere più tabelle. – developerjack

+0

@Elin Sì; Sono assolutamente consapevole che non posso usare uno spazio lì; questo è ciò che intendevo con "'insert into' non è un nome di metodo valido!" La stringa di query potrebbe essere la strada da percorrere, però; grazie per il suggerimento Non sono sicuro di capire cosa intendi per non mischiare 'insert' e' delete', però; la query SQL che ho incollato sopra ha funzionato adeguatamente, ho solo dovuto essere in grado di attivarlo da PHP/Joomla. Potresti approfondire? – ruinlach

risposta

0

Si potrebbe provare a farlo in plain old php? Qualcosa come

$conf = JFactory::getConfig(); // load your config 
try{ 
    $link = mysqli_connect($conf->get('host'), $conf->get('user'), 
    $conf->get('password'), $conf->get('db')); 
    mysqli_begin_transaction($link, MYSQLI_TRANS_START_READ_WRITE); 
    mysqli_query($link, "INSERT INTO my_calsgovdocs.sent_copy 
    SELECT * FROM my_calsgovdocs.entered_copy 
    WHERE `Status` LIKE '%Sent%'"); 
    mysqli_query($link, "DELETE FROM my_calsgovdocs.entered_copy 
    WHERE `Status` LIKE '%Sent%'"); 
    mysqli_commit($link); 
} 
catch (Exception $e) 
{ 
    mysqli_rollback($link); 
    JErrorPage::render($e); 
} 
mysqli_close($link); 
0

$ db-> setQuery consente di passare una stringa di query come argomento anziché come oggetto. Vedere "preparazione della query": https://docs.joomla.org/J1.5:Accessing_the_database_using_JDatabase

Ho anche suggerito di eseguire due di queste query come parte della stessa transazione.

Io sfortunatamente non ho un'installazione di joomla a portata di mano per testarlo, per favore commentate se trovate che non funziona.

try 
{ 
    $db->transactionStart(); 

    $query = $db->getQuery(true); 

    $query1 = "INSERT INTO my_calsgovdocs.sent_copy 
    SELECT * FROM my_calsgovdocs.entered_copy 
    WHERE `Status` LIKE '%Sent%'"; 

    $db->setQuery($query1); 
    $result1 = $db->execute(); 

    $query2 = "DELETE FROM my_calsgovdocs.entered_copy 
    WHERE `Status` LIKE '%Sent%'"; 

    $db->setQuery($query2); 
    $result2 = $db->execute(); 

    $db->transactionCommit(); 
} 
catch (Exception $e) 
{ 
    $db->transactionRollback(); 
    JErrorPage::render($e); 
} 
+0

Quando si dà una risposta è preferibile dare [qualche spiegazione su PERCHÉ la risposta] (http://stackoverflow.com/help/how-to-answer) è quella giusta. –

Problemi correlati