2

我需要一种将新注册用户的数据插入数据库的机制。我使用 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, $emailand $pass,它们都显示了正确的值。我是 PDO 的新手,我不确定问题可能是什么。这是某种语法错误,还是其他原因?

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

4

3 回答 3

5

我不认为LIMIT在声明中包含一个子句是有效的INSERT不在MySQL语法参考LIMIT中的可选子句中。 INSERT

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

我怀疑您没有打开错误报告,因为如果语句prepare()由于语法错误而失败,这应该是致命错误或引发异常。你会得到一个类似的错误

ERROR 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');
//------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^

根据定义,一条语句插入的行数与您的 中的组* forINSERT完全相同,因此无论如何都不需要 a 。您可以在语句中使用 a,但在这种情况下,is 组件的子句而不是.()VALUES ()LIMITLIMITINSERT INTO...SELECT...LIMITSELECTINSERT

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

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');
于 2012-08-12T12:10:02.517 回答
1

正如“迈克尔”所说,您不能LIMIT nINSERT查询中使用。

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

于 2012-08-12T12:16:44.947 回答
1

尝试切换到UPDATE查询语法。看起来是你需要的。

于 2012-08-12T12:27:23.410 回答