2013-08-19 13 views
8

Cześć Próbuję nauczyć się właściwego sposobu korzystania z przygotowanych sprawozdań, aby uniknąć zastrzyki SQL itpPHP UPDATE przygotowane oświadczenie

Kiedy wykonać skrypt dostaję wiadomość od mojego skryptu mówiąc 0 Wiersze włożeniu Spodziewam to znaczy 1 rzędy wstawione i oczywiście zaktualizować tabelę. Nie jestem do końca pewien na moje przygotowane oświadczenie, ponieważ przeprowadziłem pewne badania i mam na myśli, że różni się on od przykładu do przykładu.

Kiedy aktualizuję swój stół, muszę zadeklarować wszystkie pola lub czy wystarczy zaktualizować jedno pole?

Każda informacja byłaby bardzo pomocna.

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> 

klas/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

Czy próbowałeś zobaczyć, co się dzieje? –

+2

real_escape_string() nie jest konieczne dla przygotowanych instrukcji. – Danijel

+2

W twoim SQL pierwszy parametr jest treścią, a drugi jest identyfikatorem. Kiedy wywołujesz bind_param, zmieniłeś kolejność - spróbuj zamienić kolejność w bind_param – andrewsi

Odpowiedz

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); 

Re pytania:

dostaję wiadomość od mojego skryptu mówiąc 0 Wiersze wstawione

Wynika to z faktu, że po związaniu ich kolejność parametrów została odwrócona. Przeszukujesz więc kolumnę id dla wartości liczbowej twoich $ content, która prawdopodobnie jest interpretowana jako 0. Więc klauzula WHERE UPDATE pasuje do zera wierszy.

Czy muszę zadeklarować wszystkie pola lub czy wystarczy zaktualizować jedno pole?

Można ustawić tylko jedną kolumnę w instrukcji UPDATE. Pozostałe kolumny nie zostaną zmienione.

+0

Do czego służy pierwszy argument w wierszu 10? –

+0

@AnnonomusPerson: jedna litera dla każdego parametru. 's' dla napisu, 'i' dla liczby całkowitej, itp. Przeczytaj http://php.net/manual/en/mysqli-stmt.bind-param.php –

+0

'@ BillKarwin' Dla mnie' $ status variable' pokazuje Wartość 'integer'. Użyłem 'echo $ status', a wyjście to' 1'. –

1

W rzeczywistości przygotowane oświadczenia nie są tak skomplikowane, jak wszyscy myślą. Wręcz przeciwnie, przygotowany kod oparty na oświadczeniu jest najbardziej prostym i uporządkowanym sposobem na wykonanie zapytania. Weź, na przykład, swój kod.

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; 
} 

Jak widać, kod może być bardzo prosty i zwięzły, jeśli jest używany prawidłowo!

Trzeba w zasadzie tylko trzy linie:

  1. przygotować swoje zapytanie zastępcze
  2. następnie powiązać zmienne (ustawienie poprawnych typów dla nich pierwszy, gdzie „i” oznacza liczbę całkowitą, „s” na ciąg i tak dalej)
  3. A następnie wykonaj zapytanie.

Tak prosty jak 1-2-3!

Należy pamiętać, że zamiast sprawdzać ręcznie wszystkie wyniki funkcji, można raz na zawsze ustawić set the reporting mode for mysqli.Aby to zrobić, należy dodać następującą linię przed mysqli_connect()/new mysqli:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

wynik będzie prawie taka sama jak w przypadku trigger_error ale bez jednej dodatkowej linii kodu!

Powiązane problemy