使用PDO INSERT不插入值

时间:2012-08-12 12:05:48

标签: php pdo

我需要一种机制,将新注册用户的数据插入数据库。我使用PDO来执行此操作,这是我当前的代码:

$dbc = new PDO('mysql:host=localhost;dbname=*****', *****, *****);

$insert_query = $dbc->prepare('INSERT INTO members(name, gender, email, pass)   
VALUES(:name, :gender, :email, :pass) WHERE email = :email LIMIT 1');

$insert_query->execute(array(':name' => $name, ':gender' =>    
$gender, ':email' => $email,  ':pass' => $pass));

但是,当用户提交注册表单时没有任何反应。我试图回应$gender, $name, $email$pass,它们都显示正确的值。我是PDO的新手,我不确定问题根本就是什么。它是某种语法错误,还是别的什么?

我没有收到任何错误消息。

3 个答案:

答案 0 :(得分:5)

我认为在LIMIT语句中包含INSERT子句是不合法的。 LIMIT不属于可选条款in the MySQL INSERT syntax reference

您还有一个WHERE子句,在INSERT语句中也是无效的。

我怀疑您没有启用错误报告,因为如果由于语法错误导致语句失败prepare(),这应该是致命错误或抛出异常。你会得到类似于

的错误
  

错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在“LIMIT 1”附近使用正确的语法

$insert_query = $dbc->prepare('INSERT INTO members(name, gender, email, pass)   
VALUES(:name, :gender, :email, :pass) WHERE email = :email LIMIT 1');
//------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^

根据定义,INSERT语句会在()中插入与VALUES () * 一样多的行,因此不需要LIMIT无论如何。您可以在LIMIT语句中使用INSERT INTO...SELECT...,但在这种情况下,LIMITSELECT组件的一个子句而不是INSERT。< / p>

* 忽略潜在的密钥违规或其他插入问题,显然

您从WHERE,LIMIT语句中混合了多个组件(UPDATE)的事实让我想知道您是否真的打算将其作为UPDATE而不是INSERT语句首先。 INSERT仅适用于新行UPDATE用于更改现有行,WHERELIMITUPDATE中均有效。

这看起来像是:

$upd_query = $dbc->prepare('UPDATE members SET name = :name, gender = :gender, email = :email, pass = :pass) WHERE email = :email LIMIT 1');

答案 1 :(得分:1)

正如“迈克尔”所说,您无法在LIMIT n查询中使用INSERT

毕竟,您不能在预准备语句中两次使用同名的命名参数标记。

答案 2 :(得分:1)

尝试切换到UPDATE查询语法。看起来就像你需要的那样。