Suchformular mit einem oder mehreren (mehreren) Parametern

Lesezeit: 9 Minuten

Suchformular mit einem oder mehreren mehreren Parametern
Jayburg

Ich habe die Grundlagen verstanden, wo ich zwei Dateien erstellt habe, das Suchformular, in das ein Benutzer Suchparameter eingibt, und die Ergebnisdatei, die eingegebene Elemente ausgibt. Der Einfachheit halber bezeichnen wir die Suchformulardatei als search.php und die Ergebnisseite als results.php.

search.php

<?php
    
if (!empty($_POST['id']) && isset($_POST['id'])) {
    header("Location: ?m=search.results&id=".$_POST['id']."");
} elseif (!empty($_POST['major']) && isset($_POST['major'])) {
    header("Location: ?m=search.results&major=".$_POST['major']."");
} elseif (!empty($_POST['college']) && isset($_POST['major'])) {
    header("Location: ?m=search.results&college=".$_POST['college']."");
} elseif (!empty($_POST['name']) && isset($_POST['name'])) {
    header("Location: ?m=search.results&name=".$_POST['name']."");
} elseif (!empty($_POST['id']) && !empty($_POST['college']) && !empty($_POST['major'])
                            && isset($_POST['submit']) && !empty($_POST['name'])) {
    echo "<div class="alert alert-danger">No students found. Please try different parameters.</div>";
}

?>


<h4>Search</h4>

<form method="POST">
    <table width="100%">

<tr><td>ID:</td><td> <input type="text" name="id" class="form-control"></textarea></td></tr>

<tr><td>Name:</td><td> <input type="text" name="name" class="form-control"></textarea></td></tr>

<tr><td>Major:</td><td><select name="major" class="form-control"><option></option><?php echo majorSelect(); ?></select></td></tr>

    <tr><td>College:</td><td><select name="college" class="form-control"><option></option><?php echo collegeSelect(); ?></select></td></tr>

<tr><td colspan="2"><input type="submit" name="submit" value="Search" class="btn btn-lrg btn-primary" style="margin-top:10px;"></td></tr>

    </table>
</form>

Ergebnisse.php

<!-- Begin Search Parameters -->

<?php

