Php 执行INSERT into table时出现错误HY093

Php 执行INSERT into table时出现错误HY093,php,mysql,forms,pdo,Php,Mysql,Forms,Pdo,这是我试图插入的表格 当我尝试使用pdo进行插入时,出现以下错误: 数组([0]=>HY093[1]=>[2]=>) 所有信息都来自html表单 到db的连接正在工作,因为在我执行此插入之前,我会进行一次提取,所以这不是问题所在 我已经用echo检查了所有变量,它们是正确的 还尝试将列“id”添加到sql中,并为其指定值NULL,但错误与上述相同。 但是由于列“id”是自动递增的,所以我没有将其放入sql中。请参阅上面的代码以了解我所做的 $nome = $_POST['name']; $mai

这是我试图插入的表格

当我尝试使用pdo进行插入时,出现以下错误:

数组([0]=>HY093[1]=>[2]=>)

所有信息都来自html表单

db
的连接正在工作,因为在我执行此插入之前,我会进行一次提取,所以这不是问题所在

我已经用echo检查了所有变量,它们是正确的

还尝试将列“id”添加到sql中,并为其指定值
NULL
,但错误与上述相同。 但是由于列“
id
”是自动递增的,所以我没有将其放入sql中。请参阅上面的代码以了解我所做的

$nome = $_POST['name'];
$mail = $_POST['email'];
$psw = $_POST['pass'];
$ni = $_POST['nif']; 
这两个变量来自一个fetch,它可以工作。它们之所以在这里,是因为它们属于Insert语句

$roleid = $row['id'];
$rolen = $row['nome'];    

$sql = "INSERT INTO users ( nome, email, psw, nif, role_id, role_name)
VALUES ( :nome, :mail, :psw, :ni, :roleid, :rolen)";


$stmt = $db1->prepare($sql);
$stmt->bindValue('nome', $nome, PDO::PARAM_STR);
$stmt->bindValue('email', $mail, PDO::PARAM_STR);
$stmt->bindValue('psw', $psw, PDO::PARAM_STR);
$stmt->bindValue('nif', $ni, PDO::PARAM_INT);
$stmt->bindValue('role_id', $roleid, PDO::PARAM_INT);
$stmt->bindValue('role_name', $rolen, PDO::PARAM_STR);
$stmt->execute();

$error = $stmt->errorInfo();
print_r($error);
执行此插入时,我会出现以下错误:

数组([0]=>HY093[1]=>[2]=>)


这就是问题的解决方案,我在
bindValue()
函数中没有使用相同的名称

$name = $_POST['name'];
$email = $_POST['email'];
$psw = $_POST['psw'];
$nif = $_POST['nif'];
$roleid = $row['id'];
$rolen = $row['nome'];

$sql = "INSERT INTO users ( nome, email, psw, nif, role_id, role_name)
        VALUES ( :name, :email, :psw, :nif, :roleid, :rolen)";

$stmt = $db1->prepare($sql);
$stmt->bindValue(':name', $name, PDO::PARAM_STR);
$stmt->bindValue(':email', $email, PDO::PARAM_STR);
$stmt->bindValue(':psw', $psw, PDO::PARAM_STR);
$stmt->bindValue(':nif', $nif, PDO::PARAM_INT);
$stmt->bindValue(':roleid', $roleid, PDO::PARAM_INT);
$stmt->bindValue(':rolen', $rolen, PDO::PARAM_STR);
$stmt->execute();

“对于使用命名占位符的准备语句,这将是形式为:name的参数名称。对于使用问号占位符的准备语句,这将是参数的1索引位置。”因此,请尝试将bindValue first参数更改为包含“:”。还可以查看db表结构,以确保列名没有出现任何错误。您需要的是
:email
,而不是
:mail
@LuisLuisMaiaMaia。您可以随意调用该参数。但是您必须在
bindValue()
中使用相同的名称。正如@PaulSpiegel所注意到的,您应该修复所有
bindValue
调用。您显然不理解占位符将被绑定值替换。因此,例如,如果您有
roleid
占位符,但绑定
role\u id
,它将不起作用。