2016-12-15 1 views
1

Ich verwende eine ziemlich komplexe vorbereitete Anweisung mit verschiedenen Bedingungen in der WHERE-Klausel und an einer Stelle brauche ich tatsächlich die gleiche Anweisung mit einer genaueren Bedingung. Das Erstellen von zwei verschiedenen Anweisungen ist ein schlechter Ansatz, da beide die meisten ihrer Abfragezeichenfolgen teilen und wenn ich ein anderes aktualisiere, müsste ich auch das andere aktualisieren. Bisher habe ich versucht, dies mit:Vorbereitete Anweisung mit optionaler Bedingung wiederverwenden

SELECT columns 
FROM tables 
WHERE manyConditions AND (specificColumn = ? OR ? = NULL) 

In diesem Szenario, das ich ein beliebiges Argument binden könnte und NULL die spezifische Voraussetzung nutzlos für Abfragen zu machen, die sie nicht benötigen ($pdo->execute([/* ... */, -1, null])), während nach wie vor von specificColumn filtern zu können, wenn Sie einen richtigen Wert und etwas, das nicht NULL ist, binden ($pdo->execute([/* ... */, 'specific value', true])).

Dies ist eine wirklich schmutzige Möglichkeit, Code-Duplizierung zu verhindern, die mich dazu zwingt, in den meisten Fällen zwei weitere Variablen zu binden.

Gibt es einen eleganteren Ansatz, um Code-Duplizierung zu verhindern?

+0

Bitte hinterlassen Sie etwas konstruktives Feedback verwenden, warum Sie diese Frage ist Downvoting - vielleicht etwas gibt es um es zu verbessern? –

+0

Seien Sie nicht traurig über Downvoting Ich hatte die gleiche Erfahrung und ich bekam nie eine Antwort ... – JosMac

+0

Downvoters das Mindeste, was Sie tun können, ist zu kommentieren –

Antwort

0

Das ist eine sehr gute Frage von einem durchdachten Programmierer.

Ich würde sagen, es gibt keine gleichermaßen elegante und einfache Lösung. Aber ich kann ein paar Ansätze anbieten und Sie können entscheiden, welches für Sie am besten ist.

  1. Sie können benannte Platzhalter verwenden und den Emulationsmodus aktiviert lassen. In diesem Fall müssen Sie jede Variable nur einmal binden. Das gesamte Schreiben bleibt jedoch dasselbe wie bei benannten Platzhaltern. Sie müssen jeden Namen dreimal wiederholen.
  2. Wie es in der nun gelöscht Antwort vorgeschlagen wurde, könnten Sie bedingte Erstellung von Abfragen, so etwas wie

    $sql = "SELECT columns FROM tables WHERE manyConditions"; 
    $params = [$a,$b,$c]; 
    if (!empty($d)) { 
        $sql .= " AND specificColumn = ?"; 
        $params[] = $d; 
    } 
    $stmt = $pdo->prepare($sql); 
    $stmt->execute($params) 
    
Verwandte Themen