if (isset($_GET['id'])) {
    $students = $db->query("SELECT * FROM `user_details` a, `user` b WHERE a.uid = b.id AND a.uid = '".$_GET['id']."'");
    
    while ($student = $students->fetch()) {
        echo '
            <tr>
                <td>'.$student['uid'].'</td>
                <td>'.$student['name'].'</td>
                    <td>'.$student['major'].'</td>
                    <td>'.$student['college'].'</td>
                <td><a href="?m=profile&id='.$student['id'].'" style="display:block">View</a></td>
                
            </tr>';
    }
} elseif (isset($_GET['major'])) {
    $students = $db->query("SELECT * FROM `user_details` a, `user` b WHERE a.uid = b.id AND a.major="".$_GET["major']."'");
        
    while ($student = $students->fetch()) {
        echo '
            <tr>
                <td>'.$student['uid'].'</td>
                <td>'.$student['name'].'</td>
                    <td>'.$student['major'].'</td>
                    <td>'.$student['college'].'</td>

                <td><a href="?m=profile&id='.$student['id'].'" style="display:block">View</a></td>
                
            </tr>';
    }
} elseif (isset($_GET['college'])) {
    $students = $db->query("SELECT * FROM `user_details` a, `user` b WHERE a.uid = b.id AND a.college="".$_GET["college']."'");
        
    while ($student = $students->fetch()) {
        echo '
            <tr>
                <td>'.$student['uid'].'</td>
                <td>'.$student['name'].'</td>
                    <td>'.$student['major'].'</td>
                    <td>'.$student['college'].'</td>
                <td><a href="?m=profile&id='.$student['id'].'" style="display:block">View</a></td>
                
            </tr>';
    }
} elseif (isset($_GET['name'])) {
    $name = $_GET['name'];
        
    $students = $db->query("SELECT * FROM `user_details` a, `user` b WHERE a.uid = b.id AND b.name LIKE '%". $name . "%'");
        
    while ($student = $students->fetch()) {
        echo '
            <tr>
                <td>'.$student['uid'].'</td>
                <td>'.$student['name'].'</td>
                    <td>'.$student['major'].'</td>
                    <td>'.$student['college'].'</td>
                <td><a href="?m=profile&id='.$student['id'].'" style="display:block">View</a></td>
                
            </tr>';
    }
}    

Im Wesentlichen möchte ich das Obige also umschreiben, wobei ein Benutzer einen oder mehrere Parameter eingeben kann und das gewünschte Ergebnis zurückgegeben wird (z. B. sowohl Name als auch Hochschule – &name=x&hochschule=y ODER alle Elemente, falls erforderlich).

  • Kannst du bitte deinen Code neu formatieren? Es ist extrem schwer zu lesen, wenn Sie seltsame Einrückungen + PHP-Open- und Close-Tags haben, die scheinbar zufällig platziert sind

    – Tivie

    7. März 2015 um 0:06 Uhr

  • Verwenden Sie PDO oder MySQLI?

    – Barmar

    7. März 2015 um 0:12 Uhr

  • @tivie Code und Tab-Etikette aufgeräumt. Siehe Änderungen.

    – Jayburg

    7. März 2015 um 0:26 Uhr

Suchformular mit einem oder mehreren mehreren Parametern
Barmar

Dies ist am einfachsten, wenn Sie PDO und nicht mysqli als Ihre Datenbank-API verwenden.

Bauen Sie die WHERE Klausel dynamisch. Mein empfohlener Ansatz besteht darin, jede Bedingung auf ein Array zu schieben und dann zu verwenden implode() um alle Bedingungen zu verketten und sie mit zu verbinden AND oder OR wie es Ihre Präferenz ist.

$wheres = array();
$params = array();
if (!empty($_GET['id'])) {
    $wheres[] = 'a.uid = :uid';
    $params[':uid'] = $_GET['id'];
}
if (!empty($_GET['major'])) {
    $wheres[] = 'a.major = :major';
    $params[':major'] = $_GET['major'];
}
if (!empty($_GET['name'])) {
    $wheres[] = 'b.name LIKE :name';
    $params[':name'] = '%'.$_GET['name'].'%';
}
// And so on for all parameters

$sql = "SELECT * 
        FROM user_details AS a
        JOIN user AS b ON a.uid = b.id";
if (!empty($wheres)) {
    $sql .= " WHERE " . implode(' AND ', $wheres);
}
$stmt = $db->prepare($sql);
$stmt->execute($params);

Zeigen Sie dann die Ergebnisse wie in Ihrem ursprünglichen Code an.

while ($student = $stmt->fetch()) {
    ...
}

  • Danke für Ihre Hilfe. Siehe meinen Kommentar zu seinem Beitrag unten. Ich glaube, ich bin fast am Ziel, aber mache ich etwas falsch?

    – Jayburg

    7. März 2015 um 1:43 Uhr

  • Ich benutze mysqli, ich habe diesen Code ausprobiert, aber wann $wheres[] leer ist bekomme ich eine Fehlermeldung execute() expects 0 params und wann $wheres[] nicht leer ist, dann ist der Fehler eine SQL-Syntax

    – Schmiermittel

    27. Januar um 13:52 Uhr

  • Diese Antwort ist für PDO, nicht für mysqli. Mit mysqli ist das nicht so einfach.

    – Barmar

    27. Januar um 17:12 Uhr

1646920447 540 Suchformular mit einem oder mehreren mehreren Parametern
phpmeh

Wenn Sie nichts in der Datenbank ändern wollen – Sie wählen nur aus – fahren Sie fort und verwenden Sie GET anstelle von POST. Der Vorteil davon ist, dass Sie die URL als Suchzeichenfolge speichern können. Sie können die Suche auch aktualisieren, ohne die Benachrichtigung zum erneuten Senden des Beitrags zu erhalten. Sie möchten nur sicherstellen, dass Sie Ihre Werte parametrisieren, bevor Sie sie an die Datenbank senden. Normalerweise würde ich diese Werte über Bereinigungsfunktionen senden, z. B. eine Regex, die sicherstellt, dass Sie nur Buchstaben haben, wenn Sie Buchstaben erwarten, oder Zahlen, wenn Sie Zahlen erwarten.

Auf derselben Seite (alle suchen): (Ich werde dies nur für Sie skizzieren.)

<form action="<?= $_SERVER["REQUEST_URI"]; ?>" method="GET">
    <input name="major" value="<?= $_GET["major"]; ?>" />
    <select name="college">
        <option value="1" <?PHP if( $_GET["college"] == 1 ) echo 'selected="true"'; ?>>Business</option>
    </select>
</form>

<?PHP
if( ! empty( $_GET ) ){
    if (isset($_GET['major'])) {
       $wheres[] = 'a.major = :major';
       $params[':major'] = $_GET['major'];
    }
    if (isset($_GET['name'])) {
       $wheres[] = 'b.name LIKE :name';
       $params[':name'] = '%'.$_GET['name'].'%';
    }
    // And so on for all parameters

    $sql = "SELECT * 
        FROM user_details AS a
        JOIN user AS b ON a.uid = b.id";
    if (!empty($wheres)) {
        $sql .= " WHERE " . implode(' AND ', $wheres);
    }
    $stmt = $db->prepare($sql);
    $stmt->execute($params);
}
?>

Jetzt können Sie Ihre Daten anzeigen.

Bearbeiten: Ich habe die andere Hälfte der Antwort geschrieben, und dann hat er die 2. Hälfte geschrieben, also habe ich sie einfach aufgenommen …

Außerdem wäre die nächste Stufe der Raffinesse darin, das PHP aus der Suchdatei zu entfernen und es in eine andere Datei zu packen. Wenn Sie in Ihrem Formular auf die Suchschaltfläche klicken, würden Sie AJAX verwenden, um die PHP-Elemente aufzurufen. Dann würde die PHP-Datei die Ergebnisse über Ajax zurückgeben. Sie könnten entweder das vorformatierte HTML oder JSON zurückgeben und etwas wie JQuery es für Sie anzeigen lassen.

  • Die Abfrage wird nun dynamisch generiert. Fantastisch. Vielleicht mache ich etwas falsch, weil print_r mir Folgendes gibt: PDOStatement Object ( [queryString] => AUSWÄHLEN * VON user_details ein VERBINDEN user b ON a.uid = b.id WHERE a.major = :major ) .. aber es scheint nichts abzurufen.

    – Jayburg

    7. März 2015 um 1:37 Uhr

  • Hast du eine Schleife while($student = $stmt->fetch())?

    – Barmar

    7. März 2015 um 1:45 Uhr

  • Ich habe keine Ahnung, was ich falsch gemacht habe, aber es funktioniert jetzt @Barmar. Nochmals vielen Dank für Ihre Hilfe, mein lieber Herr.

    – Jayburg

    7. März 2015 um 1:54 Uhr

  • @Barmar Es lohnt sich, Ihre Antwort zu ergänzen, falls die Leute dies versuchen. Ich habe keine Daten zurückerhalten, wenn leere Formularfelder gesendet wurden. Vielleicht ist es das, was ich getan habe, aber ich habe Folgendes zu den isset-Bedingungen hinzugefügt und alles ist gut, funktioniert wie ein Zauber.. if (isset($_GET[‘major’]) && !leer($_GET[‘major’])) { $wo[] = ‘a.major = :major’; $parameter[‘:major’] = $_GET[‘major’];

    – Jayburg

    7. März 2015 um 2:09 Uhr

  • isset ist wahr, solange die Variable auf irgendetwas gesetzt ist, selbst wenn sie auf den leeren String gesetzt ist. Beachten Sie, dass empty gilt für eine Variable, die auf gesetzt ist 0, verwenden Sie das also nicht für Variablen, die Zahlen enthalten können. Auch wenn Sie verwenden !emptymüssen Sie nicht testen isset Erstens tut es das automatisch.

    – Barmar

    7. März 2015 um 13:07 Uhr

988140cookie-checkSuchformular mit einem oder mehreren (mehreren) Parametern

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy