2017-10-20 39 views
0

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.

+2

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

+0

Terminé mais le même code fonctionne sur tous les autres serveurs. – Sherjeel

+0

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

Répondre

1

Merci pour le code. C'est comme je le soupçonnais; vous devriez vraiment pas insérer des valeurs directement dans une instruction SQL

ligne de changement 37, 38, et 39 à cela et cela devrait fonctionner pour vous

$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); 

Prenez garde que le même problème est susceptible d'exister ailleurs dans la base de code, donc il devrait vraiment être complètement passé en revue

+0

Merci l'erreur est allé mais l'ancien code faisait également un insert malgré l'erreur. :) Merci @Borodin – Sherjeel