我一直在尝试创建一个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_STRING”错误,该错误指向下面开始->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中完成这个任务?我希望(正如你上面可能已经注意到的)在一次交易中做到这一点,这样,如果出现错误,我手上就不会有一团糟。
答案 0 :(得分: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);
答案 1 :(得分:0)
$ db-> setQuery允许将查询字符串作为参数而不是对象传递。请参阅"准备查询":https://docs.joomla.org/J1.5:Accessing_the_database_using_JDatabase
我还建议将其中两个查询作为同一事务的一部分运行。
我很遗憾没有使用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);
}