Chinaunix

标题: Perl+Mysql 查询数据库的时候,如何使用逃逸字符 [打印本页]

作者: andy820303    时间: 2010-03-29 14:59
标题: Perl+Mysql 查询数据库的时候,如何使用逃逸字符
比如说,mysql的一张表中(ark_volume)有一个displayname字段,我想根据这个字段来进行查找,比如,我想查找display字段的内容为nwt-vm-ark0311.demo.arkivio.com\c$

$sqr = $dbh->prepare("SELECT DISTINCT volid from ark_volume WHERE displayname = '\\\\\\\\nwt-vm-ark0311.demo.arkivio.com\\\\C$'");
我试了一下,好像不行,因为$'被识别成了一个特殊变量

所以我把单引号房到了外面
$sqr = $dbh->prepare('SELECT DISTINCT volid from ark_volume WHERE displayname = "\\\\\\\\nwt-vm-ark0311.demo.arkivio.com\\\\C$"');
貌似可以了。

不过我现在想把nwt-vm-ark0311.demo.arkivio.com\c$存入到一个变量中,之后再mysql语句中使用这个变量,好像怎么弄都不行?

谁能帮我想个办法啊?
作者: longbow0    时间: 2010-03-29 14:59
用 DBI 方法 quote,系统会自动处理:

http://search.cpan.org/~timb/DBI-1.609/DBI.pm#quote

  1. $sql = $dbh->quote(...)
复制代码

作者: climby    时间: 2010-03-29 15:09
MYSQL中有个专门的ESCAPE函数可以帮到你
SELECT DISTINCT volid from ark_volume WHERE displayname = "nwt-vm-ark0311.demo.arkivio.comC$"  ESCAPE '$';
作者: andy820303    时间: 2010-03-29 15:17
MYSQL中有个专门的ESCAPE函数可以帮到你
SELECT DISTINCT volid from ark_volume WHERE displayname = "nw ...
climby 发表于 2010-03-29 15:09


谢谢,如果直接这样hardcode的话,只要内层用的是双引号,其实是没有问题的。

问题是,如果内层是单引号,问题就出现了。$和'就会结合到一起。我现在的问题是,如果单引号在最外面,怎么能保证变量被替换呢?
作者: andy820303    时间: 2010-03-29 15:33
目前找到一个临时的办法

$inPutShare = "\\\\\\\\nwt-vm-ark0311.demo.arkivio.com\\\\C\$";

$sqr = $dbh->prepare("SELECT DISTINCT volid from ark_volume WHERE displayname = \'"."$inPutShare"."\'");

其实就是把单引号给escape掉了,不过还是要谢谢4楼的朋友,我先看看quote该怎么用

谢谢!
作者: longbow0    时间: 2010-03-29 15:37
《Programming the Perl DBI》 中有介绍:

http://oreilly.com/catalog/perldbi/chapter/ch04.html
作者: andy820303    时间: 2010-03-29 15:53
真的很方便,谢谢longbow0




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2