gpt4 book ai didi

php - 如何处理(转义)mysqlclient 中的 % 符号(C 库)

转载 作者:行者123 更新时间:2023-11-29 06:53:45 25 4
gpt4 key购买 nike

我正在使用 mysqlclient,

在我的一个查询中,如下所示

sprintf (query, "select user from pcloud_session where id = '%s'", sid);

有时这个 sid 是用 % 登录的,就像例子一样

2Cq%yo4i-ZrizGGQGQ71eJQ0

但是当有这个 % 时,这个查询总是失败,我想我必须转义这个 %,但是如何呢?

我试过\和 %% ,但这两个都不起作用,请在这里帮助我

更新:

当使用 session.hash_bits_per_character = 6 时,在 php session 中,默认字符集包含一个字符(逗号),它将始终被 urlencoded(这里是 %2C)。这导致 cookie 值中包含此 %2C,但 session 数据库中包含一个逗号而不是它。关于解决这个问题有什么想法吗?..很抱歉造成混淆

谢谢

最佳答案

无需在 MySQL 查询文本中对文字 '%' 进行转义。

当您说查询“总是失败”时,是否是对返回错误的 mysql_query 函数的调用?它会返回 SQL 异常代码,还是只是没有返回您期望的结果集(行)?

对于调试,我建议您在调用 sprintf 之后回显 query 字符串的内容。我们希望字符串的内容是:

select user from pcloud_session where id = '2Cq%yo4i-ZrizGGQGQ71eJQ0'

而且我没有看到该 SQL 构造有任何问题(假设 id 列存在于 pcloud_session 中并且是字符数据类型。即使 id 被定义为整数类型,该语句通常不会抛出异常,字符串文字只会被解释为整数值 2。)

在 sprintf 的目标格式中包含一个 '%' 应该没有问题。在 MySQL 查询文本中包含“%”文字应该没有问题。

(当然,我假设 sid 是通过调用 mysql_real_escape_string 函数填充的。)


再次,我建议您在调用 sprintf 之后回显 query 的内容。我还建议您确保没有其他代码破坏该字符串的内容,这是作为参数传递给 mysql_query 函数的实际字符串。 (如果您使用的是 mysql_real_query 函数,请确保您传递的长度正确。)


更新

Oxi 说: “它没有返回 SQL 异常代码,它只是没有返回我期望的结果 [set]。我确实打印了查询,它打印了 %。”

@奥西

这里有一大堆问题,可以帮助您找出问题所在。

您是否从 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 编码表示的,但它不是任何标准编码,因为它包含“%”和“-”字符。

关于php - 如何处理(转义)mysqlclient 中的 % 符号(C 库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13978330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com