Php 致命错误:对非对象调用成员函数fetch_assoc()-

Php 致命错误:对非对象调用成员函数fetch_assoc()-,php,joomla,mysqli,Php,Joomla,Mysqli,我正在尝试执行一个查询,但一直收到一个错误致命错误:对非对象调用成员函数fetch_assoc。我在论坛上搜索过答案,但我对php非常陌生,我发现的很多东西对我来说都是非常先进的。我正在与Joomla一起工作,与数据库的连接正在工作,我可以成功地写入我正在使用的表,但如果不出现此错误,则无法从中选择信息 <?php $message = ''; $db = JFac

我正在尝试执行一个查询,但一直收到一个错误致命错误:对非对象调用成员函数fetch_assoc。我在论坛上搜索过答案,但我对php非常陌生,我发现的很多东西对我来说都是非常先进的。我正在与Joomla一起工作,与数据库的连接正在工作,我可以成功地写入我正在使用的表,但如果不出现此错误,则无法从中选择信息

<?php                       
                    $message = '';
                    $db = JFactory::getDBO();
                    if($db->connect_error)
                    {
                        //if error assign to message
                        $message = $db->connect_error;
                    }
                    else
                    {
                        $sql = 'SELECT * FROM jos_offer';
                        $result = $db->query($sql);
                        if($db->error)
                        {
                            $message = $db->error;
                        }
                        else
                        {
                            while($row = $result->fetch_assoc())
                            {
                                echo '<div>'.$row['student_id'].$row['offer'].'</div>'; 
                            }
                        }
                    }
                ?>  
而$row=$result->fetch\u assoc

应该是:

while($row = $db->loadResultArray($result))
$result不是您认为的对象。这是一个MySQLi_resultset_资源,除了将其传递给fetch_assoc之外,您无法使用它

除非您有Joomla数据库包装器的文档,否则我建议不要使用它。本机PHP包装即使不是更好,至少也一样好


查看MySQLi包装器:

如果您在Joomla,您应该利用API使代码更干净、更简单

$db = JFactory::getDBO();
$query = $db->getQuery(true)
      ->select('*')->from($db->quoteName('#__offer'));
$db->setQuery($query);
$results = $db->loadObjectList();
//$results = $db->loadAssocList(); // If you really want that, not sure why you would.
 if ($db->getErrorNum())
{
 echo JText::sprintf('JLIB_DATABASE_ERROR_FUNCTION_FAILED', 
            $db->getErrorNum(), $db->getErrorMsg()) . '<br />';

   return;
}

if (!empty($results))
(      
  foreach ($results as $result)
  {
     echo '<div>'.$result->student_id. ' ' ,  $result->offer . '</div>'; 
    // Or switch to the associative array version
    // echo '<div>'.$result['student_id']. ' ' . $result['offer'] . '</div>'; 
  }
}

谢谢你的帮助,我用它工作了

$db->setQuery($query);
if( $rows = $db->loadObjectList() )

什么不,你从结果中提取。查询为您提供一个resultset资源。假设这是mysqli.Nope。这就是旧的数据库包装函数的工作方式,因为DB对象似乎拥有所有名为load的获取函数。显然,我仍然认为我是正确的。我认为loadResultArray是最类似于fetch_assoc的函数?@FritsvanCampen:你似乎很困惑。Mysqli不是旧的API,而且它大部分都有对象。这些都不能解释为什么您认为从DB资源而不是从查询操作获取的resultset资源获取行是可能的,甚至是有意义的。你认为$db->fetch\u assoc可能意味着什么,除非你使用的API严重损坏?@Frits:Yep,你是对的:在mysqli\u查询中是不同的。OO变量mysqli->query是面向对象的。但是,这些函数是同一个库的一部分,在这两种情况下,行都来自resultset here$result,而不是原始DB connection资源here$DB。这就是我的意思。尽管如此,我也不知道JFactory,因此我没有发布答案!。。。此查询:在phpMyAdmin或其他任何程序中运行时,选择*FROM jos_offer是否有效?是的,此查询在phpMyAdmin中有效此处信息不足。请出示一份表格。您是使用1.5还是当前代码库2.5/3?这是在CMS中还是在一个独立的应用程序中?为什么不使用Joomla api呢?还应始终使用_;而不是硬编码前缀。Joomla还有很多内置的错误处理功能,你不需要担心连接问题,除非你连接的数据库不是你的cms数据库,如果连接失效,你会在这一点之前知道方法。。