【问题标题】:Checking for existing entry before inserting data在插入数据之前检查现有条目
【发布时间】:2012-01-23 21:25:10
【问题描述】:

我只在新客户端不存在时才尝试插入它们。我认为 SQL 语句有问题,但我也想在 PHP 中给出上下文:

   $sql = "INSERT INTO clients
        (`studentEmail`, `studentPassword`, `parentEmail`, `parentPassword`,
        `studentFirstName`, `studentLastName`, `studentPhone`, `parentFirstName`,
        `parentLastName`, `parentPhone`, `school`)
         VALUES ('$studentEmail', '$studentPassword', '$parentEmail',
        '$parentPassword', '$studentFirstName', '$studentLastName',
        '$studentPhone', '$parentFirstName', '$parentLastName', '$parentPhone', '$school')
        SELECT studentEmail
        FROM clients
        WHERE not exists (select * from clients where studentEmail == '"$studentEmail"')";

【问题讨论】:

  • 您是否遇到特定错误?
  • 你需要逃避你的价值观。阅读SQL Injection
  • @Xeoncross:您对变量在用于此查询之前的处理方式一无所知
  • @MalcolmO'Hare 我猜这是 MySQL,它是你引用对象名称的方式
  • @Xeoncross:“我已经逃脱了价值观,我只是想缩小帖子”,显然他已经逃脱了它们。甚至不要开始讨论 no-no yes-yes 和转义与准备好的陈述,这是离题

标签: php mysql sql insert


【解决方案1】:

在插入语句中,selectvalues 是互斥的。而不是:

insert table1 (col1, col2, col3, ...)
values (1, 2, 3, ...)
select col1
where  not exists (...)

试试:

insert table1 (col1, col2, col3, ...)
select 1, 2, 3, ...
where  not exists (...)

【讨论】:

  • 抱歉耽搁了,我先试试php的方法。
  • 我正在尝试这个,但我不断收到 SQL 错误...这是我更新的代码:INSERT 客户端 (studentEmail, studentPassword, parentEmail, parentPassword, @ 987654329@, studentLastName, studentPhone, parentFirstName, parentLastName, parentPhone, school) SELECT '$studentEmail', '$studentPassword', '$parentEmail', '$parentPassword', '$ studentFirstName', '$studentLastName', '$studentPhone', '$parentFirstName', '$parentLastName', '$parentPhone', '$school' WHERE 不存在(从 studentEmail = '{$studentEmail}' 的客户中选择 studentEmail) ;
  • 即使我选择了其他方法,我仍然想知道为什么我不能让它工作。数据库查询失败:您的 SQL 语法有错误;检查对应的手册...在“不存在的地方”附近使用(从第 7 行的 studentEmail = 'robins.' 的客户中选择 studentEmail ...我使用的电子邮件地址是 robins.br@gmail.com
  • 试试insert into而不是insert
  • 插入没有变化。我也试过:studentEmail = '"$studentEmail"'
【解决方案2】:

您应该在插入数据之前检查电子邮件是否存在。

$check = mysql_query("SELECT studentEmail FROM clients WHERE  studentEmail = '{$studentEmail}';");

if (mysql_num_rows($check) == 0) {
    // insert
}

【讨论】:

  • 我首先尝试了这种方法,因为 php 将很好地适应框架的其余部分。添加连接 (.$studentEmail.) 后,我收到错误“mysql_num_rows():提供的参数不是有效的 MYSQL 结果资源...”有什么想法吗?
  • 此查询有效,但我仍然收到错误:mysql_num_rows():提供的参数。从客户中选择 studentEmail WHERE studentEmail = '{$studentEmail}';它说错误发生在这一行:“if (mysql_num_rows($check) == 0) {”
  • 这很奇怪! $check 是否返回查询结果?
  • 我很难找出原因,因为这是一个处理页面,所以即使我回显任何内容,屏幕上也不会显示任何内容。我的js指向这个页面。
  • 您可以将浏览器指向 php 文件并查看输出,不是吗? :)
【解决方案3】:

您可以使用MERGE 语句:

merge into clients on (select 1 from clients where studentEmail = blabla)
when not matched then insert blabla

(合并语句的语法会根据您的 RDBMS 有所不同,因此请查看特定 RDBMS 实现的文档)

【讨论】:

  • 不幸的是 mysql 不支持MERGE。但它确实支持REPLACEINSERT ... ON DUPLIcATE KEY UPDATE
【解决方案4】:

如果您在电子邮件字段上具有唯一索引,那么您只需执行INSERT IGNORE ... 并且与现有电子邮件相对应的插入将被悄悄丢弃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多