PHP вставка в ошибку

0

Я начал изучать начало кодирования с помощью HTML, CSS и php. Я создал базовую форму, чтобы проверить свое мастерство. Тем не менее, я застрял в этом. Можете ли вы мне помочь?

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

<?php

if ($_SERVER["REQUEST_METHOD"] == "POST") {

    $mysql_host = "";
    $mysql_username = "";
    $mysql_password = "";
    $mysql_database = "";

    $conn = new mysqli ($mysql_host, $mysql_username, $mysql_password, $mysql_database);

    $c_name = $_POST["club_name"]; 
    $c_league = $_POST["league"];
    $c_rank = $_POST["ranking"];
    $c_prank = $_POST["previous_rank"];

    $sql = "INSERT INTO 'club_data' ('club_name', 'league', 'ranking', 'previous_rank')
    VALUES ('$c_name', '$c_league, $c_rank, $c_prank);";
    mysqli_query($conn, $sql); 

    if ($conn->query($sql) === TRUE) {
        echo "kayit islendi";
    }
    else {
        echo "Error". $sql ."<br>". $conn->error;
    }
    $conn->close();
}
?>

Изображение 174551

Каждый раз, когда я использовал форму, я получил эту ошибку.

Ошибка INSERT INTO... и т.д.

  • 4
    Вы открыты для внедрения SQL! Это огромный риск для безопасности! Не используйте свой код в реальном приложении!
  • 0
    Итак, какая у вас ошибка? Также внимательно посмотрите на свой запрос в $sql , у вас проблема с кавычками
Показать ещё 8 комментариев
Теги:

2 ответа

2

Вам не хватает котировок вокруг ваших значений вставки, здесь фиксированный sql:

$sql = "INSERT INTO 'club_data' ('club_name', 'league', 'ranking', 'previous_rank')
VALUES ('$c_name', '$c_league', '$c_rank', '$c_prank');"

Вам не хватало котировок вокруг каждого значения!

ОДНАКО, это плохой способ создания запросов к базе данных в производстве. Либо используйте mysqli_real_escape_string для дезинфекции ваших строк (каждая из ваших переменных будет нуждаться в этом лечении) или использовать подготовленные заявления.

В качестве альтернативы и способ, которым вы всегда должны использовать свою БД, - это оболочка PDO. В этом случае вы будете использовать: PDO::quote. PDO предлагает унифицированный интерфейс для самых популярных баз данных. Здесь вы можете узнать больше о PDO: http://php.net/manual/en/book.pdo.php

Кодеры предпочитают подготовленные заявления для дезинфекции своих вкладов. Однако это приводит к дополнительной связи с сервером mysql и написанию еще немного кода в php. Подготовленные утверждения в большей степени задействованы, чем обычные запросы, поскольку они кэшируются на SQL-сервере и предварительно обрабатываются ожиданием использования данных, а также с мириадными вопросительными знаками делает код очень трудным для чтения, особенно если вы начинаете работать на производстве и имеете мириад столбцов для заполнения. Здесь вы можете прочитать больше о подготовленных заявлениях: https://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html

Основной вынос:

  • никогда, НИКОГДА, НИКОГДА не сохраняйте несаминированные данные в БД! Используйте mysqli_real_escape_string или PDO::quote или подготовленные заявления, в зависимости от ситуации.
  • используйте подготовленные операторы для того, что они были созданы не только как инструмент оптового дезинфицирующего средства, используйте их, когда вы должны повторять один и тот же запрос. Особенно, если этот запрос не является вставкой, в этом случае я предлагаю вам сделать массовую вставку так: INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9); Подробнее читайте здесь: https://dev.mysql.com/doc/refman/5.7/en/insert.html. Это предостережение в том, что максимальный размер sql с вставленными значениями никогда не должен быть больше, чем max_allowed_packet config.
  • 0
    Вы много здесь освещали и стали причиной, по которой я проголосовал, но пропустил то, что все пропустили. Я разместил этот комментарий об этом под своим постом.
1

Вы должны использовать подготовленные заявления. Это не только предотвращает атаки SQL-инъекций, но и позволяет избежать проблем с цитированием, с которыми вы в настоящее время сталкиваетесь

$sql = "INSERT INTO 'club_data' ('club_name', 'league', 'ranking', 'previous_rank')
VALUES (?, ?, ?, ?);";

$result = $conn->prepare($sql);
$result->bind_param('ssss', $c_name, $c_league, $c_rank, $c_prank);
echo $result->execute() === true ? 'kayit islendi' : 'Error'.$conn->error; 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню