2016-01-02 20 views
7

Joomlaサイトのテーブルから「完了」行を定期的に別のテーブルに移動するPHPスクリプトを作成しようとしています。私はPHPMyAdminのにちょうど良い作品を書いクエリ: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%'; 

私はJoomlaの内部で実行することができ、いくつかのPHPコードに翻訳しようとしましたが、私は以下のそのコードを貼り付けました。それは->insert intoを開始する下の行を指す "予期しないT_STRING"エラーを返します。そして、 "insert into"が有効なメソッド名ではないため、スクリプトが機能しないことが私に発生しました。これまで私はJoomla内で使用される同等のメソッドを見つけることができません。これは私のコードでの試みでした:

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); 
} 

私はこれをJoomla内でどのように達成できるのか考えていますか? 1つのトランザクションでそれを行うには(上記のように気づいたかもしれませんが)好きです。エラーがあれば、私は自分の手で混乱することはありません。

+0

ここにスペースを入れることはできません。とにかく 'insert'を使用しているだけではないのか分かりません。しかし、あなたが本当に望むのであれば、クエリコンストラクタを使うのではなく、クエリ文字列の一部として 'insert into'を入力することができます。あなたがその方法で 'insert'と' delete'を混ぜ合わせることができないので、すべてがとにかく動作しません。 – Elin

+0

「完了」状態を示すために、ある種のステータス/ワークフロー状態フィールドをテーブル内で使用できない理由はありますか?後続のクエリ/ビューなどは、複数のテーブルをクエリする必要がなく、これに基づいてフィルタリングできます。 – developerjack

+0

@Ele Yep;私はそこにスペースを使うことはできません。それは私が "'insert into'が有効なメソッド名ではないことを意味しています!"クエリ文字列は、しかし、行く方法かもしれません。提案に感謝します。私は、あなたが 'insert'と' delete'を混在させないということについて何を意味しているのか分かりません。私が上に貼り付けたSQLクエリは適切に働いていましたが、PHP/Joomlaの中からそれを起動する必要がありました。あなたはそれについて詳述できますか? – ruinlach

答えて

0

普通の古いPHPでやってみることができますか?何かのように

$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は、オブジェクトではなく引数としてクエリ文字列を渡すことができます。 「クエリの準備」を参照してください。https://docs.joomla.org/J1.5:Accessing_the_database_using_JDatabase

私は、同じトランザクションの一部としてこれらのクエリのうちの2つを実行することを提案しました。

私は残念なことに、これをテストするのに便利なjoomlaのインストールはありません。動作しない場合は、ご意見ください。

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

答えを出すときは、[あなたの答えが何であるかについての何らかの説明](http://stackoverflow.com/help/how-to-answer)があることが望ましいです。 –

関連する問題