ubuntuusers.de

Script hat Probleme mit Umlauten

Status: Ungelöst | Ubuntu-Version: Server 10.04 (Lucid Lynx)
Antworten |

sprudel91

Anmeldungsdatum:
28. Juli 2007

Beiträge: 193

Hallo, ich habe ein Problem mit einem Script das ich im Internet gefunden habe. Die Aufgabe des Scriptes ist es, Kalenderduplikate im Zimbra zu finden, und diese zu entfernen (d.h. erstmal den zimbraeigenen Befehl ausgeben, dieser wird dann aufgefangen und an anderer Stelle ausgeführt). Das Problem an dem Script ist nur, dass es Probleme hat mit Duplikaten die Umlaute enthalten. Hier kommt dann folgende Fehlermeldung:

DBD::mysql::st execute failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Precise Pangolin" erscheint" and a.item_id = b.id order by a.item_id' at line 1 at /opt/zimbra/duplicate2.pl line 41. DBD::mysql::st fetchrow_array failed: fetch() without execute() at /opt/zimbra/duplicate2.pl line 42.

Kennt sich hier vielleicht jemand ausreichend mit Perl aus (ich leider nicht) und kann mir dabei helfen? Das wäre sehr nett.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/usr/bin/perl

use DBI;

$account = $ARGV[0];
$subject = $ARGV[1];
open(PIPE,"zmlocalconfig -s zimbra_mysql_password|");  ($passwd) = <PIPE> =~ /zimbra_mysql_password = (.*)/; close(PIPE);

$dsn = "DBI:mysql:zimbra;mysql_read_default_file=/opt/zimbra/conf/my.cnf;mysql_socket=/opt/zimbra/db/mysql.sock";
$dbh = DBI->connect($dsn, 'zimbra', $passwd) || die "Could not connect to database: $DBI::errstr";


$sql = "select id,group_id from mailbox where comment = '${account}'";
$sth = $dbh->prepare($sql);
$sth->execute();
@result = $sth->fetchrow_array; 
  $mailbox = $result[0];
  $mailbox_group = $result[1];

$sth->finish();
$dbh->disconnect;

my @dupes = (); my @dupes_subject = ();

$dsn = "DBI:mysql:mboxgroup${mailbox_group};mysql_read_default_file=/opt/zimbra/conf/my.cnf;mysql_socket=/opt/zimbra/db/mysql.sock";
$dbh = DBI->connect($dsn, 'zimbra', $passwd) || die "Could not connect to database: $DBI::errstr";

$sql = "select a.start_time, a.end_time, b.subject, count(*) from appointment a, mail_item b ";
$sql = $sql . "where (a.item_id = b.id) and (b.mailbox_id = " . $mailbox . ")";
$sql = $sql . "group by b.subject, a.start_time, a.end_time having count(*) > 1 order by b.subject, a.start_time, a.end_time";

$sth = $dbh->prepare($sql); $sth->execute();

while (($start_time, $end_time, $subject, $count) = $sth->fetchrow_array) {

    $sql = "select a.item_id from appointment a, mail_item b ";
	$sql = $sql . "where a.start_time = '$start_time' and a.end_time = '$end_time' and b.subject = \"$subject\" and a.item_id = b.id ";
	$sql = $sql . "order by a.item_id";

	$dupe = 0;
	$sth2 = $dbh->prepare($sql); $sth2->execute();
	while ($id = $sth2->fetchrow_array) {
	    if ($dupe > 0) { print "zmmailbox -z -m $account deleteitem $id\n"; }
	    $dupe += 1;
    }
    $sth2->finish();
}

$sth->finish();
$dbh->disconnect;

Vielen Dank schonmal im Vorraus ☺

mewis

Anmeldungsdatum:
9. April 2009

Beiträge: 86

Wohnort: Schweiz

