草庐IT

php - 转义 MySQL 通配符

coder 2023-05-10 原文

在我正在使用的旧服务器上,我无法使用准备好的语句,我目前正试图在将用户输入发送到 MySQL 之前完全转义它。 为此,我使用 PHP 函数 mysql_real_escape_string

由于此函数不会转义 MySQL 通配符 % 和 _,因此我也使用 addcslashes 来转义这些。

当我发送类似:

test_test " ' 

到数据库再读回数据库显示:

test\_test " ' 

看着这个,我不明白为什么 _ 前面有反斜杠,但 "和 ' 没有。 因为它们都用\肯定 _ ' 进行了转义,并且 "应该看起来都一样,即所有转义字符都可见或都不可见。

转义的\s 是否会自动屏蔽掉

谁能解释一下?

最佳答案

_% 通常在 MySQL 中不是通配符,不应为了将它们放入普通字符串文字而对其进行转义。 mysql_real_escape_string 是正确且足够的。 addcslashes 不应使用。

_% 仅在 LIKE 匹配的上下文中是特殊的。当您想在 LIKE 语句中准备字符串以供文字使用时,以便 100% 匹配 100% 而不仅仅是任何以 100 开头的字符串,您有两个级别的逃跑需要担心。

第一个是 LIKE 转义。 LIKE 处理完全在 SQL 内部进行,如果您想将文字字符串转换为文字 LIKE 表达式,您必须执行此步骤即使您使用的是参数化查询!

在此方案中,_% 是特殊的,必须进行转义。转义字符也必须转义。根据 ANSI SQL,这些 以外的字符不得 转义:\' 将是错误的。 (虽然 MySQL 通常会让你侥幸逃脱。)

完成此操作后,您将进入第二级转义,即普通的旧字符串文字转义。这发生在 SQL 之外,创建 SQL,因此必须在 LIKE 转义步骤之后完成。对于 MySQL,这是 mysql_real_escape_string 和以前一样;对于其他数据库,会有不同的功能,您可以使用参数化查询来避免这样做。

这里导致混淆的问题是,在 MySQL 中,两个嵌套转义步骤都使用反斜杠作为转义字符!因此,如果您想将字符串与文字百分号匹配,则必须使用双反斜杠转义并说 LIKE 'something\\%'。或者,如果这是在 PHP " 文字中也使用反斜杠转义,"LIKE 'something\\\\%'"。啊!

根据 ANSI SQL,这是不正确的,它说:在字符串文字中,反斜杠表示文字反斜杠,转义单引号的方法是 '';在 LIKE 表达式中,默认情况下根本没有转义字符。

因此,如果您想以可移植的方式 LIKE-escape,您应该覆盖默认(错误)行为并指定您自己的转义字符,使用 LIKE ... ESCAPE ... 构造.为了理智,我们将选择该死的反斜杠以外的其他东西!

function like($s, $e) {
    return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s);
}

$escapedname= mysql_real_escape_string(like($name, '='));
$query= "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";

或带参数(例如在 PDO 中):

$q= $db->prepare("... WHERE name LIKE ? ESCAPE '=' AND ...");
$q->bindValue(1, '%'.like($name, '=').'%', PDO::PARAM_STR);

(如果您想要更多的可移植性聚会时间,您还可以尝试考虑 MS SQL Server 和 Sybase,其中 [ 字符在 LIKE 中也错误地是特殊字符 语句并且必须被转义。啊。)

关于php - 转义 MySQL 通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3683746/

有关php - 转义 MySQL 通配符的更多相关文章

  1. ruby - 匹配未转义的平衡定界符对 - 2

    如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。

  2. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  3. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  4. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  5. ruby - 如何使用 ruby​​ mysql2 执行事务 - 2

    我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi

  6. ruby - 在 Ruby 中将转义的 unicode (\u008E) 转换为重音字符 (Ž)? - 2

    我遇到了一个非常困难的时期:#containedwithin:"MA\u008EEIKIAI"#shouldbe"MAŽEIKIAI"#natureofstring$pstring3"MA\u008EEIKIAI"$putsstring3MAEIKIAI$string3.inspect"\"MA\\u008EEIKIAI\""$string3.bytes#关于从哪里开始的任何想法?注意:这不是我的previousquestion的副本. 最佳答案 \u008E表示代码点为8e(十六进制)的unicode字符出现在字符串中的那个位置。

  7. ruby - 如何转义 Ruby 字符串插值? - 2

    给定这段代码:has_many:foos,:finder_sql=#{id}部分被过早插入。我如何逃脱它? 最佳答案 在定界符两边加上单引号:has_many:foos,:finder_sql= 关于ruby-如何转义Ruby字符串插值?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2052724/

  8. Ruby 转义 HTML 字符串 - 2

    知道如何在Ruby中对以下字符串进行转义吗?C:\inetpub\wwwroot\adminWeb到C:\inetpub\wwwroot\adminWeb或到C%3A%5Cinetpub%5Cwwwroot%5CadminWeb尝试使用URI.decode没有成功。 最佳答案 CGIlibrary是一种选择:require'cgi'CGI.unescapeHTML('C:\inetpub\wwwroot\adminWeb')#=>"C:\\inetpub

  9. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  10. ruby-on-rails - 当我通过 rvm 使用 rails3 时,如何在 ubuntu 上安装 mysql2 gem? - 2

    我正在尝试绕过rails配置这个极其复杂的迷宫。到目前为止,我设法在ubuntu上设置了rvm(出于某种原因,ruby在ubuntu存储库中已经过时了)。我设法建立了一个Rails项目。我希望我的测试项目使用mysql而不是mysqlite。当我尝试“rakedb:migrate”时,出现错误:“!!!缺少mysql2gem。将其添加到您的Gemfile:gem'mysql2'”当我尝试“geminstallmysql”时,出现错误,告诉我需要为安装命令提供参数。但是,参数列表很大,我不知道该选择哪些。如何通过在ubuntu上运行的rvm和mysql获取rails3?谢谢。

随机推荐