【问题标题】:Cannot execute prepared statement "Fatal error: Call to a member function prepare() on null" error无法执行准备好的语句“致命错误:在 null 上调用成员函数 prepare()”错误
【发布时间】:2016-06-14 13:46:10
【问题描述】:

所以我有这个代码

$lang=new language();
$default_language=$lang->getLanguage(0);

$currencies = new currency();
$currencies = $currencies->getCurrencies();

getCurrencies()getLanguage() 在另一个带有类的文件中。

public function getCurrencies() {
    $curr=new record();
    return $curr -> getRecords('currencyTable','currency_order',array("currency_id","currency_name"));
  }

public function getLanguage($record) {
    $lang=new record();
    return $lang->getRecord('languageTable',$record,'lang_order','*');
  }

getRecordsgetRecordrecord 类的公共函数

我不断收到错误

Fatal error: Call to a member function prepare() on null

参考getRecords函数的查询。

我不知道如何解决这个问题。这是否与与数据库的连接有关?

另外,奇怪的是,如果我删除了

$lang=new language();
$default_language=$lang->getLanguage(0);

部分,这个错误消失了。有什么帮助吗?是$default_language=$lang->getLanguage(0); 行中的错误,这就是它搞乱数据库连接的原因,导致此错误?

谢谢

编辑

这里是getRecordgetRecords

public function getRecords($table,$sorder,$field_names) {        
    $conn = db::open();

      //- build string of field names
      if($field_names!='*'){
      $field_string="";
      foreach ($field_names as $value) {
        $field_string.=",".$value;    
      }
      $field_string = substr($field_string,1);
    }else{
      $field_string='*';
    }
    //end up with field1, field2... or *
    //soreder is a field, contains int like 1 2 3

    //- run statement
    $stmt = $conn->prepare("SELECT ".$field_string." FROM ".$table." ORDER BY ".$sorder." ASC");
    $stmt->execute();
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);   
    return $results;
  }

public function getRecord($table,$record,$sorder,$field_names) {
    $conn = db::open();


      if($field_names!='*'){
      $field_string="";
      foreach ($field_names as $value) {
        $field_string.=",".$value;    
      }
      $field_string = substr($field_string,1);
    }else{
      $field_string='*';
       }
       //same things for $field_string and $sorder

    $stmt = $conn->prepare("SELECT ".$field_string." FROM ".$table." ORDER BY ".$sorder." LIMIT ? OFFSET ?");
    $stmt->bindValue(1, 1 , PDO::PARAM_INT);
    $stmt->bindValue(2, $record, PDO::PARAM_INT);
    $stmt->execute();
    $results = $stmt->fetch(PDO::FETCH_ASSOC);

    return $results;
  }

我修正了一个错误。在getRecord 中,我有LIMIT 1 并按上述方法进行了修复。关于getRecords 行,我仍然遇到同样的错误:$stmt = $conn->prepare("SELECT ".$field_string." FROM ".$table." ORDER BY ".$sorder." ASC");

有什么想法吗?

谢谢

【问题讨论】:

  • 发布record 课程的代码。
  • 您的 PDO 连接失败,或者您没有正确保存/访问 PDO 对象,并且正在执行$this->null->prepare 或其他任何操作。
  • 你的 db 类有问题。

标签: php pdo prepared-statement


【解决方案1】:

您的数据库连接失败。该错误不在您发布的代码中。代码中的错误是在准备语句时。 例如:$statement = $dbh->prepare("SELECT * FROM some_table")。我建议抛出异常以查看您的连接出了什么问题。您可以通过将选项添加到您的 pdo 初始化来做到这一点。 array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)

  try{
    $dbh = new PDO('mysql:host='.MYSQL_HOST.';dbname='.MYSQL_DB,
                    MYSQL_USERNAME,
                    MYSQL_PASSWORD,
                    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
  }catch(Exception $e){
    echo $e->getMessage();
  }

希望对你有帮助

【讨论】:

猜你喜欢
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多