4

我正在使用 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。

4

3 回答 3

2

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

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

因为 MEDOO 将返回FALSE或者如果失败0或没有数据被检索/更新,并且所有这些事情在语句中都是相等的。因为如果您的数据库中的表有字段作为主键,您可以使用相同的东西;如果您没有主键,那么您可以使用方法和解析响应来检查错误,因为即使执行了语句也会返回。empty ArraySELECT/UPDATEFALSEifINSERTIDerror()MEDOO0

于 2015-06-15T12:05:10.603 回答
2

由于之前对这篇文章的评论,我几乎没有看 Medoo,但我很高兴我这样做了,我想更正之前对这个问题的回复中的一些陈述,所以潜在的 MeDoo 用户不会被劝阻使用它。

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

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

您可以通过查看 error() 方法的键 2 来检查任何选择/获取/插入/更新/删除错误。如果为NULL,则没有发生错误;如果发生错误,它将包含一个字符串错误消息。

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

我不确定“它未经测试”声明的基础是什么。到目前为止,我还没有遇到任何错误。

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

于 2020-08-24T19:08:26.487 回答
0

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

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

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

echo $data->rowCount();

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

于 2020-04-29T10:27:51.710 回答