2010-08-13 4 views
6

मैं सिर्फ उत्सुक हूं और सोच रहा था कि अगर आप एक ही एचटीएमएल फॉर्म का उपयोग करना चाहते हैं और जहां तक ​​एक आइटम को बनाने और अपडेट करने के लिए एक ही PHP कोड का उपयोग करना चाहते हैं तो आप इसे कैसे संभालेंगे ।बेस्ट प्रैक्टिस: सृजन के लिए एक ही फॉर्म का उपयोग करें और

उदाहरण:
एक पृष्ठ पर आप नाम, ईमेल पता और आयु के साथ डेटाबेस प्रविष्टि बना सकते हैं।
एक अलग (?) पृष्ठ पर आप अपने डेटा से भरे हुए फॉर्म फ़ील्ड देखते हैं और आप इसे संपादित और सहेज सकते हैं।

मेरे पास बहुत अधिक कोड का उपयोग करके इसे पूरा करने के मेरे तरीके हैं - लेकिन मैं यहां कुछ सीखने की उम्मीद कर रहा हूं। तो आप इस काम को कैसे संभालेंगे?

धन्यवाद & चीयर्स, मोच

उत्तर

6

बहुत आसानी से - यदि किसी मौजूदा आइटम की एक आईडी (जिसे उपयोगकर्ता संपादित करने के लिए अधिकृत है) क्वेरी स्ट्रिंग में आपूर्ति की जाती है, तो यह एक संपादन ऑपरेशन है।

यदि क्वेरी स्ट्रिंग में कोई आईडी प्रदान नहीं की जाती है, तो यह एक निर्माण ऑपरेशन है।

फ़ील्ड डेटाबेस से मौजूदा मानों के आधार पर पूर्व-जनसंख्या वाले हैं, यदि यह एक संपादन ऑपरेशन है, या डिफ़ॉल्ट मानों या रिक्त तारों के आधार पर यदि यह एक निर्माण ऑपरेशन है।

+0

फ़ील्ड मानों को पॉप्युलेट करना संभव नहीं है, क्योंकि हम एक ही फॉर्म का उपयोग कर रहे हैं :) –

+0

सुनिश्चित करें कि आप ... शायद सबसे अच्छा तरीका नहीं हो सकता है- लेकिन यह काम करता है। यदि फॉर्म एक नई प्रविष्टि के लिए है तो मान खाली है, अन्यथा डेटाबेस से प्रविष्टि प्रदर्शित करता है। – Jesse

+0

ओह नहीं। आपने कभी भी अपने आवेदन को डीबग करने के लिए उपयोग नहीं किया है या आप इसका कभी भी उल्लेख नहीं करेंगे। –

0

हाँ, वह केवल स्वीकार्य समाधान है।

यहाँ CRUD आवेदन जो एक टेम्पलेट में इनपुट फार्म की दुकान का एक छोटा उदाहरण है:

<? 
mysql_connect(); 
mysql_select_db("new"); 
$table = "test"; 
if($_SERVER['REQUEST_METHOD']=='POST') { //form handler part: 
    $name = mysql_real_escape_string($_POST['name']); 
    if ($id = intval($_POST['id'])) { 
    $query="UPDATE $table SET name='$name' WHERE id=$id"; 
    } else { 
    $query="INSERT INTO $table SET name='$name'"; 
    } 
    mysql_query($query) or trigger_error(mysql_error()." in ".$query); 
    header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']); 
    exit; 
} 
if (!isset($_GET['id'])) { //listing part: 
    $LIST=array(); 
    $query="SELECT * FROM $table"; 
    $res=mysql_query($query); 
    while($row=mysql_fetch_assoc($res)) $LIST[]=$row; 
    include 'list.php'; 
} else { // form displaying part: 
    if ($id=intval($_GET['id'])) { 
    $query="SELECT * FROM $table WHERE id=$id"; 
    $res=mysql_query($query); 
    $row=mysql_fetch_assoc($res); 
    foreach ($row as $k => $v) $row[$k]=htmlspecialchars($v); 
    } else { 
    $row['name']=''; 
    $row['id']=0; 
    } 
    include 'form.php'; 
} 
?> 

form.php 
<form method="POST"> 
<input type="text" name="name" value="<?=$row['name']?>"><br> 
<input type="hidden" name="id" value="<?=$row['id']?>"> 
<input type="submit"><br> 
<a href="?">Return to the list</a> 
</form> 

list.php 
<a href="?id=0">Add item</a> 
<? foreach ($LIST as $row): ?> 
<li><a href="?id=<?=$row['id']?>"><?=$row['name']?></a> 
<? endforeach ?> 
बेशक

, कुछ फैंसी प्रपत्र निर्माता, HTML_QuickForm2 की तरह सादे HTML टेम्पलेट के स्थान पर किया coud - क्या आप जानते हैं अपने निरंतर प्रोग्रामर की भूख खुद को दोहराने के लिए नहीं, यहां तक ​​कि एक HTML फ़ील्ड, फ़ील्ड मान और त्रुटि कुंजी नामकरण में भी :)
लेकिन व्यक्तिगत रूप से मैं सादा HTML पसंद करता हूं।

0

मुझे लगता है कि यह सही जवाब नहीं है लेकिन यह आपके लिए भी दिलचस्प हो सकता है।

एक ORM परियोजना नामक सिद्धांत नहीं है: http://www.doctrine-project.org/projects/orm/1.2/docs/en

