我需要一种机制,将新注册用户的数据插入数据库。我使用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的新手,我不确定问题根本就是什么。它是某种语法错误,还是别的什么?
我没有收到任何错误消息。
答案 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...
,但在这种情况下,LIMIT
是SELECT
组件的一个子句而不是INSERT
。< / p>
* 忽略潜在的密钥违规或其他插入问题,显然
您从WHERE,LIMIT
语句中混合了多个组件(UPDATE
)的事实让我想知道您是否真的打算将其作为UPDATE
而不是INSERT
语句首先。 INSERT
仅适用于新行。 UPDATE
用于更改现有行,WHERE
和LIMIT
在UPDATE
中均有效。
这看起来像是:
$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
查询语法。看起来就像你需要的那样。