我是一名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版本替換了它。
請指導我。
聽起來像你有一個語法錯誤。請編輯您的問題並顯示執行數據庫查詢的Perl代碼。有可能它不使用佔位符,但直接在SQL字符串中插入輸入。如果輸入中包含未轉義的字符,或者可能完全丟失,因爲沿途出現其他問題,那可能是原因。請參閱https://xkcd.com/327/。另一個原因可能是表DDL缺少查詢所指的唯一/主鍵。 – simbabque
完成但相同的代碼適用於所有其他服務器。 – Sherjeel
請編輯您的問題以顯示'。/ directory'的前80行。有人猜測,代碼會將變量插入SQL語句中,而不是像它應該那樣使用佔位符,並且其中一個變量中的字符串包含單引號,從而拋出SQL中的引用。理想情況下,您應該更改代碼來使用佔位符,但是在插入它們之前,您可以逃避字符串中的任何引號字符。 – Borodin