【问题标题】:Am I handling query errors correctly in Medoo Framework?我是否在 Medoo 框架中正确处理查询错误?
【发布时间】:2015-08-16 11:16:10
【问题描述】:

我正在使用 Medoo 框架来处理我的数据库查询。它基本上是一个 PDO 包装器,我在他们的文档中没有找到如何处理错误或检查结果,有时它返回空数组,有时 FALSE 有时 0 等等。

由于我不明白如何处理错误,这就是我目前使用 empty() 所做的,因为它可以处理 FALSE 、 0 和空数组,我认为这里没问题):

在 SELECT 上(Medoo 返回数组)

// Same as:
// SELECT username FROM accounts WHERE id=$id AND suspended=0

$select = $database->select("accounts",["username"], [
    "AND" => [
        "id" => $id,
        "suspended"   => 0
    ]
]);

// I have to check if Query failed also if row was not found

if (empty($select) === FALSE && count($select) > 0)
{
      // It didn't FAIL
      // So i get username like this:
      $key      = array_keys($select)[0];
      $username = $select[$key]['username'];
}
else
{
      // It FAILED
}

在 INSERT 时(Medoo 说它在这里返回 INSERT ID)

$insert = $database->insert("accounts", [
    "username"        => "$username"
]);

// Check if query didn't fail and actually inserted (affected rows i think?)

if (empty($insert) === TRUE OR $insert < 1)
{
    // It Failed
}

更新时(这实际上是唯一的明确查询,它返回受影响的行)

$update = $database->update("accounts", ["brute_force[+]" => 1], ["id" => $user_id]);

if (empty($update) === TRUE OR $update < 1)
{
     // It FAILED
}
// Check if query didn't fail and also affected row

我对这些感到非常困惑和不确定,以至于我很偏执,也许我应该像往常一样完全重写和使用 CodeIgniter。

【问题讨论】:

  • 该框架不使用准备好的语句,UPDATE 查询将只为 MySQL 返回受影响的行。如果没有正确使用 PDO,为什么还要使用它?它甚至没有经过测试。您也可以使用直接 PDO 并最终获得相同的 LoC 编号,而且您可以正确处理错误(异常)。
  • 仔细一看,那东西声称它是一个数据库框架。不是,它是 PDO 的糟糕包装。您最好使用原始 PDO 或以下任何一种:Eloquent、Doctrine、Propel。至少它们已经过测试、记录在案并且可以正常工作。
  • @Mjh 在太多网站上推荐它作为框架(当我搜索最好的 php 框架时)所以我认为它可能像 CodeIgniter 但只有数据库类(这是我这个项目所需要的)和 CI 将是矫枉过正),我是否正确处理错误?
  • 显然那些是错误的网站,快速浏览后我可以识别出多个错误。我不知道您是否正确处理错误,因为那是不一致的。这就是为什么你最好使用普通的 PDO 或我提到的 3 个项目。我会放弃这个 Medoo,它充其量只是一个初学者的应用程序。
  • 据我所知,这三个都是 composer-loadable,所以你可以通过 composer 安装它们,然后使用 require_once ('vendor/autoload.php'); 就可以了。

标签: php mysql pdo medoo


【解决方案1】:

要检查SELECT/UPDATE 语句是否成功,我使用:

if(!$select){ // SELECT failed }

因为如果SELECT/UPDATE 失败或没有检索/更新数据,MEDOO 将返回FALSE0empty Array,并且所有这些都等于FALSEif 语句中。对于INSERT,如果数据库中的表具有ID 字段作为主键,则可以使用相同的内容;如果您没有主键,那么您可以使用error() 方法并解析响应来检查错误,因为即使执行了语句,MEDOO 也会返回0

【讨论】:

  • 非常感谢您的回复,我扔掉了Medoo,我现在直接使用PDO(问题是2周前的问题),我认为这比浪费一周的Medoo好得多我的时间......写得非常糟糕,使用 PDO 和 try{ } catch{ } 让我安心,这是 Medoo 永远不会有的......
【解决方案2】:

由于这篇文章中较早的 cmets,我几乎没有看过 Medoo,但我很高兴我这样做了,我想更正之前对该问题的回复中的一些陈述,因此潜在的 MeDoo 用户不是劝阻使用它。

免责声明 - 我与 Medoo 的所有工作都与 mySQL 数据库有关。

它是 PDO 的包装器,但提到的其他工具也是如此,所以我不确定该评论的目的。提到的其他工具在 ORM 方面提供了更多功能。因此,他们的所有端点/方法都基于数据库中的各个表,而 Medoo 基于传统的 CRUD 方法,在我看来,这更有意义。如果你不关心 ORM,Medoo 很好。

您可以通过查看 error() 方法的键 2 来检查任何 select/get/insert/update/delete 错误。如果为NULL,则没有发生错误;如果发生错误,它将包含一个字符串错误消息。

Medoo 确实使用预准备语句,也许它在 2015 年还没有,但现在可以了。

我不确定“它未经测试”的说法的依据是什么。到目前为止,我还没有遇到任何错误。

底线:如果您正在寻找一个使用 PDO 且不关心 ORM 的简单查询构建器,Medoo 可能适合您。

【讨论】:

    【解决方案3】:

    update() 的返回对象是 PDOStatement,所以你可以使用它的方法来获取更多信息。

    $data = $database->update("account", [
        "age[+]" => 1
    ], [
        "user_id[>]" => 100
    ]);
    

    返回最后一条 SQL 语句影响的行数

    echo $data->rowCount();
    

    您可以检查它是否大于零或 is_numeric() 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      相关资源
      最近更新 更多