Hangi belirteçleri ifadeler PDO'de hazırlanabilir parametreli olabilir?

3 Cevap php

PHP / PDO'de hazırlanan tablolar etrafında oynuyorum. Temel sorguları WHERE yan tümcesi bir değer geçirerek, iyi çalışır:

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

Ancak ben alan adları için değişkenleri geçmesi gereken bir durum var. (Bağlama uygun olan) Bu sorgu çalışıyor:

SELECT :field FROM episode WHERE id=:id

Bu bir hata veriyor:

SELECT title FROM :field WHERE id=:id

Bu bir hata verebilir, ama hiçbir satır döndürür değildir:

SELECT title FROM episode WHERE :field=:id

Peki, ne şeyler hazırlanan tablolarda çalışması gerekir? Ben böylece alan adlarını, tablo adlarını ve 'parameterize'?

3 Cevap

@ Josh Leitzel

Bu düşünce çok kısıtlayıcı olduğunu (ve bence sağlam bir çözüm uygulamak için çok tembel olduğu için sadece bir bahane olduğunu) özellikle bir veritabanında ifade dinamik ağaç yapılar için,.

Aşağıdaki örneği inceleyin:

Benim proje mantıksal bir yapıya sahiptir:

Bir şirket hiyerarşi kişilerin cinsinden ifade edilir. Her varlık bir hiyerarşi üyesi veya hiyerarşi belirli bir düzeyde bir üyesi olarak olmanın genel durumda tedavi edebilirsiniz. Aşağıdaki gibi hiyerarşi kendisi, tek bir ağaç dalı gibi bir tablo tanımlanmıştır:

entity_structure (
   id
   name
   parent_entity_structure_id
);

ve kişiler kendilerini ifade edilmektedir:

entities (
   id
   name
   entity_structure_id
   parent_id
);

Kullanım kolaylığı için ağaç düz bir görünüm oluşturur bir algoritma inşa ettik. Aşağıdaki somut örneği ne demek göstermektedir:

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

Bu üretilen aşağıdaki düz temsili neden olur:

entity_tree (
   entity_id
   division_id
   area_id
   store_id
)

Bölünme düzeyde kişiler, division_id var area_id ve NULL, bir alan area_id olarak store_id vb NULL gibi store_id olur

Bu konuda güzel bir şey bunu takip benzer bir ifade kullanarak bir bölünme tüm çocukları sorgulamak sağlar olduğunu:

SELECT * FROM entity_tree WHERE division_id = :division_id;

Ancak bu ben sorgulama ediyorum işletmenin yapı düzeyini bildiğiniz varsayılmaktadır. Bunu yapmak güzel olurdu:

SELECT * FROM entity_tree WHERE :structure = :entity_id;

Ben tek bir varlığın yapı düzeyini anlamaya zor değil biliyorum, ama hepsi aynı düzeyde olmayabilir varlıkların bir koleksiyon döngü ediyorum varsayalım. Şimdi olduğu gibi hiyerarşinin her seviyesi için ayrı bir sorgu oluşturmak zorunda, ama ben alanları parametreleyebilir eğer ben aşağıdakileri yapabilirsiniz:

$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);
}

temiz kod ve sadece bir hazır açıklamada sonuçlanır.

Tüm örnek hiçbir kullanıcı girişi kullanır.

Sadece bir şey düşünün.

Siz de IN tümce içinde bir şey parameterize olamaz.