2015-04-20 9 views
8

Nehmen wir an, ich möchte Datensätze auswählen, wo Id = 30. Vorbereitete Anweisungen erlauben zwei Möglichkeiten Bindungsparameter:Unterschiede zwischen der Verwendung? und: param in Vorbereitung Anweisung

Fragezeichen

$id = 30; 
$q = $conn->prepare("SELECT * FROM pdo_db WHERE id > ?"); 
$q->execute(array($id)); // Here above ID will be passed 

benannte Parameter

$sth = $conn->prepare("SELECT `id`, `title` FROM `pdo_db` WHERE `id` > :id"); 
$sth->execute(array(
    ':id' => 30 
)); 

Beide arbeiten gut und genaue Ergebnisse geben, aber ich bin nicht in der Lage, die genauen Unterschiede zwischen diesen beiden noch zu erhalten Ich sollte den einen oder anderen benutzen?

Antwort

7

Fragezeichen-Parameter heißen Position Parameter.

Parameter definiert mit : und einem Namen heißen mit dem Namen Parameter.

Die Regel ist, dass Sie die zwei in Ihrer vorbereiteten Aussage nicht mischen können.

Positionsparameter funktionieren auf einfache Weise - wenn Sie zwei Positionsparameter haben, können Sie ein Array mit zwei Elementen angeben. Array-Werte werden in der Reihenfolge gebunden, in der sie im Array angezeigt werden.

Benannte Parameter sind etwas komplizierter, sie müssen nicht gebunden werden, damit sie erscheinen. Sie können einen benannten Parameter auch mehrmals in der Anweisung wiederholen, aber Sie können ihn nur einmal binden, um den Wert zu übergeben. Dieser letzte Teil funktioniert, wenn PDO über $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, TRUE); auf Emulation gesetzt ist.

1

Diese werden verschiedene Platzhalter

? -- > question mark placeholders 
    :name --> named Placeholders 

Der Unterschied zwischen named and question mark placeholders ist, dass mit Platzhalter Fragezeichen Sie darauf achten müssen, werden über die Reihenfolge, in der sie an die Abfrage gebunden werden .

4

Dies ist eher eine Präferenz-basierte Frage, da es keine strikte richtige oder falsche Antwort gibt.

Persönlich vermeide ich ?, da es eng an die Reihenfolge der Parameter gebunden ist. Obwohl Sie theoretisch nicht in der Lage sein sollten, dies zu stören, indem Sie eine einzelne Bindung hinzufügen oder entfernen, scheint es nur, dass es um Ärger geht. Es ist (etwas) weniger Arbeit.

:name ist prägnanter und ist eng an die Identifikation von Bindungen gebunden, nicht beliebig zur Reihenfolge. Es beinhaltet ein (kleines) bisschen mehr Arbeit, aber es ist viel einfacher zu debuggen und weniger anfällig für Fehler.

Ich bevorzuge es, (leicht) prägnant über (etwas) weniger Code zu schreiben.

Verwandte Themen