Sizin için eylem iyi ders size veri erişimi nasıl yaklaştığını bağlıdır. Atabileceğiniz üç yaklaşım vardır:
- Saklı prosedürleri kullanın
- Kodunda sorguları tutun (ama fonksiyonları içine tüm sorguları koymak ve parametreler için PDO kullanmak için her şeyi düzeltmek, daha önce belirtildiği gibi)
- ORM aracını kullanın
Eğer veritabanı altyapısı için kendi ham SQL geçmek istiyorsanız yapmanız gereken istediğiniz tüm PHP kodu dışında ham SQL olsun ama nispeten değişmeden tutmak ise o saklanan prosedürleri gitmek için yol olacaktır. Ham SQL tartışma vs prosedürler saklı kutsal savaşın bir parçasıdır, ama K. Scott Allen mükemmel bir nokta yapar - bir ıskarta bir de olsa - bir makale versioning databases:
İkincisi, saklanan prosedürler gözlerimde lehine dışına düşmüş. Ben saklanan prosedürleri her zaman kullanılması gerektiğini söyledi telkinin WinDNA okuldan geldi. Bugün, ben veritabanı için bir API katmanı olarak saklanan prosedürleri bakın. Eğer veritabanı düzeyinde bir API katmanı gerekiyorsa, bu iyidir, ama onlar gerek yok ekstra bir API katmanı oluşturma ve sürdürmenin yük üstlenmeden uygulamaların çok görüyoruz. Bu uygulamalarda saklanan prosedürleri bir yararı daha yükünün daha vardır.
Ben saklı yordamları kullanarak değil doğru yalın eğilimindedir. Ben DB aracılığıyla saklanan prosedürleri maruz kalan bir API olan projeler üzerinde çalıştık, ama saklanan prosedürler kendi bazı sınırlamalar getirebilir ve bu projeler all var, değişen derecelerde, ham SQL oluşturulan dinamik olarak kullanılabilir DB erişmek için kod.
DB üzerinde bir API tabakası olan DB ekibi ve sorgu kodu tutuldu eğer olurdu esneklik bazı pahasına Dev takım arasında sorumlulukların daha iyi sınırlandırılmasını verir, ancak PHP projeler oldukça büyük olması daha az olasıdır Bu eğrilmelerini yararlanabilecek kadar takım.
Kavramsal olarak, muhtemelen veritabanı sürüm olmalıdır. Pratik konuşma, ancak, çok daha büyük olasılıkla sadece kod veritabanı sürüm için vardır daha sürüm var demektir. Eğer kodu değişiklikleri yapıyoruz sorguları değişen olması muhtemeldir, ama veritabanına karşı saklı saklı yordamlar sorguları değişiyor eğer o zaman muhtemelen kodunu kontrol ederken bu kontrol olmayacak ve siz kaybedersiniz Başvurunuzun önemli bir alan için sürüm yararları çok.
Ne olursa olsun yine de saklı prosedürleri kullanmak için değil tercih olsun veya olmasın, sen en azından her veritabanı işlemi yerine sayfanızın komut her birinin içine gömülü olan daha bağımsız bir işlevi saklanan emin olmalıdır - DB için aslında bir API katmanı olan korunur ve kod ile versiyonlu edilir. Saklı yordamlar kullanıyorsanız, bu etkili size proje ayrı ekipler yoksa gereksiz şeyleri zorlaştırıyor hissedebilirsiniz DB için iki API katmanları, kod ile bir ve DB ile biri var anlamına gelecektir. Kesinlikle yok.
Sorun kod zariflik biri ise, orada daha prezentabl sıkıştı SQL ile kod yapmak için yolu vardır, ve aşağıda gösterilen UserManager sınıf başlamak için iyi bir yoldur - sınıfı yalnızca 'kullanıcı' tablosuna ilgili sorguları içeren, Her sorgu sınıfta kendi yöntemi vardır ve sorgular hazırlamak tablolara girintili ve bir saklı prosedür bunları biçimlendirmek gibi biçimlendirilir.
// UserManager.php:
class UserManager
{
function getUsers()
{
$pdo = new PDO(...);
$stmt = $pdo->prepare('
SELECT u.userId as id,
u.userName,
g.groupId,
g.groupName
FROM user u
INNER JOIN group g
ON u.groupId = g.groupId
ORDER BY u.userName, g.groupName
');
// iterate over result and prepare return value
}
function getUser($id) {
// db code here
}
}
// index.php:
require_once("UserManager.php");
$um = new UserManager;
$users = $um->getUsers();
foreach ($users as $user) echo $user['name'];
Lütfen sorguları oldukça benzer ama vb filtreleme, sıralama, karmaşık çağrı gibi sorgu koşullarda permütasyon büyük sayıda varsa Ancak, bir nesne / ilişkisel mapper aracı, muhtemelen gitmek için yoludur rağmen varolan kodunuzu elden süreci Aletin kullanımı için oldukça karmaşık olabilir.
ORM araçları araştırmak için karar verirseniz, Propel, Yii ActiveRecord bileşeni, ya da kral-baba PHP ORM, Doctrine bakmak gerekir. Bunların her biri, size programlı karmaşık mantığı her türlü ile veritabanı sorguları oluşturmak için yeteneği verir. Doktrin Eğer Nested Set tree pattern kutudan gibi şeyler ile veritabanını şablon sağlayan, en tam özellikli.
Performans açısından, saklanan prosedürler hızlı vardır, ama genellikle çok tarafından değil ham sql üzerinde. Her istek üzerine ORM kütüphaneleri yüklenirken, dinamik SQL üretimi her sorgusuna ... tüm bu şeyler bir etkisi olabilir verimsiz ya da gereksiz sorgulama, büyük dosya IO, ama - ORM araçları şekillerde bir sayısında önemli bir performans etkisi olabilir ORM aracı kullanımı büyük ölçüde elle sorgu ile kendi DB katman oluşturarak daha kod çok daha küçük bir miktarı ile size sunulan gücünü artırabilir.
Ne olursa olsun bir sorgu veya saklı yordam kullanarak konum olsun, her zaman parametreleri işlemek için PDO'su hazırlanmış deyimleri kullanarak olmalıdır kodunuzda SQL kullanmaya devam etmek gidiyoruz Gary Richardson, ama kesinlikle doğru . Giriş sanitisation PDO tarafından sizin için yapılır.
// optional
$attrs = array(PDO::ATTR_PERSISTENT => true);
// create the PDO object
$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass", $attrs);
// also optional, but it makes PDO raise exceptions instead of
// PHP errors which are far more useful for debugging
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('INSERT INTO venue(venueName, regionId) VALUES(:venueName, :regionId)');
$stmt->bindValue(":venueName", "test");
$stmt->bindValue(":regionId", 1);
$stmt->execute();
$lastInsertId = $pdo->lastInsertId();
var_dump($lastInsertId);
İhtar: ID 1 olduğunu varsayarak, yukarıdaki komut çıktısı 'string (1) "1"'. PDO-> lastInsertId () ne olursa olsun gerçek sütun bir tamsayı olup olmadığını bir dizge olarak kimliği döndürür. PHP otomatik olarak tamsayılar dizeleri döküm yapar gibi bu muhtemelen sizin için bir sorun olmayacak.
Aşağıdaki irade çıktı 'bool (true)':
// regular equality test
var_dump($lastInsertId == 1);
ancak is_int ya da PHP'nin "is really, truly, 100% equal to" operatörü gibi, değeri bir tamsayı olmasını bekliyor kod varsa:
var_dump(is_int($lastInsertId));
var_dump($lastInsertId === 1);
bazı konularda çalıştırmak olabilir.
Saklı prosedürleri Edit: Bazı iyi bir tartışma here