2011-01-07 5 views
1
User Form Input - City 
User Form Input - Venue 
User Form Input - Cover 
User Form Input - Time 
User Form Input - Date 
User Form Input - Number1 
User Form Input - Number2 

(falls vorhanden leer sind sie zu ‚*‘ coverted sind auf dem Weg. Aber könnte sein, was auch immer funktioniert.)Perl Mysql - Wie nach bestimmten Daten basierend auf einem "Haupt" -Match suchen?

my $grabgig = $hookup->prepare(qq{SELECT `VenueNumber`,`Venue`,`CoverCharge`,`SetLength`,`City`,`Owner`,`Date`,`Time`,`Image1`,`Number` 

    FROM `gigs` 
    WHERE VenueNumber > ? AND `City` = ? AND `Venue` = ? AND `CoverCharge` = ? 
     AND Date = ? AND `Number` > ? AND `Number` < ? 
     AND `Time` LIKE ? LIMIT ?,?}); 

########################################## 

$grabgig->execute('100',$city,$venue,$cover,'*',$number1,$number2,?,'0','6') 
    or die "Did not execute"; 

, die über ein grundlegendes Beispiel ist.

Ich möchte Ergebnisse basierend auf dem City-Eingang zurückgeben können.

Wenn mehr Eingabe vorhanden ist, werden die Ergebnisse entsprechend eingegrenzt.

Die Abfrage gibt jedoch nichts zurück, wenn Felder leer sind (*).

Ich versuchte Wildcards und so weiter, experimentierte ich mit LIKE und nicht wie.

Diese scheinbar einfache Suche macht mich verrückt.

Kann jemand diesem Neuling helfen?

+0

Sie sollten wirklich lernen, Ihren Code besser zu formatieren. – DVK

+0

Entschuldigung, ich kann nicht sagen, dass ich verstehe, was du versuchst zu tun. Können Sie klarstellen, dass "Ergebnisse basierend auf dem City-Input zurückgegeben werden" und "Wenn mehr Input vorhanden ist, dann die Ergebnisse entsprechend eingrenzen"? – DVK

Antwort

1

OK, ich bin ziemlich unsicher, was du meinst, ABER, mein bestes Unterverständnis von dem, was du zu tun versuchst, ist wie jetzt abzufragen, ABER wenn ein bestimmtes Feld im Formular nicht ausgefüllt ist, um das Hinzufügen zu vermeiden dieses Feld zu der where Klausel; im Gegensatz zur aktuellen Abfrage, die stattdessen and myField="*".

Korrekt?

Wenn das so ist, müssen Sie Ihre Abfrage erstellen, und Ersatzliste, in Stücke:

my $sql = qq{SELECT MY_FIELD_LIST_TOO_LAZY_TO_TYPE FROM `gigs` WHERE 2=2}; 
my @replacement_values =(); # These go into execute() instead of "?"s 
if ($city ne "*") { 
    $sql .= qq[AND city = ?]; 
    push @replacement_values, $city; 
} 
if ($number1 ne "*") { 
    $sql .= qq[AND number > ?]; 
    push @replacement_values, $number1; 
} 

# ... more values processed the same way 

my $grabgig = $hookup->prepare($sql); 
$grabgig->execute(@replacement_values) or die "Did not execute"; 

Wenn Sie es tun wollen intelligent (dh zu verallgemeinern), haben Sie die Formularfelder in ein Hash; haben eine Config-Hash-Mapping der Form Feldnamen in die DB Spaltennamen und dem Betreiber, und stattdessen tun das, wie oben:

my %fields = (
    city => ["city" , "="] 
    ,number1 => ["number", ">"] 
    ,number2 => ["number", "<"] 
); 
my $sql = qq{SELECT MY_FIELD_LIST_TOO_LAZY_TO_TYPE FROM `gigs` WHERE 2=2}; 
my @replacement_values =(); # These go into execute() instead of "?"s 
foreach my $field (keys %form_data) { 
    next unless exists $fields{$field}; 
    if ($form_data{$field} ne "*") { 
     $sql .= qq[ AND $fields{$field}->[0] $fields{$field}->[1] ?]; 
     push @replacement_values, $form_data{$field}; 
    } 
} 
my $grabgig = $hookup->prepare($sql); 
$grabgig->execute(@replacement_values) or die "Did not execute"; 
+0

