尝试插入null时为什么会出现SQL错误?

时间:2017-04-17 09:22:38

标签: php mysql mysqli

当尝试执行以下插入时,我收到错误

  

您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   靠近' 2,3,4,5)'在第1行

$insertSQL = sprintf("INSERT INTO applicants (id_file, address_file, photo, transcript, essay1, essay2) VALUES (%s, %s, %s, %s, %s, %s)",
                       $passport_file,
                       $address_file,
                       $photo_file,
                       $transcript_file,
                       $essay1_file,
                       $essay2_file);

  mysqli_select_db($STCi, $database_STC);
  $Result1 = mysqli_query($STCi, $insertSQL) or die(mysql_error($STCi));

使用以下代码

设置这些变量
    $_FILES['id_file']['error'] == UPLOAD_ERR_OK?$passport_file=filesDB('id_file'):$passport_file = NULL;
    $_FILES['address_file']['error'] == UPLOAD_ERR_OK?$address_file = filesDB('address_file'):$address_file = NULL;
    $_FILES['photo']['error'] == UPLOAD_ERR_OK?$photo_file = filesDB('photo'):$photo_file = NULL;
    $_FILES['transcript']['error'] == UPLOAD_ERR_OK?$transcript_file = filesDB('transcript'):$transcript_file = NULL;
    $_FILES['essay1']['error'] == UPLOAD_ERR_OK?$essay1_file = filesDB('essay1'):$essay1_file = NULL;
    $_FILES['essay2']['error'] == UPLOAD_ERR_OK?$essay2_file = filesDB('essay2'):$essay2_file = NULL;

filesDB是我自己的函数我正在运行以重命名上传的文件并将它们移动到正确的位置,任何正在运行的文件都可以。问题出现在' address_file'因为它是一个可选文件,每当没有上传任何内容时,我都会收到错误。

所以基本上MySQL在我尝试插入NULL时会抛出错误,或者我错过了一些明显的东西?

CREATE TABLE `applicants` (
  `applicant_id` int(11) NOT NULL AUTO_INCREMENT,
  `id_file` varchar(200) CHARACTER SET latin1 DEFAULT NULL,
  `address_file` varchar(200) CHARACTER SET latin1 DEFAULT NULL,
  `photo` varchar(200) CHARACTER SET latin1 DEFAULT NULL,
  `name_change` varchar(200) CHARACTER SET latin1 DEFAULT NULL,
  `transcript` varchar(200) CHARACTER SET latin1 DEFAULT NULL,
  `english_result` varchar(200) CHARACTER SET latin1 DEFAULT NULL,
  `essay1` varchar(200) CHARACTER SET latin1 DEFAULT NULL,
  `essay2` varchar(200) CHARACTER SET latin1 DEFAULT NULL,
  `stage` varchar(20) DEFAULT 'New',
  `date_applied` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`applicant_id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;

4 个答案:

答案 0 :(得分:2)

使用准备好的stamement而不是使用sprintf手动创建查询:

if ($stmt = mysqli_prepare($STCi, "INSERT INTO applicants 
                (id_file, address_file, photo, transcript, essay1, essay2) 
                VALUES (?, ?, ?, ?, ?, ?)"))
{
    mysqli_stmt_bind_param($stmt, "ssssss",
                           $passport_file,
                           $address_file,
                           $photo_file,
                           $transcript_file,
                           $essay1_file,
                           $essay2_file);

    mysqli_stmt_execute($stmt) or die(mysql_error($STCi));;
}

答案 1 :(得分:0)

您正在执行sprintf,并插入“NULL”,这意味着您的PHP变量为NULL。

sprintf

之后,您的SQL查询应该如下所示
INSERT INTO applicants (id_file, address_file, photo, transcript, essay1, essay2) 
VALUES (null, 2,3,4,5,6)"

但它看起来像这样:

INSERT INTO applicants (id_file, address_file, photo, transcript, essay1, essay2) 
VALUES ( , 2,3,4,5,6)"

这是一个错误。

要解决此问题,您实际上可以在此处插入字符串null(如果您在不使用'的情况下插入它,则不会将其视为字符串,因为您没有使用预准备语句)。所以你的查询看起来像这样:

    INSERT INTO applicants (id_file, address_file, photo, transcript, essay1, essay2) 
VALUES ( null , 2,3,4,5,6)"

通过不为变量指定NULL来执行此操作,但只需指定'null'即可。通过首先回显您的查询来验证。它应该在null中没有任何引号。

更好的方法是使用实​​际准备好的语句:http://php.net/manual/en/mysqli.prepare.php

答案 2 :(得分:0)

我认为你混淆了php null值和mysql null值 - 它们不是一回事。我想你想要的东西:

$ _ FILES [' id_file'] ['错误'] == UPLOAD_ERR_OK?$ passport_file = filesDB(' id_file'):$ passport_file =&#39 ; NULL&#39 ;;

注意我引用了" null"。这将把一个文本null放入sql语句中,然后将其解释为关键字' null'在mysql中。 如果你将php赋值保留为null值,那么当它需要文本字符串' null'时,会将一些空白的东西传递给mysql。 :)

答案 3 :(得分:-1)

为了插入空值,您应该使用预准备语句

$stmt = $STCi->prepare("INSERT INTO applicants (id_file, address_file, photo, transcript, essay1, essay2) VALUES (?, ?, ?, ?, ?, ?)");
$stmt->bind_param("ssssss",
                       $passport_file,
                       $address_file,
                       $photo_file,
                       $transcript_file,
                       $essay1_file,
                       $essay2_file);
$stmt->execute();
相关问题