PHP类中PDO查询数据库报SQL语法错误,求助解决
问题描述
在PHP类中查询数据库时触发SQL语法错误:
Uncaught PDOException: Syntax error or access violation: You have an error in your SQL syntax
使用普通PHP函数实现相同功能正常,但类中的代码无法运行。
调用代码:
// using composer autoload.php $user = new User($pdo); $email = $user->getEmail($username); echo $email;
注:$pdo来自连接MariaDB的database.php文件
User类代码:
class User { private $dbc; public function __construct(\PDO $pdo) { $this->dbc = $pdo; } public function getEmail($username) { $stmt = $this->dbc->query('SELECT * FROM users WHERE username=?'); $stmt->execute([$username]); $request = $stmt->fetch(); return $request['email']; } }
问题原因与解决办法
错误出在getEmail方法里的query()调用——PDO的query()方法直接执行SQL语句,不支持预处理占位符?,这会导致SQL语法错误。正确的做法是使用prepare()方法创建预处理语句,再执行绑定参数。
修正后的getEmail方法代码:
public function getEmail($username) { $stmt = $this->dbc->prepare('SELECT email FROM users WHERE username=?'); $stmt->execute([$username]); // 直接获取单个字段,简化代码 return $stmt->fetchColumn(); }
额外优化点:
- 只查询需要的
email字段,比SELECT *更高效 - 使用
fetchColumn()直接返回单个字段值,省去数组取值步骤
内容的提问来源于stack exchange,提问作者holdmydev
相关产品推荐
相关产品推荐

