2013-08-19 10 views
8

हाय मैं तैयार बयानों उपयोग करने के लिए एसक्यूएल इंजेक्शन आदि से बचने के लिए उचित तरीके से जानने के लिए कोशिश कर रहा हूँपीएचपी अद्यतन तैयार बयान

जब मैं स्क्रिप्ट मैं अपने स्क्रिप्ट 0 पंक्तियाँ सम्मिलित किए कहने से एक संदेश प्राप्त निष्पादित, मैं उम्मीद यह कहने के लिए 1 पंक्तियां डालें और निश्चित रूप से तालिका को अपडेट करें। मैं अपने तैयार कथन पर पूरी तरह से यकीन नहीं कर रहा हूं, क्योंकि मैंने कुछ शोध किया है और मेरा मतलब है कि यह उदाहरण से उदाहरण के लिए भिन्न होता है।

जब मैं अपनी तालिका अपडेट कर रहा हूं तो मुझे सभी फ़ील्ड घोषित करने की आवश्यकता है या क्या यह सिर्फ एक फ़ील्ड अपडेट करना ठीक है ??

कोई भी जानकारी बहुत उपयोगी होगी।

index.php

<div id="status"></div> 

    <div id="maincontent"> 
    <?php //get data from database. 
     require("classes/class.Scripts.inc"); 
     $insert = new Scripts(); 
     $insert->read(); 
     $insert->update();?> 

     <form action="index2.php" enctype="multipart/form-data" method="post" name="update" id="update"> 
       <textarea name="content" id="content" class="detail" spellcheck="true" placeholder="Insert article here"></textarea> 
     <input type="submit" id="update" name="update" value="update" /> 
    </div> 

वर्गों/class.Scripts.inc

public function update() { 
    if (isset($_POST['update'])) { 
        $stmt = $this->mysqli->prepare("UPDATE datadump SET content=? WHERE id=?"); 
        $id = 1; 
        /* Bind our params */       
        $stmt->bind_param('is', $id, $content); 
        /* Set our params */ 
        $content = isset($_POST['content']) ? $this->mysqli->real_escape_string($_POST['content']) : ''; 

       /* Execute the prepared Statement */ 
         $stmt->execute(); 
            printf("%d Row inserted.\n", $stmt->affected_rows); 

           }     
          } 
+0

क्या आपने यह देखने के लिए प्रयास किया कि क्या होता है? –

+2

real_escape_string() तैयार कथन के लिए आवश्यक नहीं है – Danijel

+2

अपने एसक्यूएल में, पहला पैरामीटर सामग्री है और दूसरा आईडी है। जब आप bind_param को कॉल करते हैं, तो आपने ऑर्डर को उलट दिया है - bind_param – andrewsi

उत्तर

15
$stmt = $this->mysqli->prepare("UPDATE datadump SET content=? WHERE id=?"); 
/* BK: always check whether the prepare() succeeded */ 
if ($stmt === false) { 
    trigger_error($this->mysqli->error, E_USER_ERROR); 
    return; 
} 
$id = 1; 
/* Bind our params */ 
/* BK: variables must be bound in the same order as the params in your SQL. 
* Some people prefer PDO because it supports named parameter. */ 
$stmt->bind_param('si', $content, $id); 

/* Set our params */ 
/* BK: No need to use escaping when using parameters, in fact, you must not, 
* because you'll get literal '\' characters in your content. */ 
$content = $_POST['content'] ?: ''; 

/* Execute the prepared Statement */ 
$status = $stmt->execute(); 
/* BK: always check whether the execute() succeeded */ 
if ($status === false) { 
    trigger_error($stmt->error, E_USER_ERROR); 
} 
printf("%d Row inserted.\n", $stmt->affected_rows); 

आपके प्रश्नों का पुन:

मैं से मेरी स्क्रिप्ट कह 0 संदेश मिलता है पंक्तियां

सम्मिलित

ऐसा इसलिए है क्योंकि जब आप उन्हें बाध्य करते हैं तो आप पैरामीटर के क्रम को उलट देते हैं। तो आप अपनी $ सामग्री के संख्यात्मक मूल्य के लिए आईडी कॉलम खोज रहे हैं, जिसे शायद 0 के रूप में व्याख्या किया गया है। तो अद्यतन का WHERE खंड शून्य पंक्तियों से मेल खाता है।

क्या मुझे सभी फ़ील्ड घोषित करने की आवश्यकता है या क्या यह सिर्फ एक फ़ील्ड अपडेट करना ठीक है ??

अद्यतन दिनांक में केवल एक कॉलम सेट करना ठीक है। अन्य कॉलम नहीं बदला जाएगा।

+0

लाइन 10 पर पहला तर्क क्या है? –

+0

@AnnonomusPerson: प्रत्येक पैरामीटर के लिए एक पत्र। स्ट्रिंग के लिए 'i', पूर्णांक के लिए 'i' इत्यादि पढ़ें http://php.net/manual/en/mysqli-stmt.bind-param.php –

+0

'@ बिलकार्विन' मेरे लिए '$ स्टेटस वेरिएबल' दिखा रहा है 'पूर्णांक' मान। मैंने 'echo $ status' का उपयोग किया और आउटपुट' 1' है। –

1

वास्तव में, तैयार कथन जटिल नहीं हैं क्योंकि हर कोई सोचता है। काफी विपरीत, एक तैयार कथन आधारित कोड एक क्वेरी निष्पादित करने का सबसे सरल और साफ तरीका है। उदाहरण के लिए, अपना कोड लें।

public function update($content, $id) { 
    $stmt = $this->mysqli->prepare("UPDATE datadump SET content=? WHERE id=?"); 
    $stmt->bind_param('si', $content, $id); 
    $stmt->execute(); 
    return $stmt->affected_rows; 
} 

जैसा कि आप देख सकते हैं, कोड ठीक से उपयोग किया जा सकता है, तो कोड बहुत सरल और संक्षिप्त हो सकता है!

  1. प्लेसहोल्डर के साथ आपकी क्वेरी तैयार
  2. तब चर (स्ट्रिंग के लिए, उनके लिए सही प्रकार की स्थापना पहले, जहाँ "मैं" पूर्णांक के लिए खड़ा है "एस" बाँध:

    आप मूल रूप से केवल तीन लाइनों की जरूरत है और इतने पर)

  3. और फिर क्वेरी निष्पादित करें।

1-2-3 जितना सरल!

ध्यान दें कि प्रत्येक फ़ंक्शन के परिणाम को मैन्युअल रूप से जांचने के बजाय, आप set the reporting mode for mysqli सभी के लिए एक बार कर सकते हैं।trigger_error साथ के रूप में, लेकिन कोड की एक अतिरिक्त पंक्ति के बिना

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

परिणाम बहुत ज्यादा एक ही हो जाएगा: ऐसा करने के लिए, इससे पहले कि mysqli_connect()/new mysqli निम्नलिखित पंक्ति जोड़ें!

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