Daha iyi, daha "Standard" var mı

8 Cevap php

Uzun süre, benim içinde PHP SQL sorguları için aşağıdaki temel biçimlendirme kullanarak oldum:

$sql = "SELECT * FROM `user-data` WHERE `id` = '".$id."' LIMIT 1;";
$fn = mysql_fetch_assoc(mysql_query($sql));

Bu kusursuz çalışır iken, bu kod artık bitleri için gerçekten dağınık alabilirsiniz ve derin benim vicdan içinde bir şey dizisi birleştirme azından ben bunu her zaman cringes. Yine de, çalışıyor ve ben büyük sorunlar olmadan hemen hemen her yerde kullanabilirsiniz. (Ben vs vs, ilk önce kaçan olmadan bir SQL dizesi doğrudan kullanıcı verilerini geçmek için yeterli yoğun değilim, uysal bir örnek)

Ne yapmak istiyorum biraz daha nesne yönelimli bir şey, ama ben iyi yaklaşım ne olurdu emin değilim. Sadece edebilmek güzel olurdu sql-> insert ($ değerleri [$, nerede, $ extra]); veya benzer bir şey, bir daha basitleştirilmiş bir şekilde sorgu dizeleri geçmek için PHP'nin doğal Associative Array türleri kullanılarak. Az esnek? Evet. Daha okunabilir? Heck, evet ve zor o at "sessiz" sözdizimi hataları yapmak.

Toplumun bu alır nelerdir? Ne yaklaşımlar üzerinde çalıştığınız projeler için en etkili bu sorunu gördük?

Bu konularda, ama ben şahsen sorgular zaman zaman iç içe olan, çok daha karmaşık SELECTleri, insert ve update daha yapmam, ama benim SQL lezzet saklı yordamlar yapmaz çünkü bu genelde değil.

8 Cevap

PDO birçok çerçeveler kapalı bir yapı iyi, sağlam, güvenli bir çözümdür. Eğer alttan başlamak için gidiyoruz eğer, PDO sağlam bir temeldir.

Belki PHP'nin dize değişken değişimi kullanmak için en azından biraz mutlu olur:

$sql = "SELECT * FROM `user-data` WHERE `id` = '$id' LIMIT 1;";

MDB_QueryTool Oraya denedim asla.

IMHO Zend_DB gerçekten iyidir, zend framework sen öylesine sen tam bir çerçeve istemiyorsanız bunu bir göz olayı almak isteyebilirsiniz ilgilenen yalnızca bir bölümünü kullanmak için izin.

ne Zend_Db severim tabloda select sözdizimi

$userRowset = $user->fetchAll( $user->select()
 ->where('name LIKE ?', $name . '%')
 ->order('id ASC')
 ->limit(10) 
);

Kolayca ilgili tüm kriter ve tablosunu görebilirsiniz yüzden sade SQL yapıyor sonra daha iyi buluyorum. Sadece bir uyarı Zend_Db'nin düz SQL yazmak zorunda zaman tüm SQL, bu yüzden zaman işlemek değil ama bu gerçekten nadirdir.

Doctrine olan bir ORM sarılı PDO.

Için bir oy doctrine. PDO ile zaman kaybetmeyin. Bunu vurgulamak yeterli değildir. Bir orm ile gidin. CRUD yöntemleri, özel caching mantığını yazmaya vakit, ve böyle bir kütüphane kaynaklanan "yükü" olarak erken optimizasyonu derdini unutun. "App_users seçin *" gibi ifadeler ve bunlarla ilgili çirkin heredoc sıçrayan tarafından yapılan havai buna değer değildir.

Geri sql düşmesi gerekiyorsa, bunu yapabilirsiniz. Eğer mutluluk bir devlet konum zaman diğer 90%.

http://www.doctrine-project.org/

Sen mysqli SQL'de küçük bir yer tutucu yazmak ve daha sonra bu dize birleştirme daha SQL enjeksiyon saldırıları daha az duyarlı olmalı onları içeri doldurmak için kullanabilirsiniz.

$conn = new mysqli($server, $username, $password, $database);
$stmt = $conn->prepare('SELECT * FROM people WHERE age = ? AND name != ?');
$stmt->bind_param('is', 20, "Austin");

Deneyin:

$stat2 = <<<SQL
SELECT *  from YOUR.DET_TABLE
WHERE ID = ?
ORDER BY ID, EFF_DT
SQL;
  $d_cur = $conn->prepare($stat2);
  $status   = $d_cur->execute(array($selected));

I've been wondering why I am always seeing the more complicated form of string building like this: "literal string " . $a . " more literal", rather than "literal string $a more literal", or in your case:

"SELECT * FROM `user-data` WHERE `id` = '".$id."' LIMIT 1;";

bunun yerine:

"SELECT * FROM `user-data` WHERE `id` = '$id' LIMIT 1;";

Daha karmaşık ifadeler için, ben (ama ben uzun bir süre için ac programcı oldu) sprintf'i kullanmak ister:

$sql = sprintf("SELECT * FROM `user-data` WHERE `id` = '%s' LIMIT 1", $id);

Bu da bu formatta yazılmış olabilir:

$sql = sprintf("
    SELECT * 
       FROM `user-data` 
    WHERE `id` = '%s' 
        LIMIT 1", 
    $id);

Bu durumda, çok satın almaz, ancak dize gömülü birçok değişken vardır, bunun daha kolay yönetmek için yapar.