2011-02-24 65 views
0

我在perl中有幾個mysql查詢,但是某些where子句的值包含單詞之間的空格,例如岡比亞。當我的腳本使用包含空格的where子句參數運行時,它會忽略第二個單詞。我想爲我的mysql查詢自動添加單引號

我想知道如何解決這個問題,即如果我輸入岡比亞它應該被視爲岡比亞不是。

回答

2

那麼,首先,你應該看看在應用程序中使用類似DBIx::Class而不是原始SQL。

但是,如果您遇到原始SQL,那麼(假設您至少使用DBI)應該在SQL語句中使用綁定點。這將爲您處理所有報價問題。

$sth = $dbh->prepare('select something from somewhere where country = ?'); 

$sth->execute('The Gambia'); 

有關綁定的更多信息,請參閱DBI docs

+0

@bvr @davorg感謝您的回覆,但爲了讓您瞭解更多,只需附上一段代碼即可。我正在做這樣的事情,但將其分配給一個變量,我的查詢也包含一個類似的子句。下面是代碼$ sel = $ dbh-> prepare(「SELECT'id','date' as day,'time','one','one_r','two','two_r',league,country,details FROM football WHERE(one like trimming(?)or two LIKE TRIM(?))$ country $ league $ date $ limit「); \t \t \t $ sel-> execute(「%$ command%」,「%$ command%」); $ row = $ sel-> fetchrow_hashref(); $ SEL->結束(); – 2011-02-24 09:22:59

+1

@Sheriffo Ceesay - 請將代碼添加到您的問題。還請提供代碼,您正在建立'$ country'和'$ league'。 – bvr 2011-02-24 09:27:40

+0

$ sel = $ dbh-> prepare(「SELECT id,date as day,time,one,one_r,two,two_r,league,country,details FROM football WHERE(one LIKE TRIM(?)or two LIKE TRIM(?) )$ country $ league $ date $ limit「); $ SEL->執行( 「%$命令%」, 「%$命令%」); $ row = $ sel-> fetchrow_hashref(); $ SEL->結束(); – 2011-02-24 09:29:11

6

如果您使用的是DBI,則可以使用佔位符向數據庫發送任意數據,而無需關心轉義。佔位符是問號prepare聲明,實際值是給execute

use DBI; 

$dbh = DBI->connect("DBI:mysql:....",$user,$pass) 
    or die("Connect error: $DBI::errstr"); 

my $sth = $dbh->prepare(qq{ SELECT something FROM table WHERE name = ? }); 
$sth->execute('the gambia'); 

# fetch data from $sth 

$dbh->disconnect(); 

編輯:如果您正在撰寫的查詢(如你在評論中所建議的),你可以利用quote方法:

my $country = "AND country = " . $dbh->quote('the gambia'); 
my $sth = $dbh->prepare(qq{ SELECT something FROM table WHERE name = ? $country}); 
+0

@Sheriffo Ceesay - 根據您的意見更新。 – bvr 2011-02-24 09:37:28

+0

爲了準確地說明這一點,佔位符*不會*轉義數據值。使用預準備語句時,SQL命令的結構和這些命令使用的數據將完全分開發送到數據庫,從而不需要完全轉義數據。這就是爲什麼佔位符/預處理語句優於轉義的原因:由於數據是從命令分開發送的,因此無法欺騙數據庫以將命令解釋爲數據。 – 2011-02-24 09:41:15

+0

@Dave Sherohman - 你說得對,我相應地更新了文字。 – bvr 2011-02-24 09:46:27