【问题标题】:php notices of Undefined Variable & Trying to get property of non-object未定义变量的 php 通知 & 试图获取非对象的属性
【发布时间】:2013-08-24 12:25:16
【问题描述】:

我正在通过 Joomla 项目学习和执行 php 如何改进此代码并解决 PHP 通知 - 任何建议 - 解决方案 - 非常感谢!!

注意:未定义变量:cond in*/home/mygames/public_html/components/com_toys/models/category.php 第 140 行 (这是 $sql 行)*

   function loadSubCat($id,$Carmodel,$minprice,$maxprice){
   $mainframe =& JFactory::getApplication();
   $option = JRequest::getCmd('option');
   $database =& JFactory::getDBO();
   global $Itemid;  
   if($Carmodel!="")
   $cond=" and prod_id='$Carmodel' ";
   $sql = "Select * from #__toycar_products Where prod_cat_id='".$id."' $cond and prod_status='1' and prod_id in (select v_prod_id from #__toycar_variants)  Order By prod_sorder";

注意:试图在/home/truecar7/public_html/components/com_toys/models/category.php第200行获取非对象的属性

第 200 行是 return $row->id;

   function getItemIdByName($Name){
   $mainframe =& JFactory::getApplication();
   $option = JRequest::getCmd('option');
   $database =& JFactory::getDBO();
   $sql = "Select id  from #__menu Where name = '".$Name."'";
   $database->setQuery($sql);
   $row = $database->loadObject();
   return $row->id;
}

编辑

你好 Lodder & Elin,它可以工作,但就像这样,否则它会在 return $row 行上显示未定义的变量通知。

function getItemIdByName($Name){
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('*')
 ->from('#__menu')      
 ->where('id = ' . $db->quote($Name));      
$db->setQuery($query);
$rows = $db->loadObjectList();

foreach ($rows as $row){
    $row = $row->msg;
     }    
$row='';
return $row;
}

【问题讨论】:

  • 不要在表名中使用#等特殊字符,以免出现此类问题#__menu
  • @VahidHallaji - 这就是 Joomla 数据库表的设计方式。这是一个前缀
  • 鉴于您已将 $row 的返回值硬编码为空字符串,我真的不明白您在做什么。如果您只想为一行返回一个字符串,则不应执行 $db->loadObjectList() ,它会为您提供一组对象。而是加载你想要的结果.. 不要选择 '*' 选择 'msg' 并返回 $db->loadResult() docs.joomla.org/JDatabase/loadResult
  • 感谢艾琳,工作真棒!

标签: php joomla joomla2.5


【解决方案1】:

尝试使用以下内容。我对您的函数进行了一些更改,并使用 Joomla 2.5 编码标准进行数据库查询。

$Name = "XXXXXXXXX";  //define the name variable

function getItemIdByName($Name){
    $db = JFactory::getDBO();
    $query = $db->getQuery(true);
    $query->select('*')
     ->from('#__menu')      
     ->where('id = ' . $db->quote($Name));      
    $db->setQuery($query);
    $rows = $db->loadObjectList();

    foreach ($rows as $row){
        $row = $row->msg;
    }
    return $row;
}

echo getItemIdByName($Name); //echo the result of the function

【讨论】:

  • 谢谢,但是执行页面后显示错误 - 注意:未定义变量:数据库在线致命错误:在非对象在线调用成员函数 loadObjectList()
  • 啊抱歉。将$database->loadObjectList(); 更改为$db->loadObjectList();
  • 是的,但是 - 它现在显示新的通知 - 警告:在线为 foreach() 提供的参数无效注意:未定义的变量:在线行
  • 您需要使用 $db->quote($Name) 而不是 $Name (假设您要匹配字符串)。您是要返回列表还是一行?您应该确保使用适当的返回类型。
  • @RuchikaModi - 请查看我的更新答案。我已经测试了代码并且它可以工作。正如 Elin 所指出的,我还使用了 $db->quote($Name)
【解决方案2】:

对于您的Undefined Notice,您必须像这样修改您的代码

$cond = '';
if($Carmodel!="") {
   $cond = " and prod_id='$Carmodel' ";
}

对于Trying to get property of non-object 注意:我认为$row 是空的,这就是抛出通知的原因。检查$row

var_dump($row);

问题:

$database->loadObject(); // This line

【讨论】:

  • 谢谢。但是,在实施之后,它现在显示通知:未定义变量:在线条件。另外,对于第二部分,我应该删除 $database->loadobject() 的行。请建议
  • 您好,我想我犯了一个错误,因为您对未定义变量的解决方案非常有效。谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多