SQLite डेटाबेस में किसी व्यक्ति का नाम अपडेट करने के लिए मेरे पास मेरे API में function है। आप इसे उस नाम की आईडी दें जिसे आप बदलना चाहते हैं और नया नाम।

मैं एक function इस तरह कैसे बना सकता हूं जिससे मैं database में विस्तृत क्षेत्रों को अपडेट कर सकूं? यहां तक ​​कि अलग-अलग tables की चीजें भी?

मैंने स्विच करने के लिए पैरामीटर का उपयोग करने की कोशिश करना शुरू कर दिया है कि कौन सी SQL क्वेरी निष्पादित की गई है, लेकिन यह थोड़ा क्लंकी और स्केलेबल नहीं लगता है। क्या कोई बेहतर तरीका है?

वर्तमान कोड:

 private function json_update_authors() {
  $input = json_decode(file_get_contents("php://input"));


 $query  = "UPDATE authors SET name = :name WHERE authorId = :authorId";
 $params = ["name" => $input->name, "authorId" => $input->authorId];
 $res = $this->recordset->getJSONRecordSet($query, $params);    
 return json_encode(array("status" => 200, "message" => "ok"));
}
1
WhynarySearch 1 जिंदा 2021, 04:44
कृपया अपने प्रश्न को उस डेटाबेस से टैग करें जिसका आप उपयोग कर रहे हैं।
 – 
Popeye
1 जिंदा 2021, 04:51
किया हुआ। प्रश्न में भी सूचीबद्ध :)
 – 
WhynarySearch
1 जिंदा 2021, 04:55

1 उत्तर

सबसे बढ़िया उत्तर

परिशिष्ट

आप जो चाहते हैं उसे प्राप्त कर सकते हैं, लेकिन विवरण पढ़ने से पहले, मैं इस पर विचार करने की सलाह देता हूं कि आप इसे किस तक सीमित रखना चाहते हैं, क्योंकि यदि कोई फ़ाइल है जो आपका फ़ंक्शन आँख बंद करके भरोसा करता है, तो, उस फ़ाइल के अंदर दुर्भावनापूर्ण इनपुट होना चाहिए, आपका डेटाबेस कर सकता है आसानी से हैक किया जा सकता है। तो, आपके पास टेबल/फ़ील्ड की एक श्वेतसूची होनी चाहिए जिसे आप अपडेट करने और उसे लागू करने की अनुमति देते हैं।

डिकोडिंग JSON

json_decode आपके JSON को एक ऐसी वस्तु में डिकोड करता है जिसे आप इसके सदस्यों को नहीं देखते हैं। हालांकि, दस्तावेज़ीकरण के अनुसार आप इस ऑब्जेक्ट को पुनरावृति कर सकते हैं जैसे :

foreach ($obj as $key => $value) {
    echo "$key => $value\n";
}

हालांकि, json_decode आपके JSON को एक array साथ ही, जैसे:

$input = json_decode(file_get_contents("php://input"), true);

मैं व्यक्तिगत रूप से JSON को सरणियों में डिकोड करना पसंद करता हूं, लेकिन आप पहले दृष्टिकोण के साथ भी काम कर सकते हैं। दोनों ही मामलों में, आप सरणी को उसी तरह से पुनरावृति कर सकते हैं जैसा कि ऊपर वर्णित है।

अनुशंसित प्रारूप

आपके अपडेट का एनाटॉमी इस प्रकार है:

  • टेबल
  • खेत
  • फिल्टर

