Tamam, sana yardım etmeye çalıştım son kez, (which the SO team kindly reversed btw) Bana bir downvote kustu, bu yüzden sana bu kez yardım ediyorum, neden bilmiyorum, ama burada dahil olmak üzere kod bazı gelişmeler olduğunu istenen özellik.
Temelde, kodu bir fonksiyon yol çok fazla yapar HTML ve PHP dağınık ve zor okunur karışımıdır. Bir şey yanlış giderse, nereye bilmiyorum. Biz küçük parçalar halinde yeniden yıkmak olacaktır. Bu idame, okunabilirliği ve güvenliğini artıracaktır.
İşte kod sonunda nasıl görüneceğini budur:
<?php error_reporting(-1); // turn on all errors
function getCategoryFormEdit($id)
{
$categories = getCategories();
$category = getCategoryFromRowsById($categories, $id);
$selectBox = createCategorySelectBoxOptions($categories, $category['subcat']);
$html = getRenderedTemplate('categoryFormEdit.tpl.html', array(
'{{category:name}}',
'{{category:description}}',
'{{category:selectBoxOptions}}',
), array(
$category['name'],
$category['description'],
$selectBox
));
return $html;
}
Gördüğünüz gibi, ben kod bozuldu ve şimdi o fonksiyon isimleri ne anlamak kolaydır. Temelde, bütün getCategoryFormEdit şimdi, sizin için HTML monte gereken her şeyi elde etmez. Kalan malzeme diğer işlevleri yapılır. Şimdi sadece dört yerine, tek bir şey yapar, çünkü bu, işlemek için kod çok daha kolay hale getirir. Bu ancak küçük işlevi, bir şey yanlış giderse, bir kod birkaç yüz hatları üzerinden arama gitmek zorunda değilsiniz, çünkü, küçük işlevleri tutmak ve bunları bir seferde bir şey yapalım iyi uygulama olarak kabul edilir.
Aşağıdaki gibi diğer işlevler şunlardır:
function queryDatabase($sql)
{
$result = mysql_query($sql);
$rows = mysql_fetch_array($result);
return $rows;
}
Eğer sorgulama ve getiriliyor birden çok kez yapacağız, çünkü biz ayrı bir işlevi veritabanı çağırmak için kod refactor. Biz tembel ve yine bizim kod zaman ve bu çağrıları çoğaltmak istemiyorum. Bunun yerine sadece bu fonksiyonu bazı SQL geçmesi ve sorgular olmak, sorgudan satırları dönmek var:
function getCategories()
{
return queryDatabase('SELECT id, name, description, subcat FROM category');
}
Sen sürümünde * ile sorgu vardı. Sadece ben HTML bulunan sütun adları ile yerini neden olduğu, sen gerçekten ne gerek veritabanından almak için iyi bir uygulama olarak kabul edilir. Veritabanı sorguları pahalı ve daha az iyi, veritabanını sorgulamak. Bir saniye:
function getCategoryById($id)
{
$sql = sprintf(
'SELECT name, description, subcat
FROM category WHERE id = %d', $id);
return queryDatabase($sql);
}
Ben doğrudan sorgu içine fakat kimliği dahil değil ne fark sprintf and %d. Senin kodunda, kullanılan $ID = $_GET['id'] ve $ID, doğrudan SQL dizesi takılı, SQL Injection için kodunu açarak. Hiç bunu asla. Kullanıcı girişi ve should always sanitize it güvenemeyiz. %d, biz kesin kimlik bir numara ve tek bir numara yapmak.
Eğer getCategoryFormEdit tekrar bakarsanız, biz getCategoryById($id) olsa çağırarak, ancak aşağıdaki işlevi olmadığını fark edecektir:
function getCategoryFromRowsById($rows, $id)
{
foreach($rows as $row) {
if($row['id'] === $id) {
return $row;
}
}
return FALSE;
}
getCategories() zaten veritabanındaki tüm kategoriler zorlama var yaparken, bu yüzden satır dahil olduğundan sadece belirli bir kategori almak için tekrar veritabanını yeniden sorgulamak için hiçbir neden yoktur: Bunun nedeni basittir tüm kategorilerde döndü. Db sorguları pahalı, o yüzden sadece tüm kategorileri üzerinde yineleme ve yerine oradan verilen $ id ile satır toplayalım hatırlıyorum.
Tüm kategoriler var kez seçme seçenekleri oluşturmak için kullanabilirsiniz:
function createCategorySelectBoxOptions($rows, $selectedId)
{
$options = '';
foreach($rows as $row) {
$options .= sprintf(
'<option value="%s"%s>%s</option>',
$rows['id'],
($rows['id'] === $selectedId) ? ' selected="selected"' : '',
$rows['name']
);
}
return $options;
}
Yine, tüm bu fonksiyon one şey yok: bu seçenekleri belirleyin oluşturur. Hiçbir şey daha. Ayrıca, belirtilen $selectedId ile $row['id'] özdeş olan seçeneğe selected özniteliği ekler. Kullanımı sprintf a> tekrar yerine dize konsatenasyonundan, okumak çok daha kolay ve kod için daha az dağınıklığı katıyor çünkü. Ayrıca ben, seçilen öznitelik için XHTML notasyonu kullanılır unutmayın. HTML lezzet kullanırken sadece selected yapabilirsiniz.
Son olarak, biz sadece hazırlanan tüm malzeme şablon içine almak zorunda. Bunun için, sadece şablon dosyası oluşturmak ve buna tutucular ile bazı kod ekleyin:
<div class="form">
<h2>Add new category</h2>
<form method="post" action="?page=editCategory">
<ul>
<li><label>Kategori</label></li>
<li><input type="text" class="inp" name="cname"
value="{{category:name}}"></li>
<li><label> Açıklama</label></li>
<li><textarea class="inx" rows="10" cols="40" name="kabst">{{category:description}}</textarea></li>
<li>
<input type="checkbox" class="ins" name="kselect" id="kselect">
<label for="kselect">Aktif/Pasif</label>
</li>
<li>Üst kategorisi</li>
<li>
<select class="ins" name="subsl">
{{category:selectBoxOptions}}
</select>
</li>
<li>Home page:</li>
<li>
<input type="checkbox" class="ins" name="kradio" id="kradio">
<label for="kradio">Aktif/Pasif</label>
</li>
<li><input type="submit" class="int" value="ekle" name="ksubmit"></li>
</ul>
</form>
</div>
Biz sunum ve mantığı ayırmak istiyoruz çünkü biz yerine işlevi tüm HTML yazılı bir şablon kullanmak neden nedenidir. Hiç PHP bilen, ancak HTML ve bu şekilde yapabiliriz, kolayca iş bölebilirsiniz bir tasarımcı ile çalışıyor olabilirsiniz. Bu sadece bunu koymak PHP kodu aramak zorunda kalmadan şablonu değiştirmek için de çok kolay.
Sonra Aşağıdaki yöntem budur tutucuları değiştirmek için bir yol, gerekir:
function getRenderedTemplate($template, $placeholder, $replacements)
{
return str_replace($placeholder, $replacements, file_get_contents($template));
}
Bu çiftleşmiş son derece simplied yaklaşımdır. Ayrıca DOM çiftleşmiş veya bir dedicated template engine Twig gibi veya başka bir şey kullanabilirsiniz. Bu örnek için, ben sadece basit olmasını istedik, bu yüzden str_replace a> doldurulmuş olursa olsun işlevi şablonunda denilen, örneğin bunlara karşılık gelen değerlere sahip tüm tutucuların yerine ve geri dönmek için kullanılır
if(is_numeric($_GET['id'])) {
echo getCategoryFormEdit($_GET['id']);
} else {
die('Category ID must be numeric. Exiting');
}
Ve işte bu. Üstlenmeden yapılır. Ben yukarıdaki kodu test etmedi, bu yüzden zaten orada bazı hatalar içinde muhtemeldir, ama: ana nokta söz gösterildiği gibi kod geliştirmek için nasıl göstermek için oldu. Temelde, fonksiyonlar olsun her zaman çok uzun bir deyişle kod tanımlamak için deneyin bakın. Her için "ve" sadece bir şey yapar küçük bir bölümünü içine kodu refactor. Yukarıda böyle yaparak, biz kazanmıştır:
- SQL satır döndüren bir sorgu yeniden işlev
- DB tüm kategorileri alır yeniden işlev
- Kimliği göre bir kategori alır yeniden işlev
- kategorilerden bir seçim kutusu oluşturur yeniden işlev
- yeniden kullanılabilir, mini motor şablonu
- sunum ve iş mantığının ayrılması
- Sabit bariz SQL Injection güvenlik açığı
- Daha iyi okunabilirlik ve sürdürülebilirlik.
Geri birkaç hafta veya ay içinde kod gelirseniz, ne yaptığını anlamaya çok daha az zor bir zaman olacak.