Wie ignoriere ich einen Parameter in einer vorbereiteten mysqli-Abfrage in PHP?



(1)

Sie können eine Liste der Kriterien erstellen und die Bindungswerte und -typen zu einer Liste hinzufügen. Hier ist eine kurze Darstellung, in der zwei der Felder verwendet werden, auf die Sie sich beziehen ...

$data = [];
$params = "";
$where = [];
if ( !empty($name)) {
    $data[] = $name;
    $params.="s";
    $where[] = "name like ?";
}
if ( !empty($size)) {
    $data[] = $size;
    $params.="i";
    $where[] = "size < ?";
}
$sql = "SELECT * FROM items";
if ( count($where) > 0 ){
    $sql .= " where ". implode ( " and ", $where);
}
$query = $database->prepare($sql);
$query->bind_param($params, ...$data);
$query->execute();

Beachten Sie, dass bind_param() ... , um Ihnen die Übergabe eines Arrays anstelle der einzelnen Felder zu ermöglichen.

Ich habe eine vorbereitete MySQL-Abfrage wie folgt:

$query = $database->prepare("SELECT * FROM items WHERE inStock > ? AND size < ? AND name LIKE ?");            
$query->bind_param('iis', $inStock, $size, $name);              
$query->execute();  

In der WHERE-Klausel gibt es viele verschiedene Bedingungen, die die Ergebnisse herausfiltern. Das Problem ist, dass diese Parameter in einem Suchformular angegeben werden und nicht obligatorisch sind. Beispielsweise kann eine Person nur mit dem Namen oder nur mit der Größe und dem Namen oder mit der Größe, dem Namen und inStock gleichzeitig suchen.

Ich muss die Abfrage anpassen, damit ich nur die gewünschten Parameter angeben kann. Die einzige Lösung, die ich mir vorstellen kann, besteht darin, eine riesige if..else-Struktur zu erstellen, in der vorbereitete Abfragen mit allen Kombinationen der Suchoptionen vorhanden sind, aber das kommt nicht in Frage, da es Tausende von Kombinationen gibt.

Die einzige realistische Lösung, die ich mir $query .= "AND name LIKE '%".escapestuff($_POST['name'])."%'" kann, wäre die Verwendung einer nicht vorbereiteten Abfrage, bei der ich die Bedingungen mit Teilen wie $query .= "AND name LIKE '%".escapestuff($_POST['name'])."%'"

Das ist aber sehr hässlich und ich würde sehr gerne beim vorbereiteten Abfragesystem bleiben.





mysqli