我是否在Medoo框架中正确处理查询错误


Am I handling query errors correctly in Medoo Framework?

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

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

On 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
}

On 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
}

On UPDATE(这实际上是唯一清晰的查询,它返回受影响的行)

$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,就像我一直做的。

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

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

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

由于之前对这篇文章的评论,我几乎没有关注Medoo,但我很高兴我这样做了,我想纠正之前对这个问题的一些回答,这样潜在的Medoo用户就不会放弃使用它。

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

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

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

Medoo确实使用预处理语句,也许在2015年还没有,但现在已经使用了。

我不确定"它没有经过测试"这句话的依据是什么。到目前为止,我还没有发现任何错误。

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

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

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

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

echo $data->rowCount();

你可以检查它是否大于0或is_numeric()函数