【问题标题】:Is is possible to do this with only one sql?是否可以仅使用一个 sql 来执行此操作?
【发布时间】:2011-07-17 17:35:40
【问题描述】:

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

这是我的代码:

$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');

感谢您的建议。

【问题讨论】:

  • 如果你能用通俗易懂的语言解释你想要实现的目标和你在做什么,非 php 的人也能提供帮助,而且 php 的人也很容易理解
  • 顺便说一句,您可能希望在将参数传递给 MySQL 之前绑定参数(或至少转义它们),除非您过于喜欢 SQL 注入攻击
  • 我添加了一些关于我在做什么的解释

标签: php mysql sql


【解决方案1】:

虽然我建议您遵循 @cularis 的回答,但您可能对以下替代方案感兴趣:

  1. emailusername 提供UNIQUE 约束,方法是为这两者创建唯一索引。
  2. 运行INSERT 查询,如果失败...(由于重复键)
  3. 运行建议的组合SELECT,以确定存在哪个字段(用户名或电子邮件)

【讨论】:

  • 是目前最好的解决方案
【解决方案2】:

您可以像这样组合前两个查询:

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

查看mysql_real_escape string 以了解您的输入。

【讨论】:

  • 但是通过这个查询我无法注意到是否使用了用户名或电子邮件。
  • 当然,您检查查询返回的内容,看看它是电子邮件、用户名还是两者兼而有之。
  • @exculuber:你不能检查结果行吗?如果用户名!= username_arg 然后电子邮件 == email_arg
  • 效率低,没用
  • 它比每个输入参数发送 1 个查询更有效。
【解决方案3】:

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

$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 的工作原理,但我认为它是一个包含所有有效结果的数组查询,所以你应该设置。只要数组存在,你就知道数据库中有命中。

【讨论】:

  • 你能再看看我的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
相关资源
最近更新 更多