INSERT INTO sql查询使用的是变量字符串,而不是字段名


INSERT INTO sql query is using variable string rather than field name

围绕这个INSERT INTO感到非常困惑。它应该在表中插入三个字段,userIDactivateKeyisActivated

activateKey是一个25个字母的随机生成密钥,如63n20kw24ba1mlox34e8n2awv

userID来自另一个表,由auto_increment设置。

在此阶段,isActivated始终为0。

这似乎是一个非常简单的INSERT语句

if (!mysqli_query($con,"INSERT INTO activations (userID,activationKey,isActivated) VALUES (".$userID.",".$activateKey.",'0')"))
  {
    echo("Error description: " . mysqli_error($con));
  }

但是,当我包含$activateKey字段时,它不起作用。它所做的是尝试将字符串变量$activateKey作为列名进行搜索。我得到的错误是:

Error description: Unknown column '63n20kw24ba1mlox34e8n2awv' in 'field list'

当然,没有63n20kw24ba1mlox34e8n2awv这样的列,这是我试图插入的数据,因此它位于VALUES部分。有什么想法吗?为什么要把它作为列名来搜索?

编辑以澄清:var是activateKey,列名是activationKey

我会把查询放在另一个变量中以避免混淆,PHP会自动用双引号替换字符串中的变量名。

试试这个:

<?php
  $query = "INSERT INTO activations (userID,activationKey,isActivated) VALUES($userID,'$activateKey','0')
  if (!mysqli_query($con,$query)
   {
     echo("Error description: " . mysqli_error($con));
   }

您没有用引号将值括起来,这就是为什么它们被解释为变量名的原因。使用单引号,如下所示:

"INSERT INTO activations (userID,activationKey,isActivated) VALUES
   ('".$userID."','".$activateKey."','0')"

但是,请注意,将查询字符串串在一起会使您面临SQL注入攻击,如果这是代码中的一个问题,则应该使用参数化查询。事实上,使用参数化查询总是更好的。

将查询更改为:

"INSERT INTO activations 
        (userID,activationKey,isActivated) 
 VALUES ('$userID','$activateKey','0')"

您不需要使用串联(.)运算符,因为变量将被插值到字符串中。

单引号告诉mysql将变量视为文字,而不是列名。

附带说明一下,您最好使用参数化查询。请参阅如何防止PHP中的SQL注入?

已解决!

这是一个没有正确地将动态字段(VALUES部分中的变量)包装在tick:中的情况

if (!mysqli_query($con,"INSERT INTO activations (userID,activationKey,isActivated) VALUES ('".$userID."','".$activateKey."','0')"))

代替

if (!mysqli_query($con,"INSERT INTO activations (userID,activationKey,isActivated) VALUES (".$userID.",".$activateKey.",'0')"))

可能很难发现。变量仍然需要"在刻度中",否则它们将不会注册为字符串。

由于activationKeystring列,因此必须对$activationKey使用单引号
试用:

if (!mysqli_query($con,"INSERT INTO activations (userID,activationKey,isActivated)
     VALUES (".$userID.",'".$activateKey."','0')"))