Php 在Joomla中的表之间移动行

Php 在Joomla中的表之间移动行,php,mysql,joomla,joomla3.0,Php,Mysql,Joomla,Joomla3.0,我一直在尝试创建一个PHP脚本,该脚本将定期将“完成的”行从Joomla站点上的表移动到另一个表。我编写的查询在PHPMyAdmin中运行良好: 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%

我一直在尝试创建一个PHP脚本,该脚本将定期将“完成的”行从Joomla站点上的表移动到另一个表。我编写的查询在PHPMyAdmin中运行良好:

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代码,并将这些代码粘贴到下面。它返回一个“意外的T_字符串”错误,该错误指向下面的一行,该行开始
->insert into
,现在我意识到脚本无法工作,因为“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内部完成这项工作吗?我更喜欢(正如您可能已经注意到的)在一个事务中完成它,这样,如果出现错误,我就不会手忙脚乱。

您可以尝试用普通的旧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);

$db->setQuery允许将查询字符串作为参数而不是对象传递。请参阅“准备查询”:

我还建议将其中两个查询作为同一事务的一部分运行

不幸的是,我手头没有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);
}

你不能在那里有空间。我不知道你为什么不直接使用
insert
。但是,如果确实需要,可以将
insert作为查询字符串的一部分输入到
,而不是使用查询构造函数。整个过程无论如何都不会起作用,因为您不能以这种方式混合使用
insert
delete
。您有没有理由不能在表中使用某种状态/工作流状态字段来表示“已完成”状态?随后的查询/视图等可以基于此进行过滤,而无需查询多个表。@Elin-yesp;我肯定知道我不能在那里使用空间;这就是我所说的“'insert-into'不是有效的方法名!”不过,查询字符串可能是一种方法;谢谢你的建议。不过,我不确定我是否理解你所说的不混合
insert
delete
的意思;我上面粘贴的SQL查询工作正常,我只需要能够从PHP/Joomla内部触发它。“你能详细说明一下吗?”杰克斯金纳说,老实说,那会更好;问题是,出于某种原因,每当表超过2000行时,我的所有脚本都会中断(我从Joomla那里得到了某种超时错误)。我怀疑主机托管的局限性(我正在为这个网站使用免费主机,这在某些方面是有限的),但如果你有任何具体的见解,可能会导致它,我很有兴趣听到!你能确认主机的限制是多少吗?如果它的2k行特别有限-寻找一个新的主机(根据我的经验,您将面临进一步的问题)。如果是连接超时,那么表上的索引应该会有帮助(虽然在2k行时,它实际上不会有多大帮助)。