为何escape_string方法无法生效?调用时提示找不到该方法
问题分析与解决方案
首先,咱们先梳理你遇到的几个问题:
1. 找不到escape_string方法的核心原因
你调用self::$database->escape_string($id)时提示方法不存在,本质是你的self::$database对象的类型没有这个方法:
- 如果
self::$database是PDO实例:PDO根本没有escape_string这个方法,它的字符串转义用quote(),但更推荐用预处理语句(安全等级更高)。 - 如果
self::$database是mysqli实例:mysqli的字符串转义方法是real_escape_string(),escape_string只是它的别名,部分环境可能没有启用这个别名,或者你的对象并非mysqli实例。 - 如果是自定义数据库类:那你需要自己在类中实现
escape_string方法才行。
2. 代码里的其他小错误
除了方法不存在的问题,你的代码还有两个容易忽略的bug:
- SQL语句拼接时缺少空格:
$sql .= "WHERE id = '"会让SQL变成SELECT * FROM bicyclesWHERE id = ...,直接触发SQL语法错误,应该改成$sql .= " WHERE id = '"(注意WHERE前的空格)。 - 拼写错误:
return fasle;应该是return false;。
3. 针对性解决方案
方案一:如果使用PDO(推荐,更安全)
直接用预处理语句替代手动转义,彻底避免SQL注入问题:
static public function find_by_id($id) { // 使用带占位符的SQL $sql = "SELECT * FROM bicycles WHERE id = :id"; // 预处理语句 $stmt = self::$database->prepare($sql); // 绑定参数,指定参数类型为整数(id一般是整数) $stmt->bindParam(':id', $id, PDO::PARAM_INT); $stmt->execute(); // 这里需要调整find_by_sql方法,让它支持接收PDOStatement对象,或者直接获取结果 $obj_array = self::find_by_sql($stmt); return !empty($obj_array) ? array_shift($obj_array) : false; }
方案二:如果使用mysqli
改用real_escape_string()方法,同时修正代码错误:
static public function find_by_id($id) { $sql = "SELECT * FROM bicycles"; // 加空格+使用正确的转义方法 $sql .= " WHERE id = '" . self::$database->real_escape_string($id) . "'"; $obj_array = self::find_by_sql($sql); // 简化返回逻辑,同时修正拼写错误 return !empty($obj_array) ? array_shift($obj_array) : false; }
额外建议
不管用PDO还是mysqli,都优先使用预处理语句,手动转义不仅容易出错,还存在SQL注入的风险,预处理语句是更安全的解决方案。
内容的提问来源于stack exchange,提问作者Tom West
相关产品推荐
相关产品推荐

