2013-01-04 16 views
15

Herkese Açık Sitemde Hazırlanmış Bildirimleri kullanmam gerekiyor. BuCodeIgniter'da Hazırlanan Deyimleri Nasıl Kullanabilirim

$sql = "SELECT * FROM tbl_user WHERE uid=:id and activation_key=:key"; 
$query = $this->db->query( 
    $sql, 
    array(':id' => $uid ,':key' => $activation_key) 
); 

'u kullanmayı denedim, ancak bu çalışmıyor. Çalışması :id ve :key ile ? arasında değiştirdiğimde.

cevap

28

CodeIgniter, Hazırlanmış Deyimleri desteklemiyor. Eğer CI Veritabanı sınıf için kaynak kodu bakarsanız, onlar sadece geçirilen bir dizi verilerle soru işaretleri değiştirerek bağlantıları çözmek olduğunu göreceksiniz:

Onlar sadece Sorgu Bağlama desteklemek adsız yer tutucularla. http://ellislab.com/codeigniter/user-guide/database/queries.html

Sorgu Bağlar

Bağlar sistem sizin için bir araya sorgular koymak izin vererek sorgu sözdizimi basitleştirmek sağlayacak bakın. Aşağıdaki örneği ele alalım: sorguda

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?"; 
$this->db->query($sql, array(3, 'live', 'Rick')); 

soru işaretleri otomatik sorgu işlevi ikinci parametresine dizideki değerlerle değiştirilir. CI hazırlanmış deyimleri desteklemez olsa

ve

http://ellislab.com/forums/viewthread/105112/#528915, bu Sorgu Bağlar destekler. Hazırlanan deyimlerle, bir çeşit hazır() işlevi ve daha sonra bir tür execute() işlevi çağırmanız gerekir. Sorgu bağlamaları ile, yalnızca bir işlevi çağırmanız gerekir ve temelde aynı şeyi yapar. Bu nedenle, sorgu bağlamaları hazırlanmış ifadelerden daha iyi severim. :foo için ? değişen bir dipnot düşmek gerekirse

, sadece adlandırılmış bağları (ki CI görünüşte ya desteklemez) için isimsiz olarak değiştirilmektedir. Sadece kullanıyorsunuz ya da ifadeleri hazırladığınız anlamına gelmiyor.

+0

çıkış Sana yardım gerekirse temel sorguyu görmesini sağlar. Bakın: http://stackoverflow.com/questions/38607368/how-to-implement-in-to-prepare-statement?noredirect=1#comment64603092_38607368 –

3

Benzer bir sorunla karşılaştığımda bu soruya rastladım. Cevap, CI'nin hazırlanmış ifadeleri desteklemediği doğrudur. Bununla birlikte, , hazırlanmış ifadeleri kullanamayacağınız anlamına gelmez! Benim bağlantı sınıf olarak PDO kullanıyorum ancak aşağıdaki kod çalışacaktır Aşağıdaki örnekte

:

$q = $this->db->conn_id->prepare('SELECT * FROM tbl_user WHERE uid=? and activation_key=?'); 
$q->execute(array($param1,$param2)); 
print_r($q->fetchAll()); 

Not conn_id size hazır deyimleri çalıştırabilir hangi karşı PDO nesnesidir.

Bu izin vermeyecek olsa da, yerel CI işlevlerinin izin verdiği sorgu dizesini almanız yeterlidir. Bunun için Get Last Executed Query in PHP PDO gibi bir şeye ihtiyacınız olacak.

Ayrıca, bu, daha sonra PDO hazırlığında kullanabileceğiniz ifadelerinizi oluşturmak için Query Builder'ı kullanmanızı engellemez.Örneğin -

$db->where('uid = ?',null,false); 
$db->where('activation_key = ?',null,false); 
$q = $this->db->conn_id->prepare($db->get_compiled_select('tbl_user')); 

sorgu inşa ediyorum ve $db->get_compiled_select('tbl_user');

+0

CI + güvenli hazırlanan bildirimler – vivoconunxino

İlgili konular