【问题标题】:encoding/decoding textarea value using rawurlencode/rawurldecode使用 rawurlencode/rawurldecode 编码/解码 textarea 值
【发布时间】:2023-03-08 11:57:02
【问题描述】:

在使用带有rawurlencode 函数的PHP 存储到mysql 之前对textarea 的换行进行编码时,会将换行编码为%0D%0A

例如: 用户输入的 textarea 文本:

a
b

使用 rawurlencode 编码并存储到数据库中会将值存储为a%0D%0Ab

当从数据库中检索并使用rawurldecode 解码时不起作用并且代码出错。如何克服这种情况以及存储、检索和显示 textarea 值的最佳方法是什么。

【问题讨论】:

  • 是否有理由将 rawlurlencode 用于像 textarea 这样的海量数据?不应该使用 POST 方法吗?
  • 我使用 rawurlencode 在存储到数据库之前对所有符号进行编码,而不是用于 POST

标签: php textarea urldecode


【解决方案1】:

如果上述方法不适合您,您能否先使用 base64_encode 对该文本区域字符串进行编码,然后在其上执行 base64_decode

如果 textarea 不包含 URL,您应该使用 base64_encode 然后 rawurlencode 然后正常存储。

【讨论】:

  • base64_encode 到目前为止运行良好,但 base64_decode('YQ0KYg==') 返回 "a b" 而不是在两行中显示 a 和 b。 ('YQ0KYg==' 是 textarea 的编码值,两行有 a 和 b)
  • 嘿 ZHS,我自己尝试过这个,因为我确信我在说什么。 YQ0KYg== 是所需字符串的编码值(a 和 b 在两行中)。但是,如果您在将其显示为两行时遇到问题,请在解码值上使用它,例如str_replace(PHP_EOL,'\n',base64_decode('YQ0KYg=='));,这将给出a\nb,其中\n 是我们的换行符。您可以随时使用var_dump 函数转储变量。
  • 另外,如果这是用户输入的文本区域,请确保在将数据存储到数据库之前对其进行转义,例如对于 mysql,您可以使用:mysql_real_escape_string()
  • 另一个问题,base64_encode() 在编码字符串中添加“+”号,这会使我的应用程序崩溃。你知道它在编码时使用了哪些字符吗?我见过 + 和 =
  • 请使用strtr(base64_encode($string), '+/=', '-_,');base64_decode(strtr($encoded, '-_,', '+/=')); - 这将处理这些符号.. 或者在strtr 的第三个参数中使用不会使您的应用程序崩溃的东西。
【解决方案2】:

您根本不应该使用 rawurlencode 来为您的数据库转义数据

每种目标格式都有它自己的转义方法,一般来说,它可以确保它安全地从一个地方存储/显示/传输到另一个地方,而另一端不需要解码

例如:

  • 在 HTML 中显示文本,使用 htmlentities 或 htmlspecialchars
  • 存储在数据库中,使用mysqli_real_escape_string、pg_escape_string等...
  • 传输变量名,使用 urlencode
  • 传输变量内容,使用 rawurlencode
  • 等等……

您应该注意到,解码这些内容通常由浏览器/数据库完成。因此,实际上没有任何数据被转义存储。而且解码不需要你的代码来完成。

问题可能是因为您使用 rawurlencode 转义序列,但您的数据库需要特定品牌数据库的转义格式。并使用错误的假设将其转义,这弄乱了您的字符串。

结论:找出您正在使用的品牌数据库,查找该数据库的特定转义函数,并在所有您的内容“转移”上使用适当的转义函数。


P.S.:某些定义可能不正确,请对此发表评论。我想让这个想法坚持下去,但可能没有使用所有正确的术语。

【讨论】:

    【解决方案3】:

    首先,通过 urlencode() 运行 textarea 是非常少见的 urlencode 不是为此目的而设计的。

    其次,如果您仍然想这样做,那么问题可能来自数据库。首先,您需要告诉我们您使用的数据库以及用于存储这些数据的 TYPE:您将其存储为 TEXT 数据还是 BINARY 数据?您是否在数据库中设置了正确的字符集?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      相关资源
      最近更新 更多