如何用PHP和SQL查询Base64编码的用户名?尝试FROM_BASE64无效
问题
需要用PHP和SQL查询users表中用户名匹配指定关键词的记录,原代码示例如下:
$search = "cat"; $sql = "SELECT * FROM users WHERE username LIKE '%$search%'";
但users表的username字段是Base64编码的,示例数据:
| username | 解码后 |
|---|---|
| UG9zdGUgSsOh= | cat |
| U2FtcGFpbw== | dog |
| RWxsZW4= | bird |
尝试使用FROM_BASE64和TO_BASE64函数但未成功,求正确实现方法。
正确实现方法
1. 核心SQL逻辑
要匹配解码后的用户名,需先用FROM_BASE64()函数把存储的Base64字段解码,再和关键词做模糊匹配。如果存储的Base64字符串带有多余空格,要先通过TRIM()清理:
SELECT * FROM users WHERE FROM_BASE64(TRIM(username)) LIKE '%cat%'
2. 结合PHP的安全实现
直接拼接变量到SQL会存在注入风险,必须使用预处理语句:
PDO实现
$search = "cat"; $searchParam = "%{$search}%"; $sql = "SELECT * FROM users WHERE FROM_BASE64(TRIM(username)) LIKE ?"; $pdo = new PDO('mysql:host=localhost;dbname=your_db', 'user', 'pass'); $stmt = $pdo->prepare($sql); $stmt->execute([$searchParam]); $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
mysqli实现
$search = "cat"; $searchParam = "%{$search}%"; $sql = "SELECT * FROM users WHERE FROM_BASE64(TRIM(username)) LIKE ?"; $mysqli = new mysqli('localhost', 'user', 'pass', 'your_db'); $stmt = $mysqli->prepare($sql); $stmt->bind_param("s", $searchParam); $stmt->execute(); $result = $stmt->get_result(); $results = $result->fetch_all(MYSQLI_ASSOC);
3. 为什么用TO_BASE64不行?
如果尝试把关键词转成Base64再匹配,会因为Base64的编码特性失效:同一个字符串的子串转Base64后,和原字段Base64的子串没有对应关系。比如cat的Base64是Y2F0,但存储的UG9zdGUgSsOh=解码后是cat,它的Base64字符串里并没有Y2F0,因此这种方式无法查到结果。
内容的提问来源于stack exchange,提问作者Bruno
相关产品推荐
相关产品推荐

