使用pdo进行php插入无法插入数据库

时间:2016-11-20 02:14:28

标签: php pdo

<?php
$user=htmlspecialchars($_POST['user']);
$password=htmlspecialchars($_POST['password']);
$email=htmlspecialchars($_POST['email']);
//$number=htmlspecialchars($_POST['number']);
$quater=htmlspecialchars($_POST['quater']);
if (isset($user) && isset($password)&& isset($email ) && isset($quater ))
    {
      try{
    $bdd = new PDO('mysql:host=localhost;dbname=library;charset=utf8', 'root', '');

}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}
$req = $bdd->prepare('INSERT INTO user(name, password, email,  quater ) VALUES(?,?,?,? )');
$req->execute(array('name'=> $user,'password'=>$password,'email'=>$email,'quater' => $quater));
}
    else
    {
        echo "<p color=red >please fill all the  fills above<p>";
    }
?> 

收到以下错误

  

警告:PDOStatement :: execute():SQLSTATE [HY093]:参数号无效:参数未在[...}中定义

1 个答案:

答案 0 :(得分:2)

你在这里使用不同种类的占位符。

使用?作为占位符时,无需按名称和正确顺序进行绑定。如果您使用的是命名占位符(例如:name),则顺序无关紧要,但数组中的键必须与指定的占位符匹配。

所以你的两个选择是

  1. 使用命名占位符(我认为更容易阅读)
  2. 删除执行数组中的索引
  3. 因此,替代看起来像

    $req = $bdd->prepare('INSERT INTO user (name, password, email, quater) VALUES (:name, :password, :email, :quater)');
    $req->execute(array('name'=> $user, 'password' => $password, 'email' => $email, 'quater' => $quater));
    

    请注意,我已将所有占位符从?替换为命名的:name

    替代两个看起来像这样

    $req = $bdd->prepare('INSERT INTO user (name, password, email, quater) VALUES (?, ?, ?, ?)');
    $req->execute(array($user, $password, $email, $quater));
    

    在这里你会看到占位符仍然是?,但是在execute-array中删除了键。

    你可以在这里使用密钥,但它们必须是0-3(因为它们被PHP默认分配)。

    参考