Net::MySQL Select will nicht wie ich will

Net::MySQL Select will nicht wie ich will

am 26.12.2007 20:17:48 von mail4lano

Hallo again,

Ich benutze das Modul Net::MySQL um daten in eine Tabelle zu bekommen.
Nun möchte ich nicht das dauernd doppelte einträge geschrieben werden.
Das versuche ich mit

$mysql->query('SELECT ID FROM emails WHERE email Like "\%'.$email.'\%");
if ($mysql->has_selected_record){
} else {
$mysql->query('INSERT INTO emails (email) VALUES ("'.$email.'")');
}

zu umgehen. Zu meiner ernüchterung pasiert da allerdings nichts.
Ich hab schon alle gefundenen Beispiele die mir Google und Co lieferten
durch. Bei einigen bleibt das Script bei der SQL abfrage hängen bei
anderen wird mein vorhaben ignoriert.

Irgendwie ist das heute nicht meine Woche, mein Monat oder Jahr.
So blöd kann man doch nicht sein, der entscheidene Hinweis muss doch
irgendwo zu finden sein?

Könnt mich da vielleicht jemand mal ganz feste mit der Nase drauf stupsen ?

Vielen Dank auch -Sven-

Re: Net::MySQL Select will nicht wie ich will

am 27.12.2007 10:38:09 von sheinrich

On Dec 26, 8:17 pm, Sven Mönnich wrote:
> Hallo again,
>
> Ich benutze das Modul Net::MySQL um daten in eine Tabelle zu bekommen.
> Nun möchte ich nicht das dauernd doppelte einträge geschrieben werden.=

> Das versuche ich mit
>
> $mysql->query('SELECT ID FROM emails WHERE email Like "\%'.$email.'\%");
> if ($mysql->has_selected_record){} else {
>
> $mysql->query('INSERT INTO emails (email) VALUES ("'.$email.'")');
>
> }
>
> zu umgehen. Zu meiner ernüchterung pasiert da allerdings nichts.
> Ich hab schon alle gefundenen Beispiele die mir Google und Co lieferten
> durch. Bei einigen bleibt das Script bei der SQL abfrage hängen bei
> anderen wird mein vorhaben ignoriert.
>
> Irgendwie ist das heute nicht meine Woche, mein Monat oder Jahr.
> So blöd kann man doch nicht sein, der entscheidene Hinweis muss doch
> irgendwo zu finden sein?
>
> Könnt mich da vielleicht jemand mal ganz feste mit der Nase drauf stupse=
n ?
>
> Vielen Dank auch -Sven-

Hallo Sven!

use strict;
use warnings;

Benutze das Error-Checking der verwendeten Module und pruefe immer die
Rueckgabewerte der Methoden.

Du hast das Quoting bei Perl noch nicht verstanden. Innerhalb single
quotes wird _nicht_ interpoliert.

Probiere folgendes:
#$email =3D "sven@foo.bar"; <- gibt eine Warnung. Warum?

$email =3D 'sven@foo.bar'; # <- tut das Gewuenschte

# Die folgende (von dir uebernommene) Zeile hat einen Syntax-Fehler
und kann schon deshalb nicht kompiliert werden.
# Finde ihn heraus und korrigiere ihn
my $test =3D 'SELECT ID FROM emails WHERE email Like "\%'.$email.'\%";

print $test, "\n";

Ausserdem ist es wahrscheinlich auch eine falsche MySQL-Syntax. In
Oracle muessen Literale jedenfalls in single quotes gepackt werden,
nicht in double quotes, wie du es zu tun versuchst. Das waeren dann
bei Oracle Bezeichner.

Ich kenne Net::MySQL nicht, aber wenn es die Verwendung von Bind-
Parametern unterstuetzen sollte, dann benutze diese.
Besonders, wenn du das selbe Select-Statement innerhalb eines
Programmaufrufs mehrfach aufrufen willst (mit wechselnden Parametern).
Oder benutze gleich DBI.

Vor allem, tu dir den Gefallen und platziere als erste Anweisungen in
_jedes_ script:
use strict;
use warnings;

Und lese!
Zum Quoting in Perl gibt es wesentlich mehr zu sagen, als die
Unterschiede von Single und Double Quotes.
Du hast mit Sicherheit irgendeine perldoc zur Verfuegung.
Guck da rein, oder suche bei Google nach
perl quoting


Gruesse und guten Rutsch,
Steffen

Re: Net::MySQL Select will nicht wie ich will

am 27.12.2007 12:18:58 von Christian Kirsch

sheinrich@my-deja.com schrieb:
> On Dec 26, 8:17 pm, Sven Mönnich wrote:
>> Hallo again,
>>
>> Ich benutze das Modul Net::MySQL um daten in eine Tabelle zu bekommen.
>> Nun möchte ich nicht das dauernd doppelte einträge geschrieben werden.
>> Das versuche ich mit
>>
>> $mysql->query('SELECT ID FROM emails WHERE email Like "\%'.$email.'\%");
>> if ($mysql->has_selected_record){} else {
>>
>> $mysql->query('INSERT INTO emails (email) VALUES ("'.$email.'")');
>>
>> }
>>

Warum benutzt Du nicht einen UNIQUE-Index on $email? Dann verhindert die
Datenbank automagisch... Außerdem ist fraglich, dass ein "LIKE %bla%"
wirklich tut, was Du willst. Denn damit suchst Du nach "blablub",
"blubblablub" und "bla" - das hat also gar nichts mit "eindeutig" oder
"nicht doppelt" zu tun.


>> zu umgehen. Zu meiner ernüchterung pasiert da allerdings nichts.
>> Ich hab schon alle gefundenen Beispiele die mir Google und Co lieferten
>> durch. Bei einigen bleibt das Script bei der SQL abfrage hängen bei
>> anderen wird mein vorhaben ignoriert.
>>

"bleibt hängen" ist nicht übermäßig hilfreich als Fehlermeldung... Was
passiert denn, wenn Du das Gewünschte (was immer es ist) in mysql (dem
Kommandozeilen-Client) eingibst?

> Ausserdem ist es wahrscheinlich auch eine falsche MySQL-Syntax. In
> Oracle muessen Literale jedenfalls in single quotes gepackt werden,
> nicht in double quotes, wie du es zu tun versuchst. Das waeren dann
> bei Oracle Bezeichner.

Das ist MySQL i.d.R. wurscht.

>
> Ich kenne Net::MySQL nicht, aber wenn es die Verwendung von Bind-
> Parametern unterstuetzen sollte, dann benutze diese.

Ich kenne es auch nicht, vermute aber, dass es direkt auf dem Protokoll
von MySQL aufsetzt. M.E. sollte man gute Gründe haben, sowas statt DBI
in einer Anwendung zu benutzen.

> Besonders, wenn du das selbe Select-Statement innerhalb eines
> Programmaufrufs mehrfach aufrufen willst (mit wechselnden Parametern).
> Oder benutze gleich DBI.
>
ACK.

> Und lese!

s/ese/ies/

Re: Net::MySQL Select will nicht wie ich will

am 27.12.2007 17:21:10 von mail4lano

sheinrich@my-deja.com schrieb:
> On Dec 26, 8:17 pm, Sven Mönnich wrote:
>> Hallo again,
>>
>> Ich benutze das Modul Net::MySQL um daten in eine Tabelle zu bekommen.
>> Nun möchte ich nicht das dauernd doppelte einträge geschrieben werden.
>
> Hallo Sven!
>
> use strict;
> use warnings;
>
> Benutze das Error-Checking der verwendeten Module und pruefe immer die
> Rueckgabewerte der Methoden.

Hab ich alles schon versucht, zeigt nix an. Bleibt einfach hängen an der
Stelle.

>
> Du hast das Quoting bei Perl noch nicht verstanden. Innerhalb single
> quotes wird _nicht_ interpoliert.

Das hab ich bei google gefunden, ich hab auch nicht dran geglaubt aber
ein versuch schadet ja nicht, ich war dermaßen gefrußtet das ich einfach
alles ausprobiert habe.

>
> Probiere folgendes:
> #$email = "sven@foo.bar"; <- gibt eine Warnung. Warum?
>
> $email = 'sven@foo.bar'; # <- tut das Gewuenschte
>
> # Die folgende (von dir uebernommene) Zeile hat einen Syntax-Fehler
> und kann schon deshalb nicht kompiliert werden.
> # Finde ihn heraus und korrigiere ihn
> my $test = 'SELECT ID FROM emails WHERE email Like "\%'.$email.'\%";
>
> print $test, "\n";
>
> Ausserdem ist es wahrscheinlich auch eine falsche MySQL-Syntax. In
> Oracle muessen Literale jedenfalls in single quotes gepackt werden,
> nicht in double quotes, wie du es zu tun versuchst. Das waeren dann
> bei Oracle Bezeichner.
>
> Ich kenne Net::MySQL nicht, aber wenn es die Verwendung von Bind-
> Parametern unterstuetzen sollte, dann benutze diese.
> Besonders, wenn du das selbe Select-Statement innerhalb eines
> Programmaufrufs mehrfach aufrufen willst (mit wechselnden Parametern).
> Oder benutze gleich DBI.

Genau das hab ich gemacht, Modul DBI und es funktionierte auf anhieb.


>
> Vor allem, tu dir den Gefallen und platziere als erste Anweisungen in
> _jedes_ script:
> use strict;
> use warnings;

ich platziere #!/usr/bin/perl -w
sollte doch aufs selbe hinauslaufen oder ?

>
> Und lese!
> Zum Quoting in Perl gibt es wesentlich mehr zu sagen, als die
> Unterschiede von Single und Double Quotes.
> Du hast mit Sicherheit irgendeine perldoc zur Verfuegung.
> Guck da rein, oder suche bei Google nach
> perl quoting

Ich habe ungelogen einen ganzen Tag alles ausprobiert was funktionieren
könnte, selbst sachen bei denen ich der meinung war das es mit
sicherheit nicht funktioniert. Es hat alles nichts geholfen.

Kurz bevor ich den PC aus dem Fenster donnern wollte hab ich dann DBI
versucht. Da hat es sofort funktioniert. Warum weiß ich nicht.

>
>
> Gruesse und guten Rutsch,
> Steffen

Danke, ebenso einen guten Rutsch - rutsch nur nicht aus ;)

-Sven-

Re: Net::MySQL Select will nicht wie ich will

am 27.12.2007 17:31:07 von mail4lano

Christian Kirsch schrieb:
> sheinrich@my-deja.com schrieb:
>> On Dec 26, 8:17 pm, Sven Mönnich wrote:
>>> Hallo again,
>>>
>>> Ich benutze das Modul Net::MySQL um daten in eine Tabelle zu bekommen.
>>> Nun möchte ich nicht das dauernd doppelte einträge geschrieben werden.
>>> Das versuche ich mit
>>>
>>> $mysql->query('SELECT ID FROM emails WHERE email Like "\%'.$email.'\%");
>>> if ($mysql->has_selected_record){} else {
>>>
>>> $mysql->query('INSERT INTO emails (email) VALUES ("'.$email.'")');
>>>
>>> }
>>>
>
> Warum benutzt Du nicht einen UNIQUE-Index on $email? Dann verhindert die
> Datenbank automagisch... Außerdem ist fraglich, dass ein "LIKE %bla%"
> wirklich tut, was Du willst. Denn damit suchst Du nach "blablub",
> "blubblablub" und "bla" - das hat also gar nichts mit "eindeutig" oder
> "nicht doppelt" zu tun.

Das ist schon richtig, bei dem was in $email steht ist es allerdings
schnuppe ob noch irgendwas davor oder dahinter steht. Aber danke für den
Tip.

>
>
>>> zu umgehen. Zu meiner ernüchterung pasiert da allerdings nichts.
>>> Ich hab schon alle gefundenen Beispiele die mir Google und Co lieferten
>>> durch. Bei einigen bleibt das Script bei der SQL abfrage hängen bei
>>> anderen wird mein vorhaben ignoriert.
>>>
>
> "bleibt hängen" ist nicht übermäßig hilfreich als Fehlermeldung... Was
> passiert denn, wenn Du das Gewünschte (was immer es ist) in mysql (dem
> Kommandozeilen-Client) eingibst?

Nunja bleibt hängen sollte einfach heißen das das script einfach an der
stelle nicht weitermacht, es bleibt einfach stehn, ohne fehlermeldungen
oder sonstigen ausgaben. Im mysql client funktioniert es alles wunderbar.

>
>> Ausserdem ist es wahrscheinlich auch eine falsche MySQL-Syntax. In
>> Oracle muessen Literale jedenfalls in single quotes gepackt werden,
>> nicht in double quotes, wie du es zu tun versuchst. Das waeren dann
>> bei Oracle Bezeichner.

Das war so ziemlich der letzte Stand den ich gepostet habe.
Ich habe einfach alle Möglichkeiten die ich irgendwie bei Google und Co.
gefunden habe ausprobiert.

>
> Das ist MySQL i.d.R. wurscht.
>
>> Ich kenne Net::MySQL nicht, aber wenn es die Verwendung von Bind-
>> Parametern unterstuetzen sollte, dann benutze diese.
>
> Ich kenne es auch nicht, vermute aber, dass es direkt auf dem Protokoll
> von MySQL aufsetzt. M.E. sollte man gute Gründe haben, sowas statt DBI
> in einer Anwendung zu benutzen.

Da kann ich Dir auch keinen grund für nennen, es war das erste modul was
ich bei cpan gefunden habe. Ist das erste mal das ich mit Perl was mit
MySQL mache. Ich habe jetzt DBI genommen und es hat auf anhieb funktioniert.

-Sven-

Re: Net::MySQL Select will nicht wie ich will

am 04.01.2008 10:53:50 von Werner Eberl

"Sven Mönnich" schrieb im Newsbeitrag
news:5ti1nhF1djo5aU1@mid.uni-berlin.de...
> >> Ich benutze das Modul Net::MySQL um daten in eine Tabelle zu bekommen.
> >> Nun möchte ich nicht das dauernd doppelte einträge geschrieben werden.
> Hab ich alles schon versucht, zeigt nix an. Bleibt einfach hängen an der
> Stelle.
>
Hallo beisammen,
das Modul Net::MySQL hat wohl wirklich einen Fehler. Bei mir haengt
das Programm auch beim Select. Wenn man die Sache mit debug laufen
laesst, sieht man, dass der MySQL-Server die Daten schon geliefert hat.
Aber das Modul rueckt sie nicht raus.
Mit DBI hat man dieses Problem nicht, aber die Geschichte, dass
Net::MySQL ein reines Perl-Modul ist, ist schon reizvoll, weil die
Installation oder der Upgrade von DBI und DBD::MySQL auch nicht
ueberall trivial ist.
Deshalb meine Frage: Hat irgendjemand Net::MySQL in letzter Zeit mal
erfolgreich mit einem MySQL-Server 5.x benutzt?
Wenn nein, muss ich wohl dem Autor von Net::MySQL man schreiben.
CU,
Werner

Re: Net::MySQL Select will nicht wie ich will

am 04.01.2008 13:40:49 von Werner Eberl

Hallo beisammen,
ich hab etwas gestöbert in
http://rt.cpan.org/Public/Bug/Display.html?id=21508
und habe herausgefunden, dass wenn man in Net/MySQL.pm in Zeile 459:
return substr($_[0], -5) ne "\xfe\0\0\x22\x00"
ersetzt durch:
return substr($_[0], -5) !~ qr/(\xfe\0\0\x22\x00|\xfe\0\0\x02\x00)/
dass es dann wunderbar funktioniert.
In der Doku von Net::MySQL ist noch ein kleiner Fehler:
get_field_names() ist eine Methode von Net::MySQL::RecordIterator
Vielleicht hilft das ja einem von Euch.
CU,
Werner

Re: Net::MySQL Select will nicht wie ich will

am 04.01.2008 14:00:07 von Frank Seitz

Werner Eberl wrote:

> ich hab etwas gestöbert in
> http://rt.cpan.org/Public/Bug/Display.html?id=21508
> und habe herausgefunden, dass wenn man in Net/MySQL.pm in Zeile 459:
> return substr($_[0], -5) ne "\xfe\0\0\x22\x00"
> ersetzt durch:
> return substr($_[0], -5) !~ qr/(\xfe\0\0\x22\x00|\xfe\0\0\x02\x00)/
> dass es dann wunderbar funktioniert.

Das lässt sich auch weniger krautig ausdrücken:

return substr($_[0], -5) !~ /\xfe\0\0[\x22\x02]\0/;

(ungetestet)

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel