首页 > 解决方案 > 我的错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册

问题描述

我在我的博客中遇到了问题。textik当我在此错误中使用单引号时。

插入clanky( nadpis, textik, datum, autor, kategorie) 值 (?, ?, ?, ?, ?);
您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的 '?, ?, ?, ?, ?)' 附近使用正确的语法

我已经知道由于 SQL 注入,您不能在字符串中使用单引号。所以我试图修复它。我尝试了很多教程,但没有任何帮助。

    <?php

if (isset($_POST["btn"])) {

$conn = new mysqli($servername, $username, $password, $dbname);

if($conn->connect_error){
die("ERROR: Could not connect. " . $conn->connect_error);
}

$nadpis = mysqli_real_escape_string($conn, $_POST['nadpis']);
$textik = mysqli_real_escape_string($conn, $_POST['textik']);
$datum = mysqli_real_escape_string($conn, $_POST['datum']);
$autor = mysqli_real_escape_string($conn, $_POST['autor']);
$kategorie = mysqli_real_escape_string($conn, $_POST['kategorie']);

$sql = "INSERT INTO `clanky` (`nadpis`, `textik`, `datum`, `autor`, `kategorie`)
        VALUES (?, ?, ?, ?, ?);";
// '". $_POST['nadpis']."','". $_POST['textik']."','". $_POST['datum']."','". $_POST['autor']."','". $_POST['kategorie']."'
$stmt = mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmt, $sql)){
    echo "SQL error";
} else {
    mysqli_stmt_bind_param($stmt, "ssiss", $nadpis, $textik, $datum, $autor, $kategorie);
    mysqli_stmt_execute($stmt);
}

if (mysqli_query($conn, $sql)) {
    echo "New Record added";
    header("Location: https://www.globalgraphicdesign.eu/welcome.php");
}else {
    echo "Error" . $sql . "" . mysqli_error($conn);
}
$conn->close();
}


?>

我应该将您重定向到欢迎页面。

标签: phpmysqlmysqli

解决方案


您正在尝试准备它,并使用query(),从而尝试执行它两次。使用时会失败,因为那里不允许使用query()占位符。?使用准备好的语句时,您也不应该转义输入。您也不应该在header()通话前输出任何内容。您还可以启用 MySQLi 来引发异常,这使得错误处理更加容易。

您的整个片段可以简化为以下内容。

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
    $conn = new mysqli($servername, $username, $password, $dbname);
    if (isset($_POST["btn"])) {
        $sql = "INSERT INTO `clanky` (`nadpis`, `textik`, `datum`, `autor`, `kategorie`)
                VALUES (?, ?, ?, ?, ?);";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("sssss", $_POST['nadpis'], $_POST['textik'], $_POST['datum'], $_POST['autor'], $_POST['kategorie']);
        $stmt->execute();
        header("Location: https://www.globalgraphicdesign.eu/welcome.php");
        $stmt->close();
        exit;
    }
} catch (Exception $e) {
    echo "Something went wrong. Please try again later";
    error_log($e->getMessage());
}

推荐阅读