如何在第二次查询后在Joomla中使用getNumRows()

时间:2012-10-05 08:34:06

标签: mysql joomla2.5

我正在Joomla环境中开发一个php脚本,它会查询同一个表/数据库两次。每当我需要知道是否找到任何匹配时。

似乎最好的方法是使用getNumRows()。 Joomla文档对其使用非常具体:

  

其他结果集方法getNumRows()

     

getNumRows()将返回最后一个找到的结果行数   查询并等待阅读。要从getNumRows()获得结果   必须在查询之后和检索之前运行它   结果

我在我的剧本中遵循这一点。在第一个查询没有问题,但第二个查询总是抛出一个警告 - 很可能是因为第二次调用getNumRows()是在第一次查询检索结果之后 - 这不符合Joomla要求。

任何想法如何解决?非常感谢!

我的剧本部分内容为:

$db = JFactory::getDBO();
$query = "SELECT * FROM #__art_mobiles WHERE user_agent_header='$ua'";
$db->setQuery($query);
$rowsAG = $db->getNumRows();
$replyAG = $db->loadRow();

if ($rowsAG == 0) {

//if no match check www.handsetdetection.com
//see https://www.handsetdetection.com/properties/vendormodel for current list of models in database together with headers
echo "not in local database - try external<br/>";  
$prod = '';

if ($hd3->siteDetect()) {

    $replyHD = $hd3->getReply();

    $man = $replyHD['hd_specs']['general_vendor'];
    $dev = $replyHD['hd_specs']['general_model'];
    $os = $replyHD['hd_specs']['general_platform'];
    echo "found in handsetdetection.com database<br/>";

    //check for provisional match in local database
    $query = "SELECT * FROM #__art_mobiles WHERE manufacturer='$man' AND device='$dev'";
    $db->setQuery($query);
    $rowsAGprov = $db->getNumRows();
    $replyAGprov = $db->loadRow();

    if ($rowsAGprov == 0) { **[ETC]**

3 个答案:

答案 0 :(得分:4)

我认为这可能是使用$db->loadRow();的问题,因为getNumRows依赖于已执行的查询。

例如,您可以尝试:

$db = JFactory::getDBO();
$query = "SELECT * FROM #__art_mobiles WHERE user_agent_header='$ua'";
$db->setQuery($query);
$replyAG = $db->query();
$rowsAG = $db->getNumRows();

$query = "SELECT * FROM #__art_mobiles WHERE manufacturer='$man' AND device='$dev'";
$db->setQuery($query);
$replyAGprov = $db->query();
$rowsAGprov = $db->getNumRows();

虽然我不确定查询和loadRow返回的结果之间是否存在差异。值得尝试并看看它是否有效。

或者,如果您仅使用getNumRows查看是否存在记录,则可以对$replyAG变量进行某种检查。如果没有结果,再次看看loadRow返回的内容可能值得尝试。

答案 1 :(得分:0)

在编写查询之前,需要添加以下代码:

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

答案 2 :(得分:0)

您需要使用

$db = JFactory::getDbo();
$query = $db->getQuery(true)
            ->select($db->qn(array('id')))
            ->from($db->qn('#__social_notifications'))
            ->where($db->qn('status') . ' = ' . $db->q(0));
$db->setQuery($query);
$db->execute();
$resultData = $db->getNumRows();