首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法执行准备好的语句“致命错误:调用成员函数prepare() on null”错误

问无法执行准备好的语句“致命错误:调用成员函数prepare() on null”错误
EN

Stack Overflow用户
提问于 2016-06-14 13:46:10
回答 1查看 436关注 0票数 0

所以我有这个密码

代码语言:javascript
复制
$lang=new language();
$default_language=$lang->getLanguage(0);

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

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

代码语言:javascript
复制
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','*');
  }

getRecords和getRecord是公共函数--它是record类

我一直在犯错误

代码语言:javascript
复制
Fatal error: Call to a member function prepare() on null

引用getRecords函数的查询。

我不知道怎么解决这个问题。这与到数据库的连接有关吗?

另外,奇怪的是如果我移除

代码语言:javascript
复制
$lang=new language();
$default_language=$lang->getLanguage(0);

部分地,这个错误消失了。有什么帮助吗?这是$default_language=$lang->getLanguage(0);行中的错误吗?这就是为什么它会破坏数据库连接,从而导致此错误吗?

谢谢

编辑

这是getRecord和getRecords

代码语言:javascript
复制
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;
  }

和

代码语言:javascript
复制
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");,我仍然得到了相同的错误

有什么想法吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2016-06-14 14:14:40

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

代码语言:javascript
复制
  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();
  }

希望这能有所帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37813897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档