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

Php INSERT INTO sql查询使用变量字符串而不是字段名,php,sql,Php,Sql,对于插入到中的内容感到非常困惑。它应该在表中插入三个字段,userID,activateKey和isActivated activateKey是一个25个字母的随机生成的密钥,如63n20kw24ba1mlox34e8n2awv userID来自另一个表,由auto_increment设置 在此阶段,isActivated始终为0 这似乎是一个非常简单的INSERT语句 if (!mysqli_query($con,"INSERT INTO activations (userID,activat

对于插入到中的内容感到非常困惑。它应该在表中插入三个字段,
userID
activateKey
isActivated

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是激活键,列名是激活

我会将查询放在不同的变量中以避免混淆,PHP会自动用双引号替换字符串中的变量名

试试这个:

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

这是一种未正确地将动态字段(值部分中的变量)包装为记号的情况:

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')"))

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

您没有用引号括住这些值,这就是为什么它们会被解释为变量名。 使用单引号,如下所示:

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

但是,请注意,将查询字符串串在一起会使您暴露于以下情况:如果这是代码中的一个问题,那么您应该这样做。事实上,使用参数化查询总是更好。

因为
activationKey
字符串
列,所以必须对
$activationKey
使用单引号
尝试:

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

将查询更改为:

"INSERT INTO activations 
        (userID,activationKey,isActivated) 
 VALUES ('$userID','$activateKey','0')"
您不需要使用串联(
)运算符,因为变量将插入字符串中

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


作为补充说明,最好使用参数化查询。请参见

对不起,我将编辑。正确的var是
activateKey
。列名是
activationKey
-我将它们更改为不同的名称,以尝试避免两者之间的混淆,但我似乎做了相反的事情!谢谢这是最清楚的答案。我将研究参数化查询,尽管它看起来像是对mysqli使用面向对象的方法,而我使用的是过程式的?它可以是面向对象的或过程式的,请参见