围绕这个INSERT INTO感到非常困惑。它应该在表中插入三个字段,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是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')"))
可能很难发现。变量仍然需要"在刻度中",否则它们将不会注册为字符串。
由于activationKey
是string
列,因此必须对$activationKey
使用单引号
试用:
if (!mysqli_query($con,"INSERT INTO activations (userID,activationKey,isActivated)
VALUES (".$userID.",'".$activateKey."','0')"))