PHP子类调用父类方法报错:数据库插入时prepare调用失败
问题原因及修复方案
核心问题
错误提示"Call to a member function prepare() on string",本质是connect()方法返回的不是PDO对象,而是错误信息字符串——这说明数据库连接失败,代码进入了catch块返回错误文本,后续却尝试在这个字符串上调用PDO的prepare()方法,导致致命错误。
具体错误点
主机名拼写错误:
DbConn类中$host的值写成了'locahost',正确拼写应为'localhost',拼写错误直接导致无法连接数据库服务器。PDO连接参数格式错误:
PDO构造函数的正确用法是传入独立的DSN、用户名、密码参数,原代码错误地将用户名和密码拼接在DSN字符串末尾,导致DSN格式完全失效,无法创建PDO实例。错误处理逻辑不当:
catch块返回错误字符串而非抛出异常,使得上层代码无法感知连接失败,仍继续执行后续的数据库操作,最终触发错误。
修正后的代码
DbConn.php(父类)
<?php class DbConn { private $host = 'localhost'; // 修正主机名拼写 private $dbname = 'gawker'; private $dbusername = 'root'; private $dbpassword = ''; public function connect(){ try { // 正确传入PDO构造函数参数 $pdo = new PDO( 'mysql:host=' . $this->host . ';dbname=' . $this->dbname, $this->dbusername, $this->dbpassword ); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); return $pdo; } catch (PDOException $e) { // 抛出异常,让上层代码处理错误 throw new Exception('无法连接到数据库服务器: ' . $e->getMessage() . ' in ' . $e->getFile() . ':' . $e->getLine()); } } } ?>
AddArticle.php(子类)
<?php include __DIR__ . '/../includes/DbConn.php'; class AddArticle extends DbConn { public function insertArticle($title, $content) { $sql = 'INSERT INTO articles (title, content) VALUES (:title, :content);'; $stmt = $this->connect()->prepare($sql); $values = [ 'title' => $title, 'content' => $content ]; $stmt->execute($values); } } // 调用时建议添加异常捕获,避免白屏错误 // try { // $articleAdder = new AddArticle(); // $articleAdder->insertArticle('测试标题', '测试内容'); // } catch (Exception $e) { // echo $e->getMessage(); // } ?>
内容的提问来源于stack exchange,提问作者J. Reis
相关产品推荐
相关产品推荐

