如何修复致命错误:在null中调用成员函数prepare()

时间:2016-10-11 10:41:25

标签: php pdo

致命错误:在第6行的C:\ xampp \ htdocs \ af \ functions \ indexdatasummary.php中调用null上的成员函数prepare()

dbconnect.php

global $dbh;

//Server Variables========-------------->

$af_host="localhost";                                               
$af_root="root";                                                      
$af_password=""; 

//Database Variables========------------>

$af_cbms_database="af_cbms";

    try  
        {  
            $dbh = new PDO("mysql:host=$af_host", $af_root, $af_password); 
            $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 
            $af_cbms_database = "`" . str_replace("`", "``", $af_cbms_database) . "`";
            $dbh->query("CREATE DATABASE IF NOT EXISTS $af_database"); 
                    $dbh->query("SET CHARACTER SET utf8"); 
                    $dbh->query("USE $af_database"); 
                    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
         }  
    catch(PDOException $e)  
        {  
            echo $e->getMessage();  
        } 

我使用的上述代码几乎适用于所有页面,但在此页面中出现错误。我调用它的方式与另一个文件的方式相同,这是唯一返回错误的页面。

indexsummary.php

global $dbh;

require_once '../functions/dbconnect.php';


$stmt = $dbh->prepare("SELECT * FROM `city_tbl`");
$stmt->execute();

很快......

您认为导致此错误的是什么?任何帮助!

2 个答案:

答案 0 :(得分:1)

1)创建连接和创建数据库时出现问题。

Cuz你定义:

$af_cbms_database="af_cbms";

然后你打电话:

$dbh->query("CREATE DATABASE IF NOT EXISTS $af_database"); 

所以你的代码在哪里定义了$af_database变量?


2)这样做太不专业了(看起来你是编程的新手):

$af_cbms_database = "`" . str_replace("`", "``", $af_cbms_database) . "`";

你已经定义了你的变量,然后替换它,很有趣,就像你不相信自己那个你定义变量? (:

或者你不能这样做? :

$dbh->query("CREATE DATABASE IF NOT EXISTS `".$af_cbms_database."`"); 
$dbh->query("USE `".$af_cbms_database."`"); 


3)不要使用$af_这样的变量过多地使代码变得复杂,要像dbconnect.php的固定代码那样简单:

<?php

global $dbh;

$host     = "localhost";                                               
$user     = "root";                                                      
$password = ""; 
$db_name  = "af_cbms";

try {  
  $dbh = new PDO("mysql:host=$host", $user, $password); 
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
  $dbh->query("CREATE DATABASE IF NOT EXISTS ".$db_name); 
  $dbh->query("SET CHARACTER SET utf8"); 
  $dbh->query("USE ".$db_name); 
}  
catch(PDOException $e) {  
  die($e->getMessage());
} 

4)奖励:不要使用global $dbh,因为可能会发生某些过程,某些代码可以替换$dbh变量。使用global变量也不流行(:

所以有一些Object会保留共享内容:

class Objs {
  private $data = [];

  final public static function set($key, $instance, $preventReset = false) {
    if($preventReset === true AND isset(self::$data[$key])) {
      return self::$data[$key];
    }
    return self::$data[$key] = $instance;
  }

  final public static function get($key, $instance) {
    return self::$data[$key];
  }
}

并在您的数据库连接文件中:

require_once('classes/Objs.php');
Objs::set('db', $dbh, true);

并在您的其他文件中:

$stmt = Objs::get('db')->prepare('SELECT * FROM city_tbl');

答案 1 :(得分:0)

我也遇到了这个问题。错误是我在声明函数之前调用了函数。因此,我更改了顺序,以便在声明该函数后调用该函数。