// User Id might be an existing id, an wrong id, or even empty: 
$user_id = 4; 
$user_id = null; 

// Fetch the user from the database if possible 
$user = Doctrine::getTable('Model_User')->find($user_id); 

// If there was no record create a new one 
if ($user === false) 
    $user = new Model_User(); 

// Change some data 
$user->title = $newValue; 

// Perform an update or an insert: 
$user->save(); 

जैसा कि आप देख आप एसक्यूएल के बारे में देखभाल करने के लिए नहीं है। सिद्धांत आपके लिए और आपके कोड को पढ़ने और डीबग करने में आसान हो जाता है।

+1

... और सामान्य कार्यों से अलग होने के लिए नरक के रूप में कठिन :) –

+0

मैं अभी तक इस बिंदु तक नहीं पहुंच पाया है। क्या आप मुझे एक विचार दे सकते हैं कि इस तरह के कार्य कैसा दिखते हैं? – jantimon

+0

@ गॉमेय - "क्या आप मुझे इस तरह के कार्यों के बारे में एक विचार दे सकते हैं" -> बहुत सरल: जब आप जटिल परिसर में 2 या अधिक तालिकाओं से डेटा को गठबंधन करते हैं, जिसमें समान सरल चयन मानदंड होते हैं, समान रूप से अपने मॉडल में इसका प्रतिनिधित्व करने के लिए अलग-अलग ज़रूरतें हैं। – unity100

3

जिस तरह से मैं इसे देखता हूं वह है कि कुछ मामलों के लिए काम/संपादन कार्यों के बीच फॉर्म के लिए समान मार्कअप का पुन: उपयोग करना, लेकिन सभी के लिए नहीं। मुझे लगता है कि फॉर्म - हालांकि वे एक ही डेटाबेस तालिका में मैप कर सकते हैं - वास्तव में उनके संदर्भ द्वारा परिभाषित किया जाता है। उदाहरण के लिए, यदि आपके पास 'उपयोगकर्ता' तालिका थी, तो आपके पास उपयोगकर्ता नाम, ईमेल, पासवर्ड के साथ 'बनाना' फ़ॉर्म हो सकता है, लेकिन उस उपयोगकर्ता के बाद आप चाहते हैं कि आप उन्हें अपनी साइट पर अपनी पहचान बनाए रखें, इसलिए उपयोगकर्ता नाम फ़ील्ड दिखाई नहीं देगी एक 'संपादन' संदर्भ में। मैं क्लासिकल रूप से एक PHP डेवलपर हूं, लेकिन मैं डैंजो के दृष्टिकोण की सराहना करने आया हूं, जहां आप एक मॉडल (टेबल) बनाते हैं जो प्रत्येक फ़ील्ड के लिए मूल सत्यापन को परिभाषित करता है और आप जितने फॉर्म बनाते हैं, उतने रूपों को बना सकते हैं, या उस परिभाषा से संशोधित/विस्तार करें। यदि आप स्क्रैच से लिख रहे हैं, तो आपको शायद अपने सत्यापन विधियों को बहुत पोर्टेबल और/या अपने फॉर्म फ़ील्ड को संदर्भ-संवेदनशील बनाने के तरीके खोजने के लिए व्यावहारिक लगेगा।

+0

बिल्कुल। सम्मिलन और अद्यतन के बीच व्यापार अंतर होने में अक्सर होता है, शायद कुछ फ़ील्ड एक बार डालने के बाद संपादन योग्य नहीं होते हैं, शायद कुछ फ़ील्ड केवल पहले सम्मिलन में संपादन योग्य होते हैं, और इसे एक पृष्ठ पर डाला जा सकता है, और अधिक संपादित किया जा सकता है। उस ने कहा, जब भी यह संभव हो, मैं एक ही रूप का पुन: उपयोग करता हूं। – snowflake

1

इस तरह से मैं हमेशा इसे करता हूं। क्या आप एक एमवीसी सिस्टम का उपयोग कर रहे हैं? मैं एक कंट्रोलर का उपयोग दो अलग-अलग कार्यों (यूआरएल = व्यक्ति/नया + व्यक्ति/संपादन/xxxx_id) के साथ करता हूं।

function new() 
    errors = [] 
    if (get) 
     data = blank_record() 
    elseif (post) 
     data = posted_data 
     if (create(data)) 
      redirect_to_listing() 
     else 
      errors = describe_errors 
    show_form(data, errors) 

function edit() 
    errors = [] 

    if (get) 
     data = get_from_db(id) 
    elseif (post) 
     data = posted_data 
     if (save()) 
      redirect_to_listing() 
     else 
      errors = describe_errors 
    show_form(data, errors) 

नोट वहाँ हमेशा यह है कि एक बार यह फार्म के लिए हो जाता है एक वस्तु डेटा कहा जाता है कि रूप प्रदान कर सकते हैं, तो उसे खाली हो सकता है डाटाबेस से, या डेटा पोस्ट:

कोड तो की तरह कुछ है । किसी भी तरह से यह हमेशा एक ही प्रारूप होना चाहिए।

कारण मैं नया और संपादित करने का कारण यह है कि मुझे लगता है कि अक्सर यह लगता है कि वे वास्तव में अपने व्यवहार और लोड और बचत चरणों में काफी अलग हैं।

संबंधित मुद्दे