如果指针对象不存在或指针未定义,总是获取指针值?

Posted

技术标签:

【中文标题】如果指针对象不存在或指针未定义,总是获取指针值?【英文标题】:Always getting pointer value, if the pointer object not exist or pointer is undefined? 【发布时间】:2019-08-13 18:53:42 【问题描述】:

我的问题与ParsePlatform PHP-SDK有关:

我有一个post 表,在这个表中我有一个指针列offer。该指针对于帖子是可选的。这个指针可能有一个objectId 的报价,或者可能有一个空值,或者可能有一个错误的objectId 的报价。

当我使用此代码时:

$offer = $post->get('offer');

如果存在则返回报价详情,如果不存在且指针值无效则返回空白值。

我想要的是:我想识别所有错误的指针值,这样可以知道指针值是否错误(Offer不存在)吗?

这是我的代码:

try
        $result = ParseCloud::run("searchForumPosts",$params);
        $posts_found = $result['completeLength'];
        foreach($result['posts'] as $post)
            $offer = $post->get('offer');
            $offer_name = "";
            if(!empty($offer))
                $offer_name = $offer->getObjectId();
            


        

    

     catch(ParseException $error)
        var_dump($error);
    
    如果undefined 在帖子表中,我想要$offer_name=undefined。 我想要$offer_name=offer deleted,如果在post 表中offer 列有一个对象ID,但该对象在offer 表中不存在。 如果报价表中存在报价,我想要$offer_name = offerId。这是有效的。我无法跟踪前两个条件

这是我的 Parse Cloud 函数:

// give suggestions for the offer number on min of 2 numbers
Parse.Cloud.define("searchForumPosts", function(request, response) 
    isRequestLegitimate(request).then(function(result) 
        if (result.legitimateRequest) 
            var query = new Parse.Query("ForumPost");
            var completeLength = 0;
            findTextInSearchTerms(query, request.params.wildcard, "searchTerms").then(function(ids) 
                var query2 = new Parse.Query("ForumPost");
                if ((ids == -1 || ids.length == 0)) 
                    completeLength = 0;
                    return [];
                 else 
                    completeLength = ids.length;
                    // not very efficient, if the wildcard is empty we still ask for findTextInSearchTerms, change that later on
                    query2.containedIn("objectId", ids);

                    if (request.params.pageSize && request.params.pageNumber) 
                        var pageSize = parseInt(request.params.pageSize);
                        var pageNumber = parseInt(request.params.pageNumber);

                        query2.limit(pageSize);
                        if (pageNumber > 1) 
                            query2.skip((pageNumber - 1) * pageSize);
                        
                    
                    query2.include("offer");
                    query2.include("offer.artist");
                    query2.include("creator");
                    query2.descending("createdAt");
                    query2.select("objectId","offer.isActive","offer.stopDate", "offer", "offer.objectId", "offer.artist", "offer.artist.firstname", "offer.artist.lastname", "offer.title", "offer.picHash", "title", "text", "offer.offer", "creator", "creator.firstname", "creator.lastname", "replies");
                    return query2.find(
                        useMasterKey: true
                    );
                
            , function(error) 
                return error;
            ).then(function(foundPosts) 
                console.log('foundPosts',foundPosts);
                if (foundPosts.length > 1) 
                    var sortBy = request.params.sortBy;
                    if (sortBy == "artist") 
                        foundPosts.sort(function(a, b) 
                         console.log('foundPosts a',a);
                         console.log('foundPosts b',b);


                            var nameA = 'ZZZZZZZZZ';
                            var nameB = 'ZZZZZZZZZ';
                            if (a.offer) 
                                nameA = ((a.offer || ).artist || ).lastname.toUpperCase();
                            
                            if (b.offer) 
                                nameB = ((b.offer || ).artist || ).lastname.toUpperCase();
                            

                            if (nameA < nameB) 
                                return -1;
                            
                            if (nameA > nameB) 
                                return 1;
                            
                            // names must be equal
                            return 0;
                        );
                     else if (sortBy == "author") 
                        foundPosts.sort(function(a, b) 
                            var nameA = 'ZZZZZZZZZ';
                            var nameB = 'ZZZZZZZZZ';
                            if (a.offer) 
                                nameA = ((a.offer || ).creator || ).lastname.toUpperCase();
                            
                            if (b.offer) 
                                nameB = ((b.offer || ).creator || ).lastname.toUpperCase();
                            

                            if (nameA < nameB) 
                                return -1;
                            
                            if (nameA > nameB) 
                                return 1;
                            
                            // names must be equal
                            return 0;
                        );
                    
                
                console.log('foundPostsfoundPosts',foundPosts);

                var results = ;
                results.completeLength = completeLength;
                results.posts = foundPosts;
                response.success(results);
            , function(error) 
                response.error(error);
            );
         else 
            response.error("You must be logged in!");
        
    );
);

【问题讨论】:

“指针列”到底是什么意思? Afaik 这不是 sql 概念。您是否已经在使用外键,还是您正在寻找的外键? 另外,由于 $offer = $post-&gt;get('offer');php 而不是 sql,因此您可能在两者之间使用了一些抽象层。什么样的层? Post 类是什么样的? @Stratadox 这个问题从来没有提到 SQL,标签与 ParsePlatform 和 ParseServer 有关。 哈,我的错,一定是看错了。 只是为了了解您的需求。您是否要执行一个查询,该查询将返回报价字段中具有无效对象 ID 的所有帖子? 【参考方案1】:

由于您在云代码查询中执行query2.include("offer");,解析服务器将尝试自动获取每个帖子的关联报价。因此,如果它存在并且有效,它只会返回offer.objectId。这意味着您将收到有效的offer.objectId 或在您的客户端代码中未定义。您将无法区分它被删除或未定义的情况。如果区分它对你来说真的很重要,你不应该在你的云代码查询中使用query2.include("offer");,而是分别获取每个报价,这样你就可以将此信息发送到客户端代码。

【讨论】:

它总是为所有存在的offer返回一个Offer Deleted。和blank 删除报价和未定义报价的值 可以分享一下你的云代码功能的代码吗? 我刚刚用云函数代码更新了我的问题 我看不到。我认为您试图更新我的答案而不是您的问题。

以上是关于如果指针对象不存在或指针未定义,总是获取指针值?的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.NullPointerException - 如何处理空指针异常

引用还是指针?

指针 分配空间

野指针 悬空指针和悬空引用

指针free后还存在吗?

关于指针的一些注意事项