Подготовленный отчет PHP UPDATE

Привет, я пытаюсь изучить правильный способ использования подготовленных инструкций, чтобы избежать инъекций SQL и т. Д.

Когда я выполняю скрипт, я получаю сообщение от моего скрипта, говорящего «0 Rows Inserted», я ожидаю, что это скажет 1 Rows Inserted и, конечно же, обновит таблицу. Я не совсем уверен в своем подготовленном заявлении, поскольку я провел некоторое исследование, и я имею в виду, что он варьируется от примера к примеру.

Когда я обновляю таблицу, мне нужно объявить все поля или нормально обновлять одно поле?

Любая информация была бы очень полезной.

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

 $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 Rows Inserted

Это связано с тем, что вы изменили порядок параметров, когда вы их связали. Итак, вы ищете столбец id для числового значения вашего $ content, который, вероятно, интерпретируется как 0. Таким образом, предложение WHERE UPDATE соответствует нулевым строкам.

мне нужно объявить все поля или это нормально, чтобы просто обновить одно поле?

В инструкции UPDATE можно установить только один столбец. Другие столбцы не будут изменены.

На самом деле подготовленные заявления не так сложны, как все думают. Совсем наоборот, готовый код на основе инструкций является самым простым и аккуратным способом выполнения запроса. Возьмите, к примеру, свой код.

 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. Затем привяжите переменные (сначала установите для них правильные типы, где «i» означает целое число, «s» для строки и т. Д.),
  3. А затем выполните запрос.

Так же просто, как 1-2-3!

Обратите внимание, что вместо проверки результата каждой функции вручную вы можете установить режим отчетности для mysqli один раз для всех. Для этого добавьте следующую строку перед mysqli_connect() / new mysqli :

 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

результат будет почти таким же, как с trigger_error, но без отдельной строки кода!