没有必要'%'
在 MySQL 查询文本中转义文字。
当您说查询“总是失败”时,是对mysql_query
返回错误的函数的调用吗?它是返回 SQL 异常代码,还是只是不返回您期望的结果集(行)?
对于调试,我建议您query
在调用sprintf
. 我们希望字符串的内容是:
select user from pcloud_session where id = '2Cq%yo4i-ZrizGGQGQ71eJQ0'
而且我没有看到该 SQL 构造有任何问题(假设该id
列存在于pcloud_session
并且是字符数据类型。即使 id 被定义为整数类型,该语句通常也不会引发异常,字符串文字只是解释为 2 的整数值。)
在 sprintf 的目标格式中包含 '%' 文字应该没有问题。在 MySQL 查询文本中包含 '%' 文字应该没有问题。
(当然,我假设这sid
是由函数调用填充的mysql_real_escape_string
。)
同样,我建议您query
在调用 sprintf 之后回显 的内容。我还建议您确保没有其他代码与该字符串的内容混为一谈,这是作为参数传递给mysql_query
函数的实际字符串。(如果您正在使用该mysql_real_query
函数,请确保您传递了正确的长度。)
更新
Oxi 说: “它没有返回 SQL 异常代码,只是没有返回我期望的结果 [set]。我确实打印了查询,它打印了 % 。”
@Oxi
这里有一大堆问题可能会帮助您找出问题所在。
您是否从 mysql 命令行客户端运行了该查询文本的测试,并返回您期望的行?
该id
列是否定义为长度为(至少)24 个字符的 VARCHAR(或 CHAR)?列上的排序规则设置为不区分大小写,还是区分大小写?
show create table pcloud_session ;
(我没有看到任何会导致字符集转换出现问题的字符,尽管如果您的应用程序与数据库字符集编码不匹配,这可能是问题的根源。)
您是否使用 LIKE 谓词针对该 id 列测试查询?
SELECT id, user FROM pcloud_session WHERE id LIKE '2Cq\%yo4i-%' ESCAPE '\\'
ORDER BY id LIMIT 10 ;
SELECT id, user FROM pcloud_session WHERE id LIKE '2Cq%'
ORDER BY id LIMIT 10 ;
当您期望一行时,您是否没有返回任何行?您是否返回了太多行,或者您得到的行与您期望的行不同?
id
对于一列来说,这是一个奇怪的值。起初,它看起来好像该值是以 base-64 编码表示的,但它不是任何标准编码,因为它包含 '%' 和 '-' 字符。