Je suis un administrateur VOIP et j'ai un script pour mettre à jour la base de données d'annuaire dans Perl qui a été achetée auprès du vendeur avant que je travaille ici.Le script donne une erreur de base de données sur un seul système
Le script fonctionne correctement sur tous les serveurs sauf un.
#!/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++;
}
Maintenant, je reçois l'erreur ci-dessous lors de l'exécution.
DBD :: mysql :: st d'exécution a échoué: Vous avez une erreur dans votre syntaxe SQL; vérifier le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser « Office de l » proche « ») sur le moyeu de DUPLICATE KEY UPDATE = « » » à la ligne 1 à la ligne ./directory 39.
Je l'ai également remplacé à partir d'un autre serveur avec la même version de MySQL où cela fonctionne parfaitement.
Veuillez me guider.
On dirait que vous avez une erreur de syntaxe. S'il vous plaît [modifier] votre question et montrer le code Perl qui fait la requête de la base de données. Il est possible qu'il n'utilise pas d'espace réservé, mais interpole l'entrée directement dans la chaîne SQL. Si l'entrée contient des caractères non échappés ou est manquant complètement parce que quelque chose d'autre se passe mal, cela pourrait être la raison. Voir https://xkcd.com/327/. Une autre raison pourrait être que la table DDL manque la clé unique/primaire à laquelle la requête fait référence. – simbabque
Terminé mais le même code fonctionne sur tous les autres serveurs. – Sherjeel
S'il vous plaît modifier votre question pour afficher les 80 premières lignes de './Directory'. En guise de supposition, le code interpole les variables dans l'instruction SQL au lieu d'utiliser des espaces réservés comme il se doit, et la chaîne contenue dans l'une des variables contient une seule citation qui jette la citation dans le SQL. Idéalement, vous devriez changer le code pour utiliser des espaces réservés à la place, mais vous pourriez vous échapper en échappant à tous les guillemets dans les chaînes avant de les interpoler. – Borodin