在非对象上调用函数

时间:2014-06-11 18:25:06

标签: php pdo

我收到错误: 消息:在GetPOI请求中未传递layerName参数。 致命错误:在非对象上调用成员函数prepare()

这是我创建PDO $ db

的地方
function connectDb() {
  try {
    $dbconn = 'mysql:host=' . DBHOST . ';dbname=' . DBDATA ; 
    $db = new PDO($dbconn , DBUSER , DBPASS );
    // set the error mode to exceptions
    $db->setAttribute(PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION);
     return $db;

      }//try
       catch(PDOException $e) {
    error_log('message:' . $e->getMessage());
  }// catch

}// connectDb

,这是发生错误的地方:

// $sql is returned as a PDO statement object. 
  $sql = $db->prepare( 'SELECT id,
               imageURL,
               title,
               description,
               footnote,
               lat,
               lon,
               (((acos(sin((:lat1 * pi() / 180)) * sin((lat * pi() / 180)) +
                      cos((:lat2 * pi() / 180)) * cos((lat * pi() / 180)) * 
                      cos((:long  - lon) * pi() / 180))
                      ) * 180 / pi()
               )* 60 * 1.1515 * 1.609344 * 1000
               ) as distance,
               iconID,
               objectID,
               transformID
              FROM POI
         WHERE POI.poiType = "geo"   
        HAVING distance < :radius
      ORDER BY distance ASC
         LIMIT 0, 50 ' );

我没有正确设置$ db吗?如果它有帮助,我也可以发布整个脚本。 感谢。

1 个答案:

答案 0 :(得分:1)

问题在于$db由于其范围而调用$db->prepare()时未定义。

最有可能在函数内部调用$db>prepare();如果是这样的话,你可以通过将$db作为参数传递给该函数来修复它,即

function doSomething(\PDO $db)
{
    $sql = $db->prepare('...');
}

$db = connectDb();
doSomething($db);

另一个潜在问题是connectDb()发生错误;你只记录错误,但函数仍然正常返回,因此在全局范围内仍然未定义$db