【问题标题】:MySQL update or insert or die queryMySQL更新或插入或死查询
【发布时间】:2011-08-29 19:04:09
【问题描述】:

这样做是否有效,我从来没有看到超过1个或运算符:

$insert = 'INSERT into fhours (' .$cols . ') VALUES ('.$query.')';
$update = sprintf("UPDATE fhours SET %s WHERE fname='$fname' AND lname='$lname'", $field_list);

$result = $db->query($update) or $db->query($insert) or die('uhoh');`

【问题讨论】:

  • 为什么不将逻辑构建到 PHP 脚本中? if else 语句?
  • @Rob,没有理由不使用 if/else,只是想知道上面的代码是否可以接受,是否可以在没有 if/else 块的情况下完成。

标签: php mysql insert die


【解决方案1】:

这有两个问题。

首先是您可以使用参数化查询。 Look at PDO, this will help you greatly。这不仅对于多次插入更快,而且您不必太担心 SQL 注入。

第二个是您可以使用MySQL's ON DUPLICATE KEY UPDATE 为您处理此问题。否则,当您的查询失败时,您不知道它失败的原因。这可能根本不是重复的关键问题!

除此之外,从or的角度来看的代码就可以了。

【讨论】:

  • 那么我的重复键会是我正在检查的 fname/lname 吗?
  • 不,重复键是表上失败的键。如果您在 fname 上设置了唯一键,那么可以。
【解决方案2】:

您可以链接任意数量的逻辑运算符。

你还应该考虑mysql的“on duplicate key”机制。

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

【讨论】:

    【解决方案3】:

    有效吗?是的。推荐吗?没有。

    来自失败的 SQL 查询的die()-ing 的问题是用户最终看到的内容,这是一个可怕的屏幕,可能只有少量文本。这很糟糕。

    相反,您应该以一种可以将完成失败传递给用户的方式处理这些错误:

    $update_result = $db->query($update);
    if(!$update_result) {
      // Yikes! Tell the user something went wrong!
      // Show them an error page or error message
    }
    
    $insert_result = db->query($insert);
    if(!$insert_result) {
      // Yikes! Tell the user something went wrong!
      // Show them an error page or error message
    }
    

    事实上,还建议您查看set_error_handler,它可以让您捕获致命的 PHP 错误,而不是显示可能暴露您的 php 路径的可怕错误,如下所示:

    致命错误:无法使用分配操作 具有重载对象的运算符也不 字符串偏移量 /check/out/my/directory/structure/wp-admin/includes/file.php 在第 688 行

    您可以将它们发送到一般错误页面,看起来更专业。

    【讨论】:

      【解决方案4】:

      您可能想查看 mysql 替换为语法

      【讨论】:

        猜你喜欢
        • 2017-08-15
        • 1970-01-01
        • 1970-01-01
        • 2013-03-06
        • 2015-04-25
        • 1970-01-01
        • 1970-01-01
        • 2021-08-22
        • 2011-09-11
        相关资源
        最近更新 更多