我的SQL语法出错?似乎无法找到它

时间:2017-05-19 04:07:36

标签: php mysql mysqli

我可能会发疯,但我发誓下面的代码昨天正在工作,现在它无法正常工作。我注意到它没有插入数据库,我收到错误:

You have an error in your SQL syntax; check the manual that corresponds 
  to your MariaDB server version for the right syntax to use near 's',
   '39866', '9780448438047', 'Miss Spider's Sunny Patch Friends: Fun with Bounc' at line 1

以下是查询。我知道我没有使用转义字符串/预处理语句,但那是因为这只是一个localhost数字cruncher。

$insert = mysqli_query($connect, "INSERT INTO books 
                 (subject, booknum, isbn, title, author, publisher, year, 
                  format, mark, hurt, pubprice, srp, avail) VALUES
                 ('$subject', '$booknumber', '$isbn', '$title', '$author', 
                  '$publisher', '$year', '$format', '$mark', '$hurt', 
                  '$pubprice', '$srp', '$avail')") or die(mysqli_error($connect));

似乎甚至评论了这一行并且正在做:

$insert1 = mysqli_query($connect, "INSERT INTO books (subject) VALUES
                      ('$subject')") or die(mysqli_error($connect));

也会导致错误。我猜这意味着错误实际上位于我的数据库连接本身?我正在使用:

<?php
$connect = mysqli_connect("localhost", "root", "", "wholesale");
if(mysqli_connect_errno()) {
    echo "Failed to connect. Error: " . mysqli_connect_error();
}

页面顶部包含以下内容:

include 'db.php';

但就像我说的那样,这个应用程序昨晚正在运行。从那以后发生的所有变化都是我关闭并在我的电脑上重新启动xampp,据我所知。

3 个答案:

答案 0 :(得分:0)

根据此部分to use near 's', '39866',判断我假设$subject中包含的值包含单引号,例如它可能等于:&#34;这些是单词&#39; s&# 34 ;.这就是创建错误的原因。您需要转义它们(使用mysqli_real_escape_string()或类似的东西),或使用预准备语句。

答案 1 :(得分:0)

您需要立即重新考虑插入数据的方式。该错误告诉您问题与此值有关:

  

&#39;蜘蛛小姐的阳光补丁朋友:与Bounc的乐趣&#39;

这里书名中的撇号打破了SQL查询。这指出了一个更大的问题,虽然这是改变查询的意外值。你可以先简单地逃避这些价值,但这会掩盖一个严重的问题。您的代码对SQL注入开放。

您应该使用参数化查询:How can I prevent SQL injection in PHP?

答案 2 :(得分:-1)

您应该清理输入,在插入时使用htmlentities,从数据库中选择时使用html_entity_decode

$subject = htmlentities($subject);
$booknumber = htmlentities($booknumber); //and etc.

    $insert = mysqli_query($connect, "INSERT INTO books (subject, booknum, isbn, title, author, publisher, year, format, mark, hurt, pubprice, srp, avail) VALUES ('$subject', 'htmlentities($booknumber', '$isbn', '$title', '$author', '$publisher', '$year', '$format', '$mark', '$hurt', '$pubprice', '$srp', '$avail')") or die(mysqli_error($connect));