只用一个sql就可以做到这一点吗?

时间:2011-07-17 09:07:51

标签: php mysql sql

我想要一个插入查询,但在插入之前我检查用户是否使用了用户名和电子邮件。如果使用,我想取消插入查询并回显一条消息,说明用户名或电子邮件是否正在使用中。

这是我的代码:

$sql = "SELECT 1 FROM user WHERE username='".$_POST['username']."'";
if(!$result = mysql_query($sql))
    die(mysql_error());
while($row = mysql_fetch_array($result))
    die('This username is already exists');
$sql = "SELECT 2 FROM user WHERE email='".$_POST['email']."'";
if(!$result = mysql_query($sql))
    die(mysql_error());
while($row = mysql_fetch_array($result))
    die('This email address is already exists');
$sql = "insert into user (username,email,password,tel,type) values ('".$_POST['username']."','".$_POST['email']."','".$_POST['password']."','".$_POST['telnumber']."','member')";
if(!mysql_query($sql))
    die(mysql_error());

我想把这三个sql语句合二为一。它可以是使用案例或您建议的其他内容。所以, 是否可以将此代码压缩成一个SQL查询?

因此我需要的是

sql = "sql_query"
if(!$result = mysql_query($sql))
    die(mysql_error());
while($row = mysql_fetch_array($result)){
if($row['result']==1)
    die('This username is already exists');
else if($row['result']==2)
    die('This email is already exists');
}
die('you have succesfully registered');

感谢任何建议。

3 个答案:

答案 0 :(得分:2)

虽然我建议您关注@cularis的回答,但您可能会对以下选择感兴趣:

  1. 通过为这两个约束创建唯一索引,为emailusername UNIQUE约束。
  2. 运行您的INSERT查询,如果此操作失败...(由于重复的密钥)
  3. 运行建议的合并SELECT,以确定存在哪个字段(用户名或电子邮件)

答案 1 :(得分:1)

您可以将前两个查询组合在一起:

$sql = "SELECT * FROM user WHERE username='".$_POST['username']."' OR email='".$_POST['email']."'";

请查看mysql_real_escape string以对您的输入进行整理。

答案 2 :(得分:1)

假设您不关心更具体的错误案例,您可能只需执行以下操作:

$sql = "SELECT * FROM user WHERE username='".$_POST['username']."' OR email='".$_POST['email']."'";
if(!$result = mysql_query($sql))
    die(mysql_error());
while($row = mysql_fetch_array($result))
    die('The username or email address is already being used');
$sql = "insert into user (username,email,password,tel,type) values ('".$_POST['username']."','".$_POST['email']."','".$_POST['password']."','".$_POST['telnumber']."','member')";
if(!mysql_query($sql))
    die(mysql_error());

如果你正在寻找特定的错误案例,那么这不是最好的设计。因此,如果你只是告诉那个人有一个或两个都在使用的错误,那么这应该可行。

我不确定因为我在PHP / MySQL中非常生疏,但我认为如果这两种情况都存在,那么可能会返回多行,我忘记了mysql_fetch_array的工作方式,但我认为它是一个有效的所有结果的数组查询,所以你应该设置。只要数组存在,您就知道db中有一个命中。