Das Problem liegt nicht bei den Umlauten sondern das in einem deiner Betreff's, Hochkomma drin sind (Precise Pangolin" erscheint"), die als solches von MySQL interpretiert werden. Die Lösung wäre ein Backslash vor dem Hochkomma.

1
2
3
4
5
#ersetzte Zeile 37
$sql = $sql . "where a.start_time = '$start_time' and a.end_time = '$end_time' and b.subject = \"$subject\" and a.item_id = b.id ";

#mit folgendem
$sql = $sql . "where a.start_time = '$start_time' and a.end_time = '$end_time' and b.subject = \"$dbh->quote($subject)\" and a.item_id = b.id ";

Ich hoffe das löst dein Problem ☺

sprudel91

(Themenstarter)

Anmeldungsdatum:
28. Juli 2007

Beiträge: 193

Hallo mewis, vielen Dank. Das Problem tritt leider immer noch auf. Hast du noch eine Idee?

Liebe Grüße sprudel91

mewis

Anmeldungsdatum:
9. April 2009

Beiträge: 86

Wohnort: Schweiz

Hallo sprudel91

Schade ich kenne mich leider auch zu wenig mit Perl aus.

Ich würde es mal noch so probieren:

1
2
#Zeile 37
$sql = $sql . "where a.start_time = '$start_time' and a.end_time = '$end_time' and b.subject = '$dbh->quote($subject)' and a.item_id = b.id ";

Kannst du mir bitte die Quelle des Scriptes preisgeben ? Evtl. finde ich dort noch was ☺

sprudel91

(Themenstarter)

Anmeldungsdatum:
28. Juli 2007

Beiträge: 193

Hey mewis, hat sich leider weiterhin nichts verändert. Kann dir die Quelle leider auch nicht mehr nennen, das Script stammt aus irgendeinem Zimbraforum, vielleicht findet sich da ja mit Codeschnipseln noch irgendwie was, ich hab es jedenfalls nicht mehr gefunden :-/ Ist jetzt bei mir etwa 1 Jahr im Einsatz, aber jetzt haben die Duplikate von solchen Einträgen doch etwas überhand genommen. Blödes syncen eben ☺

mewis

Anmeldungsdatum:
9. April 2009

Beiträge: 86

Wohnort: Schweiz

Irgendwie bringen wir das jetzt schon noch hin ☺

Kannst du bitte folgenden Code in dein Original (Perl-Script ohne meine Änderungswünsche) reinkopieren und ausführen:

Nach Zeile 38 einfügen

1
2
3
4
5
#sql logger begin
	open (SQL, '>>sql.txt');
	print SQL $sql . "\n";
	close (SQL); 
#sql logger end 

Nach dem ausführen wird eine Datei (sql.txt) angelegt und mit dem zusammengebauten SQL-Query gefüllt. Vielleicht kann ich so sehen was der MySQL Server nicht mag 😀

Evtl. musst du die Datei sql.txt in selben Verzeichnis wie dein Perl-Script zuerst anlegen.

sprudel91

(Themenstarter)

Anmeldungsdatum:
28. Juli 2007

Beiträge: 193

Ohje, vielen Dank dass du dich dem ganzen annimmst. Das ganze ist noch etwas schwieriger, weil das Script nämlich als Benutzer "zimbra" ausgeführt wird, und der praktisch nirgendwo Schreibrechte hat. Habe es versucht deinen Codewunsch auch schon auf /tmp/sql.txt anzupassen (da kann er schreiben).. tut auch nicht, hast du noch irgendwelche Ideen?

mewis

Anmeldungsdatum:
9. April 2009

Beiträge: 86

Wohnort: Schweiz

Schade 😀 Es ist recht schwierig aus der Ferne und ohne Möglichkeit bei einem Testsystem den Fehler zu reproduzieren.

Ich habe im Wiki von Zimbra ein Tutorial für dein Problem gefunden, vielleicht kann dir das ein bisschen weiter helfen.

Antworten |