如何在PHP+MySQL查询中处理含撇号('s)的字符串?
解决MySQL查询含撇号字符串的问题
你的问题根源是SQL语句里的单引号会被MySQL当作字符串的结束标记,'willy's Kitchen'会被解析成'willy',后面的s Kitchen'就成了语法错误,导致查询失败。以下是两种正确的处理方式:
方法1:使用预处理语句(强烈推荐)
预处理语句能自动处理字符串中的特殊字符(包括撇号),还能彻底避免SQL注入,是最安全可靠的方案,不管用PDO还是mysqli都能实现:
PDO实现示例
// 连接数据库 $pdo = new PDO('mysql:host=localhost;dbname=你的数据库名', '用户名', '密码'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 准备预处理语句 $stmt = $pdo->prepare("SELECT * FROM shope_details WHERE shop_name = ?"); // 绑定查询参数并执行 $targetShop = "willy's Kitchen"; $stmt->execute([$targetShop]); // 获取查询结果 $shops = $stmt->fetchAll(PDO::FETCH_ASSOC);
MySQLi面向对象实现示例
// 连接数据库 $mysqli = new mysqli('localhost', '用户名', '密码', '你的数据库名'); if ($mysqli->connect_error) { die("连接失败: " . $mysqli->connect_error); } // 准备预处理语句 $stmt = $mysqli->prepare("SELECT * FROM shope_details WHERE shop_name = ?"); // 绑定参数(s代表字符串类型) $targetShop = "willy's Kitchen"; $stmt->bind_param("s", $targetShop); // 执行查询 $stmt->execute(); // 获取结果集 $shops = $stmt->get_result()->fetch_all(MYSQLI_ASSOC); // 关闭资源 $stmt->close(); $mysqli->close();
方法2:手动转义特殊字符(不推荐)
如果非要手动处理,可以用MySQL提供的转义函数,把字符串里的单引号转成两个单引号,让MySQL正确识别:
$mysqli = new mysqli('localhost', '用户名', '密码', '你的数据库名'); $targetShop = "willy's Kitchen"; // 转义特殊字符 $escapedShop = $mysqli->real_escape_string($targetShop); // 构造查询语句 $query = "SELECT * FROM shope_details WHERE shop_name = '$escapedShop'"; // 执行查询 $result = $mysqli->query($query);
注意:手动转义容易遗漏特殊字符,还存在SQL注入风险,除非特殊情况,优先用预处理语句。
内容的提问来源于stack exchange,提问作者Tenacious Techno
相关产品推荐
相关产品推荐

