PHP (pdo) ограничивает изменения в базе данных и меняет HTML - PullRequest
0 голосов
/ 20 декабря 2018

Я новичок в php, и у меня возникла проблема, которую я не знаю, как исправить, я сделал HTML-форму, которая должна изменить имя базы данных

<div class="form-group">
    <form action="name.php" method="post">
        <input type="text" class="form-control" name="name">
        <input type="submit" value="Submit" name="submit">
    </form>
</div>

HTML-форма такжеподключен к PHP скрипт редактирования

<?php

$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "tbl_product";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql ="UPDATE tbl_product SET name='$name' WHERE id = ID LIMIT 1";

    // Prepare statement
    $stmt = $conn->prepare($sql);

    // execute the query
    $stmt->execute();

    // echo a message to say the UPDATE succeeded
    echo $stmt->rowCount() . " records UPDATED successfully";
    header("Refresh:0; url=products.php");
    }
catch(PDOException $e)
    {
    echo $sql . "<br>" . $e->getMessage();
    }

$conn = null;
?>      

Запускаемый мной скрипт не изменит имя базы данных, а при изменении он изменит все имена баз данных.На данный момент похоже, что скрипт работает нормально, но ничего не произошло.Мне нужно ограничить изменение данных из базы данных, чтобы одно изменение не изменило все.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Ваш SQL-запрос некорректен.Согласно быстрому тесту, который я выполнил на локальном экземпляре MySQL, условие WHERE id = ID кажется всегда верным (вероятно, оно оценивается как 1=1. Поэтому ваш запрос такой же, как UPDATE tbl_product SET name='$name' LIMIT 1, и из-за этогоон обновляет все записи без LIMIT.

Кроме того, вы неправильно используете подготовленные операторы (что не является частью проблемы, но вы все равно должны делать это правильно).

$id = 1; // assign the id of the record you want to change
$name = "the new name";
$sql ="UPDATE tbl_product SET name = :name WHERE id = :id";

// Prepare statement
$stmt = $conn->prepare($sql);

// execute the query and bind values to placeholders in the query
$stmt->execute([
    ':name' => $name,
    ':id' => $id
]);

Таким образом, внедрение SQL невозможно, и вы правильно используете идентификатор в своем запросе и можете удалить часть LIMIT.

Изменить 1 (Перенаправление):

Перенаправлениеи отправка заголовков - это совсем другая тема. По сути, вы бы сделали это следующим образом (см. также this для получения более подробной информации):

header('Location: products.php');
exit;

Также вы не можете использовать echo до header. Это выдаст ошибку. См. здесь для получения дополнительной информации.

Редактировать 2 (Изменение случайных записей):

Изменение случайных записейкажется странным приложением, ноон, вероятно, будет работать с использованием этого запроса вместо этого:

UPDATE tbl_product SET name = :name ORDER BY RAND() LIMIT 1

Вам также необходимо удалить часть :id из вызова $stmt->execute, так как в вашем запросе больше нет параметра: id.

0 голосов
/ 20 декабря 2018

Вы должны установить идентификатор в предложении where, тогда он обновит только одну строку, соответствующую идентификатору. Вам не нужно устанавливать LIMIT 1.

$sql ="UPDATE tbl_product SET name='$name' WHERE id = $id";

Вы можете получить идентификатор из скрытого ввода вформа.

<div class="form-group">
    <form action="name.php" method="post">
        <input type="hidden" class="form-control" name="id" value="<?php echo $id; ?>">
        <input type="text" class="form-control" name="name">
        <input type="submit" value="Submit" name="submit">
    </form>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...