我正在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]**
最佳答案
我认为这可能是使用$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();
尽管我不确定从query返回的结果和loadRow返回的结果之间会有什么区别。这将是值得试验和看看,如果这是可行的。
另外,如果您只使用
getNumRows
查看是否存在记录,则可以对您的$replyAG
变量进行某种检查。如果没有结果,那么看看loadRow返回什么可能同样值得尝试。