इसलिए, मैं अनुशंसा करता हूं कि आप अपने इनपुट के JSON प्रतिनिधित्व का उपयोग कर सकते हैं, जिसमें एक tableName फ़ील्ड है, जो एक string, एक फ़ील्ड है। फ़ील्ड, जो की-वैल्यू पेयर का एक सरणी है, अपडेट किए जाने वाले फ़ील्ड्स को दर्शाने वाली कुंजियाँ और अद्यतन करने के लिए मानों का प्रतिनिधित्व करने वाले मान और अंत में एक फ़िल्टर फ़ील्ड, जो , यदि हम बहुत सुंदर होने का इरादा रखते हैं, तो कुंजी-मूल्य जोड़े की वस्तुओं का एक सरणी भी हो सकता है, उन फ़ील्ड का प्रतिनिधित्व करने वाली कुंजियां जिन्हें आप फ़िल्टर करना चाहते हैं और वे मान जो आपके द्वारा फ़िल्टर किए जाने वाले मानों का प्रतिनिधित्व करते हैं। एक नमूना Javascript ऑब्जेक्ट जो इस प्रारूप का अनुपालन करेगा, वह निम्न जैसा दिखेगा:

[
    { //Your query
        tableName: 'authors',
        fields: 
        [
            {
                name: 'somename'
            }
        ],
        filters:
        [
            {
                authorId: 123
            }
        ]
    },
    { //Some other example
        tableName: 'books',
        fields: 
        [
            {
                isbn: 'someisbn',
                title: 'sometitle'
            }
        ],
        filters:
        [
            {
                pageNumber: 123,
                weight: '5kg'
            }
        ]
    },
]

मैंने ऊपर दो वस्तुओं का एक उदाहरण दिया है, ताकि आप देख सकें कि:

  • JSON में कई अपडेट अधिसूचित किए जा सकते हैं
  • आप एक ही कमांड में कई फ़ील्ड अपडेट कर सकते हैं
  • आप कई क्षेत्रों द्वारा फ़िल्टर कर सकते हैं

मुझे यह उल्लेख करना चाहिए कि यह एक खरगोश छेद है, क्योंकि आप ऑपरेटर को भी बदलना चाहेंगे, लेकिन चूंकि यह केवल एक उत्तर है, इसलिए मैं इसके उद्देश्य के लिए एक पूर्ण सुरुचिपूर्ण परियोजना नहीं लिखता हूं। इसके बजाय, मैं आपको केवल यह बता दूं कि सुधार के लिए बहुत जगह है, ऑपरेटर की गतिशीलता तुरंत एक सुधार के रूप में दिमाग में आती है जिसकी आपको आवश्यकता हो सकती है।

एक अद्यतन क्वेरी कैसे उत्पन्न करें:

//assuming that $JSON is a variable holding such values as describe in the previous chapter
foreach ($JSON as $obj) {
    $tableName = $obj['tableName'];
    $fields = [];
    $filters = [];
    $params = [];
    $toExecute = isset($whiteList['tables'][$tableName]);
    foreach ($obj['fields'] as $key => $value) {
        $fields[]=($key.'=:field_value'.$key);
        $params['field_value'.$key] = $value;
        $toExecute = $toExecute && isset($whiteList['fields'][$key]);
    }
    foreach ($obj['filters'] as $key => $value) {
        $filters[]=($key.'=:filter_value'.$key);
        $params['filter_value'.$key] = $value;
        $toExecute = $toExecute && isset($whiteList['filters'][$key]);
    }
}

मैंने ऊपर एक श्वेतसूची का उपयोग यह सुनिश्चित करने के लिए किया है कि क्वेरीज़ फ़िल्टर का उपयोग करके टेबल/फ़ील्ड को अपडेट नहीं करेंगी जहां टेबल/फ़ील्ड/फ़िल्टर का नाम या तो बुरी तरह से स्वरूपित, दुर्भावनापूर्ण या अवांछित है। इस कोड का परीक्षण नहीं किया गया है, इसमें टाइपो हो सकते हैं, लेकिन विचार एक अच्छा प्रारंभिक बिंदु होना चाहिए।

2
Lajos Arpad 6 जिंदा 2021, 13:27
आपके समय के लिए धन्यवाद!
 – 
WhynarySearch
7 जिंदा 2021, 20:05