Wenn nichts vorhanden ist, haben Sie WHERE mit keiner WHERE-Klausel; Ich bevorzuge die Verwendung von 'push @where, $ fields {$ field} ...' in der Schleife und dann 'if (@where) {$ sql. = 'WHERE'. Join ('AND', @where)}' nach, keine Notwendigkeit für $ AND. – ysth

+0

@ysth - yep. Shoulda kopiert nur meinen Standard-Code. Die einfachste Lösung (die mein Arbeitscode in der Regel tut) ist vor "2 = 2". FIxed – DVK

+0

nur 'WHERE 1' funktioniert auch – ysth

0

ich davon aus bin, dass Sie eine Abfrage erstellen wollen, wo nur wenige Eingabeparameter gültig haben Werte und der Rest sind nicht definiert. Wenn Sie das wirklich wollen, können Sie Folgendes tun: Konstruieren Sie die Abfrage dynamisch. Hier sind die Schritte, die Sie nehmen könnten, vorausgesetzt, Sie verwenden CGI.pm und vorausgesetzt, dass die WHERE-Klausel nur eine Reihe von "das = das" ist - In Ihrem Fall haben Sie verschiedene Operatoren - aber die Idee ist die gleiche.

zunächst ein "where" String aus dem CGI-Abfrageparameter (Leider nicht getesteten Code) konstruieren:

my $qrystr = ''; 
foreach ($query->param) { 
    if (my $val = $query->param($_)) { 
     $qrystr .= "where $_ = " . $dbh->quote($val) . ' and '; 
    } 
} 
$qrystr .= "where 1 = 1"; 

Jetzt können Sie einfach erstellen und die Abfrage ausführen: "select * from table $ qrystr"

Wenn Sie die automatische wollen zitieren Sie binden Parameter verwenden, müssen die oben

-Update eine einfache Erweiterung des Codes ist ein fehlendes „where“ in der letzten wahren Klausel „1 = 1“ Es wurde - hinzugefügt Sorry, ich t jetzt

-1

Entschuldigung, die Formatierungsleiste wurde nicht so angezeigt, ich neu gestartet. Jetzt kann ich meine Frage oder meinen Kommentar nicht bearbeiten.

Was ich versuche zu tun ist eine Suche nach den Benutzern.

Sie wählen eine Stadt aus einem Dropdown-Menü, dann können einige optionale Daten eingegeben/ausgewählt werden, um die Ergebnisse einzugrenzen.

Die optionalen Daten Mai oder Mai nicht in der Tabelle vorhanden sein, könnte ein leeres Feld sein.

Ich möchte, dass die Ergebnisse basierend auf den ausgewählten Kriterien der Suche in dieser Stadt angezeigt werden.

Also, wo ausgewählt "Eingabe Stadt" = "Tabellen Stadt Spalte" suchen Sie nach den anderen Optionen (ignorieren Sie diese bestimmten Kriterien, wenn Feld leer ist) und alle Übereinstimmungen, die für diese Stadt existieren.

Ich bin dann drängen in Array in einem While für die Ausgabe anzuzeigen.

Ich denke, es wäre wie eine Autoabfrage. Wählen Sie make, wo Türen = 2 und Farbe = rot und Motor = Hamsterrad, aber das Farbfeld kann in der Datenbank leer sein.

+0

Alter, (1) der Grund, warum Sie nicht kommentieren oder bearbeiten können, ist, weil Sie jetzt eingeloggt sind mit anderen Account als die, die Sie die Frage mit erstellt haben .. – DVK

+0

Warten Sie, nur um zu klären, wenn der Benutzer "Farbe = rot" in das Formular liefert, bin ich richtig, dass Sie alle Autos, die entweder rot oder haben möchten, auswählen NULL Farbe? – DVK

+0

@DVK danke, ich versuche dein Beispiel jetzt .... Ich werde b ack zu dir .. – DulcimerDude

Verwandte Themen