2016-03-31 13 views
0

Ich habe eine einfache SELECT-Anweisung:MySQL Select Count auf VARCHAR in PERL

$sql = "SELECT count(*) FROM member_temp WHERE member_Id = '".trim($id)."'"; 

Die member_Id Spalte ist ein VARCHAR (25) NOT NULL

Dies funktioniert gut, bis die SELECT auf eine member_id bekommt, dass hat einen Alpha-Wert, wie 1126A. Es wirft dann den Fehler

Could not prepare SQL statement:SELECT count(*) FROM member_temp WHERE member_Id = '1126A'

Als Test ich diesen Eintrag zu entfernen und die SELECT läuft gut, bis der nächste Wert mit einem A.

Wie kann ich diese Abfrage ausführen und Datensätze mit einem Alpha-Zeichen verarbeiten?

Dies ist Teil eines größeren Codeblock, der aus dem Hauptelement Tabelle gefunden löscht Datensätze nicht:

while (@data = $sth->fetchrow_array()) { 

    my $id = $data[2]; 
    my $pk = $data[0]; 

    $sql = "SELECT count(*) FROM member_temp WHERE member_Id = '" . trim($id) . "'"; 
    #print "$sql\n"; 

    my $xth = $dbh->prepare($sql); 
    $xth->execute(); 

    $cRows = $xth->fetchrow_array() || die "Could not prepare SQL statement:$sql"; 
    #print "$cRows\n"; 

    if ($cRows == 0) { 
     $sql = "DELETE FROM member WHERE sys_Id = " . $pk; 
     $xth = $dbh->prepare($sql); 
     $xth->execute(); 
     $cnt_del++; 
    } 
+1

Versuchen Sie die Abfrage direkt in SQL-Ausführung und gibt die Antwort –

+2

, die nicht wirklich die Art und Weise ist zu * vorbereiten * eine Anfrage; Können wir Ihren Code sehen? Dies sollte überhaupt kein Problem verursachen. Problem liegt woanders –

+0

Es wird erfolgreich abgeschlossen und gibt einen Wert von 0 –

Antwort

2

Ok, das ist Perl jetzt beantworten :)

Es gibt nichts mit Ihrer Anfrage falsch ist (mit der Ausnahme, dass Anweisungen nicht korrekt vorbereitet werden und Sie die Zeichenfolgeninterpolation verwenden).

In den Kommentaren, sagte Sie, wenn diese Abfrage direkt

ausgeführt wird

It completes successfully and returns a value of 0

Dann in Ihrem Code Sie eine Bedingung haben, die

$cRows = $xth->fetchrow_array() || die "Could not prepare SQL statement:$sql"; 

falsch Das heißt, selbst wenn die Abfrage korrekt ausgeführt, sondern hat 0 Zeilen, sollte es Ihnen zeigen, dass Fehlermeldung, die nicht richtig ist.

Also alles, was Sie tun müssen, ist diese Fehlermeldung zu beheben. Dieser Würfel sollte angezeigt werden, wenn die Abfrage nicht ausgeführt werden konnte, nicht wenn sie korrekt ausgeführt wurde, aber keine Ergebnisse hat.

Sie können Ihre Abfrage wie

$sql = "SELECT count(*) FROM member_temp WHERE member_Id = ?"; 
$xth = $dbh->prepare($sql); 
$xth->execute($id) or die("Failed to execute query:". $xth->errstr); 

korrigieren und die Zeilen überprüfen seine

if ($xth->rows == 0) 
// No match found 
+0

Ich sehe, was Sie meinen, aber ich bekomme immer noch einen Fehler: DBD :: mysql :: st ausführen fehlgeschlagen: mit 1 aufgerufen bind Variablen wenn 0 –

+0

Thrn Sie wahrscheinlich nicht Abfrage nach diesem Code aktualisieren –

+1

Wenn Sie ['RaiseError'] (https://metacpan.org/pod/DBI#RaiseError) aktivieren, müssen Sie nicht den Erfolg von jedem überprüfen einzelne Methode. – ThisSuitIsBlackNot