webentwicklung-frage-antwort-db.com.de

PHP UPDATE vorbereitete Anweisung

Hallo, ich versuche zu lernen, wie man vorbereitete Anweisungen richtig einsetzt, um SQL-Injektionen usw. zu vermeiden.

Wenn ich das Skript ausführe, wird in meinem Skript die Meldung 0 Zeilen eingefügt angezeigt. Ich erwarte, dass dies 1 Zeilen enthält, und aktualisiere natürlich die Tabelle. Ich bin mir bei meiner vorbereiteten Aussage nicht ganz sicher, da ich einige Nachforschungen angestellt habe und sie von Beispiel zu Beispiel variiert.

Wenn ich meine Tabelle aktualisiere, muss ich alle Felder deklarieren oder kann ich nur ein Feld aktualisieren?

Jede Information wäre sehr hilfreich.

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>

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

                                }                   
                            }
18
001221
$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);

Zu Ihren Fragen:

Mein Skript meldet mir, dass 0 Zeilen eingefügt wurden

Dies liegt daran, dass Sie die Reihenfolge der Parameter beim Binden umgekehrt haben. Sie suchen in der Spalte id nach dem numerischen Wert Ihres $ content, der wahrscheinlich als 0 interpretiert wird. Die WHERE-Klausel von UPDATE entspricht also null Zeilen.

muss ich alle Felder deklarieren oder ist es in Ordnung, nur ein Feld zu aktualisieren?

Es ist in Ordnung, nur eine Spalte in einer UPDATE-Anweisung festzulegen. Andere Spalten werden nicht geändert.

28
Bill Karwin

In der Tat sind vorbereitete Aussagen nicht so komplex, wie jeder denkt. Ganz im Gegenteil, ein vorbereiteter anweisungsbasierter Code ist die einfachste und übersichtlichste Möglichkeit, eine Abfrage auszuführen. Nehmen Sie zum Beispiel Ihren Code.

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

Wie Sie sehen, könnte der Code bei richtiger Verwendung sehr einfach und prägnant sein!

Sie benötigen grundsätzlich nur drei Zeilen:

  1. Bereiten Sie Ihre Abfrage mit Platzhaltern vor
  2. Binden Sie dann die Variablen (indem Sie zuerst die richtigen Typen festlegen, wobei "i" für Ganzzahl steht, "s" für Zeichenfolge usw.).
  3. Führen Sie dann die Abfrage aus.

So einfach wie 1-2-3!

Anstatt das Ergebnis jeder Funktion manuell zu überprüfen, können Sie den Berichtsmodus für mysqli festlegen ein für alle Mal. Fügen Sie dazu vor mysqli_connect()/new mysqli Die folgende Zeile ein:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

das Ergebnis ist fast dasselbe wie bei trigger_error, jedoch ohne eine einzige zusätzliche Codezeile!

4