2017-10-20 78 views
0

我是一名VOIP管理員,我有用於更新Perl中的目錄數據庫的腳本,這是在我受僱於此之前從供應商處購買的。腳本只在一個系統上給出數據庫錯誤

該腳本在除一個之外的所有服務器上都正常工作。

#!/usr/bin/perl 
use lib "/opt/asterisk/lib/"; 
use DBI; 
use Asterisk::config; 
sub trim($); 
# database information 
$db="kesc"; 
$host="sip-ho.kesc.com.pk"; 
$userid="foo"; 
$passwd="bar"; 
$connectionInfo="dbi:mysql:$db;$host"; 
$hubname = ""; 

# make connection to database 
$dbh = DBI->connect($connectionInfo,$userid,$passwd); 
# Perl trim function to remove whitespace from the start and end of the string 
sub trim($) 
{ 
    my $string = shift; 
    $string =~ s/^\s+//; 
    $string =~ s/\s+$//; 
    return $string; 
} 

my $rc = new Asterisk::config (file=>'/etc/asterisk/sip.conf',keep_resource_array=>0); 
@list = $rc->fetch_sections_list(); 
$n = 1; 
foreach (@list) 
{ 
    if ($_ ne "general") { 

     $entry = $rc->fetch_keys_hashref(section=>$_); 
     while (my ($key, @value) = each(%$entry)) 
     { 
      if ($key eq "callerid") { 
       @vars = split('<',$value[0][0]); 
       $query = "insert into directory (extension,name,hub) values (" . trim($_) . ", '" . trim($vars[0]) . "', '$hubname') ON DUPLICATE KEY UPDATE hub='$hubname'"; 
       $sth = $dbh->prepare($query); 
       $sth->execute(); 
      } 
     } 
    } 
    $n++; 
} 

現在我得到下面提到的錯誤時,執行它。

DBD :: mysql :: st執行失敗:您的SQL語法錯誤; 檢查對應於您的MySQL服務器版本的使用接近辦公室',「」)ON DUPLICATE密鑰更新轂=「」」位於第1行的行./directory正確的語法手動39.

我也用完全相同的MySQL版本替換了它。

請指導我。

+2

聽起來像你有一個語法錯誤。請編輯您的問題並顯示執行數據庫查詢的Perl代碼。有可能它不使用佔位符,但直接在SQL字符串中插入輸入。如果輸入中包含未轉義的字符,或者可能完全丟失,因爲沿途出現其他問題,那可能是原因。請參閱https://xkcd.com/327/。另一個原因可能是表DDL缺少查詢所指的唯一/主鍵。 – simbabque

+0

完成但相同的代碼適用於所有其他服務器。 – Sherjeel

+0

請編輯您的問題以顯示'。/ directory'的前80行。有人猜測,代碼會將變量插入SQL語句中,而不是像它應該那樣使用佔位符,並且其中一個變量中的字符串包含單引號,從而拋出SQL中的引用。理想情況下,您應該更改代碼來使用佔位符,但是在插入它們之前,您可以逃避字符串中的任何引號字符。 – Borodin

回答

1

謝謝你的代碼。正如我懷疑的那樣;你真的不應該直接將值插入SQL語句

更改行37,38,和39到這一點,它應該爲你工作

$query = 'INSERT INTO directory (extension, name, hub) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE hub = ?'; 
$sth = $dbh->prepare($query); 
$sth->execute(trim($_), trim($vars[0]), $hubname, $hubname); 

要注意的是同樣的問題可能存在於其他地方的代碼庫,所以它應該完全審查

+0

謝謝你的錯誤消失了,然而舊的代碼也在插入,儘管有錯誤。 :)謝謝你@Borodin – Sherjeel

相關問題