您的SQL语法错误中有错误吗?

2022-06-21 00:00:00 php mysqli

我有一个函数,其中有一个相当简单的SQL,它在语法中给出了不可能有错误的语法。

function createPetition($conn, $pName, $pTarget, $pDescription, $userId) {
    $sql = "INSERT INTO petitions (petitionName, petitionTarget, petitionDescription, usersId) VALUES (?, ?, ?, ?);";
    //$sql2 = "INSERT INTO petitions (`petitionDate`) VALUES (NOW());";
    $stmt = mysqli_stmt_init($conn);
    if (!mysqli_stmt_prepare($stmt, $sql)) {
        header("location: ./index.php?error=stmtfailed");
        exit();
    }

    /*if (!mysqli_stmt_prepare($stmt, $sql2)) {
    header("location: ./index.php?error=stmtdatefailed");
    exit();
    }*/
    
    mysqli_stmt_bind_param($stmt, "ssss", $pName, $pTarget, $pDescription, $userId);

    if (!mysqli_query($conn, $sql)) {
        echo "Error description: " . mysqli_error($conn);
    } else {
        mysqli_stmt_execute($stmt);
        mysqli_stmt_close($stmt);
        header("location: ./petitionfinal.php?error=none");
        exit();
    }
}

其结果为

错误描述:您的SQL语法中有一个错误;请查看与您的MariaDB服务器版本对应的手册,以了解要使用的正确语法。第1行

当没有明显的错误时。


解决方案

问题是您的代码中有一个流氓mysqli_query()。您需要将其删除。

您可能错过了它,因为您有太多的代码。你应该把它的大部分去掉。你真的不需要所有这些。

以下是代码应该是什么样子:

function createPetition(mysqli $conn, $pName, $pTarget, $pDescription, $userId) {
    $sql = "INSERT INTO petitions (petitionName, petitionTarget, petitionDescription, usersId) VALUES (?, ?, ?, ?);";
    
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("ssss", $pName, $pTarget, $pDescription, $userId);
    $stmt->execute();

    header("location: ./petitionfinal.php?error=none");
    exit();
}

但是,在函数内部设置重定向不是一个好主意。我强烈建议将其从函数中删除。

function createPetition(mysqli $conn, $pName, $pTarget, $pDescription, $userId) {
    $sql = "INSERT INTO petitions (petitionName, petitionTarget, petitionDescription, usersId) VALUES (?, ?, ?, ?);";
    
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("ssss", $pName, $pTarget, $pDescription, $userId);
    $stmt->execute();
}

// when you call
createPetition($conn, $pName, $pTarget, $pDescription, $userId);

header("location: ./petitionfinal.php?error=none");
exit();

看看它有多好。现在发现错误要容易得多。

如果您想知道有关错误的信息,我必须向您推荐How to get the actual mysql error and fix it?

相关文章