【问题标题】:MongoDB check if id is a valid BSON PHPMongoDB 检查 id 是否是有效的 BSON PHP
【发布时间】:2018-03-15 11:22:17
【问题描述】:

如何检查 MongoDB id 是否是有效的 BSON?

这是我目前拥有的

public function findOne($id=""){
  if($BSON_id = new \MongoDB\BSON\ObjectId($id)){
    $user = $this->collection->findOne([
     '_id'=> new \MongoDB\BSON\ObjectId($id)
   ]);
   if(!$user){ return false; }
   return $user;
  }
}

(new User)->findOne("invalidBson123")

但是,上面会抛出一个致命错误:

未捕获的 MongoDB\Driver\Exception\InvalidArgumentException:错误 解析 ObjectId 字符串

【问题讨论】:

    标签: php mongodb


    【解决方案1】:

    http://php.net/manual/en/mongodb-bson-objectid.construct.php 读作:

    id(字符串)

    24 个字符的十六进制字符串。如果未提供,驱动程序将生成一个 ObjectId。

    所以检查可以是一个简单的正则表达式:

    if(preg_match('/^[0-9a-f]{24}$/i', $id) === 1) {
    .....
    

    或者,如果您更喜欢坚持使用 ObjectId 构造函数并使其面向未来,请使用 try-catch:

    try {
        $user = $this->collection->findOne([
         '_id'=> new \MongoDB\BSON\ObjectId($id)
       ]);
       if(!$user){ return false; }
       return $user;
    } catch() {}
    

    【讨论】:

    • 谢谢!我决定更简单一点,使用strlen()
    • It must be a hexadecimal string. "abcdefghijklmnopqrstuvw" will pass the strlen check and still throw the exception. 谢谢亚历克斯。所以在这里使用strlen() 是行不通的
    • 小事.. preg_match 返回匹配数(不是布尔值)所以!== false 将永远为真
    【解决方案2】:

    感谢@Alex 指出 MongoDB ObjectId 是一个 24 个字符的十六进制字符串。

    所以,现在我要做的就是检查它是否为十六进制且长度为 24。

    if(strlen($id) == "24" && ctype_xdigit($id)){
      // Its a valid BSON
      // Do your thing
    }
    

    【讨论】:

    • 必须是十六进制字符串。 "abcdefghijklmnopqrstuvw" 将通过strlen 检查并仍然抛出异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 2018-10-12
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多