我正在建立一个简单的系统,该系统将用户输入的形式输入到new_post.php文件中,然后使用POST将该信息发送到index.php。然后index.php接收到该信息,如果存在,它将发布,否则将不会发布。但这根本行不通!它在error_log中给出了某种“ PHP注意:未定义的索引:”错误。
我已经尝试检查SQL,但这很好,除非我没有发现任何问题。但是这里有一些代码,所以您的专家可以为我提供帮助:
INDEX.PHP:
if($_POST["title"] != null) {
if($_POST["author"] != null) {
if($_POST["content"] != null) {
$sql = "INSERT INTO posts (title, content, author) VALUES ('" . $_POST["title"] . "', '" . $_POST["content"] . "', '" . $_POST["author"] . "'');";
mysqli_query($connection, $sql);
}
}
}
NEW_POST.PHP:
<form action="index.php" style="font-size: 3vw; margin-left: 25%; margin-right: 25%; width: 50%;" method="POST">
Title:<br>
<input type="text" name="title" value="" style="font-size: 2vw;">
<br>
Your Name:<br>
<input type="text" name="author" value="" style="font-size: 2vw;">
<br>
Content<br>
<textarea type="text" name="content" value="" style="resize: none; font-size: 2vw;"></textarea>
<br>
<br><br>
<input type="submit" value="Submit">
</form>
我希望它能够执行以下操作:如果用户没有填写表格,不说任何内容,但也不会张贴任何内容,然后重定向到index.php,并且,如果表格实际上被正确填写,它只会将其张贴并重定向到index.php页面。
实际发生的是,与是否正确填充无关,它只是不发布并重定向到index.php文件而没有该帖子出现。
答案 0 :(得分:4)
从不允许用户直接在SQL查询中输入。这就是您获得SQL注入的方式。您应该始终使用参数化的预处理语句。这也将确保您再也不会遇到引号不匹配的问题。在准备好的语句中,您不需要引用或转义任何输入。
此外,您实际上并未检查脚本中是否设置了值,这就是为什么您会看到未定义的错误的原因。使用isset()
进行检查。
这是带有准备好的语句的固定代码。
if(isset($_POST["title"], $_POST["author"], $_POST["content"])){
$stmt = $connection->prepare('INSERT INTO posts (title, content, author) VALUES (?,?,?)');
$stmt->bind_param('sss', $_POST["title"], $_POST["author"], $_POST["content"]);
$stmt->execute();
}
并且一如既往地记得启用错误报告:How to get the error message in MySQLi?
答案 1 :(得分:1)
替换
$sql = "INSERT INTO posts (title, content, author) VALUES ('" . $_POST["title"] . "', '" . $_POST["content"] . "', '" . $_POST["author"] . "'');";
与
$sql = "INSERT INTO posts (title, content, author) VALUES ('" . $_POST["title"] . "', '" . $_POST["content"] . "', '" . $_POST["author"] . "');";
您还有一个单引号
“'');”;