Php 我的错误:您的SQL语法有错误;检查与MySQL服务器版本对应的手册

Php 我的错误:您的SQL语法有错误;检查与MySQL服务器版本对应的手册,php,mysql,mysqli,Php,Mysql,Mysqli,我在我的博客上发现了这个问题。当我在textik中使用单引号时,会出现此错误 插入clangky(nadpis,textik,datum,autor,kategorie)值(?,,,,,?) 您的SQL语法有错误;检查与MySQL服务器版本相对应的手册,以了解第2行“?,?,?,?,?)”附近使用的正确语法 我已经知道,由于SQL注入,您不能在字符串中使用单引号。所以我正在努力修复它。我尝试了这么多的教程,但没有任何帮助 <?php if (isset($_POST["btn"]

我在我的博客上发现了这个问题。当我在
textik
中使用单引号时,会出现此错误

插入
clangky
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();
}


?>

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

使用此

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

您正在尝试准备它,并使用
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());
}

谢谢,但我需要博客中没有“斜杠”的文字,我已经试过了。然后使用斜杠(“谁是彼得·格里芬?”);当你展示它的时候。这太恶心了。OP正在使用,所以这种双重转义是无用的和有害的。非常感谢你的帮助,它正在工作:)上帝保佑你,我建议你避免手动错误报告。这是一个不同的问题,应该在别处定义。请检查在使用准备好的语句时不需要转义字符串。