2

我正在 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]**
4

3 回答 3

5

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

例如,您可以尝试:

$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 返回的内容可能是值得的。

于 2012-10-05T09:57:32.443 回答
0

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

$query = $db->getQuery(true);
于 2012-10-05T09:58:21.557 回答
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();
于 2015-08-19T09:41:15.730 回答