第 1 行的 ''')' 附近的 SQL 语法有错误

Posted

技术标签:

【中文标题】第 1 行的 \'\'\')\' 附近的 SQL 语法有错误【英文标题】:You have an error in your SQL syntax near ' '')' at line 1第 1 行的 ''')' 附近的 SQL 语法有错误 【发布时间】: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>&copy; 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 不会。 【参考方案1】:

正如我在评论中提到的,这一行正在重写你的变量:

if(!isset($user_id) || $user_id = "" || !isset($task) || $task = "")

改为使用空函数:

if(empty($user_id) || empty($task))

除非其中一个为 0 或 null,否则这将起作用并且您的变量将通过。

【讨论】:

这实际上是解决方案。检查条件到底如何?我认为 $queryinsert 是问题所在。 看起来是这样,直到您回显查询并且您的变量为空。 if 语句通过,因为两个变量都已设置,并且空白字符串分配有效。 我也应该包括isset检查条件吗?还是一样? 不,是一样的。 empty 检查以确保变量已设置并且它不是 null 或 false 并且不包含空字符串或 0。【参考方案2】:

这可以工作$querydisplay = "SELECT * FROM todo WHERE user_id='$user_id'";

【讨论】:

错误出在他们的 INSERT 查询上,而不是他们的 SELECT 查询上。错误中的括号给出了它。 @aynber 那么您是否尝试用引号括起 $user_id 或删除围绕 $task 的引号 你为什么问我?这不是我的代码。我只是指出哪个查询引发了错误。 $querydisplay 没有问题。【参考方案3】:

可能是这样的:

$queryinsert = "INSERT INTO todo (user_id, task) VALUES ('" . $user_id . "', '" . $task . "')";

【讨论】:

我收到了这个错误。错误:无法添加或更新子行:外键约束失败(todolist.todo, CONSTRAINT fk_user FOREIGN KEY (user_id) 参考user (user_id) ON DELETE NO ACTION ON UPDATE级联) 这意味着我们离答案又近了一步 :) 有关此外键约束业务的更多信息,请参阅 here

以上是关于第 1 行的 ''')' 附近的 SQL 语法有错误的主要内容,如果未能解决你的问题,请参考以下文章

MySQL Workbench:查询中的错误(1064):第 1 行的“VISIBLE”附近的语法错误

以下SQL中语句,为啥老是报错( '*' 附近有语法错误)??

-e 第 1 行,“'755']”附近的 nmake 语法错误

第 14 行 '' 附近的 SQL 语法错误

检查与MariaDB服务器版本对应的手册,以便在“数组”SQL附近使用正确的语法

'的语法错误?