Frage

Ich spiele um mit vorbereiteten Anweisungen in PHP / PDO. Die grundlegenden Abfragen funktionieren, um einen Wert zu der WHERE-Klausel übergeben:

$stmt = $db->prepare( 'SELECT title FROM episode WHERE id=:id' );
$stmt->bindParam( ':id', $id, PDO::PARAM_INT );
$id = 5;
$stmt->execute();

Allerdings habe ich eine Situation, wo ich brauche Variablen für die Feldnamen zu übergeben. Diese Abfrage (mit entsprechender Bindung) funktioniert:

SELECT :field FROM episode WHERE id=:id

Dies gibt einen Fehler:

SELECT title FROM :field WHERE id=:id

Dieses keinen Fehler geben, aber gibt keine Zeilen zurück:

SELECT title FROM episode WHERE :field=:id

Also, welche Dinge sollten in vorbereiteten Anweisungen arbeiten? Kann ich Feldnamen, Tabellennamen ‚parametrieren‘ und so weiter?

War es hilfreich?

Lösung

Sie können keine Tabellennamen, Spaltennamen oder irgendetwas in einer IN Klausel (dank c0r0ner die IN Klausel Einschränkung ) Hinweis.

Siehe diese Frage und anschließend dieser Kommentar in dem PHP-Handbuch .

Andere Tipps

@ Josh Leitzel

Das Denken sehr restriktiv ist (und ist meiner Meinung nach nur ein Vorwand für zu faul ist, um eine stabile Lösung zu implementieren), insbesondere für dynamische Baumstrukturen in einer Datenbank zum Ausdruck gebracht.

Betrachten Sie das folgende Beispiel:

Mein Projekt hat eine logische Struktur:

Eine Unternehmenshierarchie ist in Bezug auf die Einheiten ausgedrückt. Jede Einheit kann im allgemeinen Fall behandelt, ein Mitglied der Hierarchie ist, oder als ein Mitglied einer bestimmten Ebene der Hierarchie. Die Hierarchie selbst wird in einer Tabelle als ein einzelnen Baumzweig wie folgt definiert:

entity_structure (
   id
   name
   parent_entity_structure_id
);

und die Entitäten selbst sind wie folgt ausgedrückt:

entities (
   id
   name
   entity_structure_id
   parent_id
);

Zum leichteren Verwendung Ich habe einen Algorithmus eingebaut, die eine flache Ansicht des Baumes erzeugt. Das folgende konkrete Beispiel zeigt, was ich meine:

SELECT * FROM entity_structure;

id      | name               | entity_structure_parent_id
-----------------------------------------------------------
1       | Company            | null    (special one that always exists)
2       | Division           | 1
3       | Area               | 2
4       | Store              | 3

Dies ist in der folgenden flachen Darstellung führen würde, dass erzeugt:

entity_tree (
   entity_id
   division_id
   area_id
   store_id
)

Unternehmen, die auf der Ebene der Abteilungen sind hätten division_id, area_id und store_id als NULL, ein Bereich area_id und store_id als NULL, etc.

Das Schöne daran ist, es Ihnen, alle Kinder einer Division mit einer Anweisung ähnlich der Folge abfragen können:

SELECT * FROM entity_tree WHERE division_id = :division_id;

Allerdings setzt dies voraus, dass ich die Strukturebene des Unternehmens weiß, ich bin abfragt. Es wäre schön zu tun:

SELECT * FROM entity_tree WHERE :structure = :entity_id;

Ich weiß, dass es nicht schwer ist, die Strukturebene einer einzigen Einheit, um herauszufinden, aber ich nehme an durch eine Sammlung von Entitäten bin Looping, die nicht alle auf dem gleichen Niveau sein kann. Wie es ist jetzt muss ich für jede Ebene der Hierarchie eine separate Abfrage erstellen, aber wenn ich Felder parametrieren konnte ich könnte folgendes tun:

$children = array();
$stmt = $pdo->prepare('SELECT entity_id FROM entity_tree WHERE :structure = :entityId');
foreach ($entities AS $entity) {
   $stmt->execute(array(
      ':structure' = $entity->getEntityStructureId(),
      ':entityId'  = $entity->getId()
   ));

   $children[$entity->getId()] = $stmt->fetchAll(PDO::FETCH_COLUMN);
}

in saubereren Code resultierende und nur eine vorbereitete Erklärung.

Das gesamte Beispiel verwendet keine Benutzereingaben zu löschen.

Nur etwas zu prüfen.

Sie können nicht alles innerhalb IN Klausel parametrieren auch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top