【发布时间】:2017-09-28 21:11:53
【问题描述】:
各位,我收到一条错误消息:
错误:您的 SQL 语法有错误;检查手册 对应于您的 MariaDB 服务器版本,以便使用正确的语法 在第 1 行的 ''')' 附近
从此代码中,每当我点击添加按钮时
todo.php
<?php
include '../database/database.php';
session_start();
$user_id = $_SESSION['user_id'];
$querydisplay = "SELECT * FROM todo WHERE user_id=$user_id";
$result = mysqli_query($conn, $querydisplay);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>To Do List</title>
<!-- Bootstrap core CSS -->
<link href="../assets/css/bootstrap.css" rel="stylesheet">
<!-- Custom styles for this template -->
<link href="../assets/css/custom.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="header clearfix">
<nav>
<ul class="nav nav-pills pull-right">
<li role="presentation" class="active"><a href="#">Home</a></li>
<li role="presentation"><a href="#">About</a></li>
<li role="presentation"><a href="#">Contact</a></li>
</ul>
</nav>
<h3 class="text-muted">To Do List <?php echo $_SESSION['name'];?></h3>
</div>
<div class="panel panel-default">
<div class="panel-heading"></div>
<div class="panel-body">
<div class="row">
<div class="col-md-2"></div>
<div class="col-md-8">
<ul class="list-group text-left">
<?php while($data=mysqli_fetch_array($result)) :?>
<?php if($data['done'] == 0) : ?>
<li class="list-group-item"><span class="task_list"><?php echo $data['task'] ?></span><a href="../models/done_process.php?id=<?php echo $data['list_id']?>"><span class="label label-default">Mark As Done</span></a></li>
<?php else : ?>
<li class="list-group-item"><span class="task_list"><strike><?php echo $data['task'] ?></strike></span><a href="../models/delete_process.php?id=<?php echo $data['list_id']?>"><span class="label label-danger">Delete</span></a></li>
<?php endif; ?>
<?php endwhile; ?>
</ul>
<form class="form-horizontal" method="POST" action="../models/newtask_process.php">
<div class="form-group">
<div class="col-sm-12">
<input name="newtask" type="text" class="form-control" placeholder="Enter New Task">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button name="submit" type="submit" class="btn btn-sm btn-primary">Add</button>
</div>
</div>
</form>
</div>
<div class="col-md-2"></div>
</div>
</div>
</div>
<footer class="footer text-center">
<p>© Company 2017</p>
</footer>
</div> <!-- /container -->
</body>
</html>
newtask_process.php
<?php
include '../database/database.php';
session_start();
if(isset($_POST['submit']))
$user_id = $_SESSION['user_id'];
$task = mysqli_real_escape_string($conn, $_POST['newtask']);
if(!isset($user_id) || $user_id = "" || !isset($task) || $task = "")
{
echo '<script language="javascript">alert("You Write an Empty Task. Process Failed.");
document.location="../views/todo.php";</script>';
}
else
{
$queryinsert = "INSERT INTO todo (user_id, task) VALUES ($user_id, '$task')";
if(mysqli_query($conn, $queryinsert))
{
header("Location: ../view/todo.php");
exit();
}
else
{
die ('Error : ' .mysqli_error($conn));
}
}
mysqli_close($conn);
?>
请帮我调试这个插入查询或类似的东西。
我什至还没有转到更新或删除查询。
我已经看起来像这样的类似问题,并且我已经尝试过,但没有成功,
也许我想念一些东西
我知道这不是执行查询的安全方式(我不使用 PDO 或类似的东西)。
但我只是想掌握它,也许稍后我会转向 PDO 和 OOP 概念。
【问题讨论】:
-
哪个查询失败了?您的代码对 SQL 注入开放,这意味着您并没有真正控制正在使用的语法,并且值可能会在运行时更改该语法。发生错误时,正在执行的实际查询是什么?也就是说,替换变量后,发送到数据库的查询结果是什么?
-
你能做到吗
echo $queryinsert; -
您对 SQL 注入持开放态度。由于您使用的是 mysqli,因此请利用 prepared statements 和 bind_param。这也将解决您遇到的讨厌的引用问题。
-
我相信 $queryinsert 是失败的
-
是的。您可以回显
$queryinsert以查看错误所在。我猜这是一个引用问题。使用带有 bind_param 的准备好的语句将修复它,而mysqli_real_escape_string不会。