代码之家  ›  专栏  ›  技术社区  ›  samayres1992

缩短url函数,需要两个ajax请求才能返回缩短的url字符串

  •  0
  • samayres1992  · 技术社区  · 12 年前

    使用Laravel框架,我制作了几个函数来生成缩短的url,该函数(几乎)有效,我必须执行两次ajax调用才能返回缩短的url。

    第一个ajax调用收到一个500错误。

    enter image description here

    这是第二次成功的通话:

    enter image description here

    我很困惑一个函数如何同时工作(但不是真的)。

    编辑(附加信息):

    /shorten用于路由:

    Route::post('/shorten', array('uses' => 'UrlController@shorten'));
    

    功能:

    它进一步调用UrlController中的shorten函数:

    public function shorten(){
    
        header('Content-type: text/plain');
    
        $long_url = $_POST['url'];
        $link = Link::checkOrShorten($long_url);
    
        return $link->short_url;
    }
    

    阿贾克斯:

    $(function() {
        $('#litlingit').click(function(){
          $.ajax({
            type: "POST",
            data: { url: $('input[name="long_url"]').val() },
            dataType: "text",
            url: "/shorten"
          }).done(function( data ){
            $('input[name="long_url"]').val('http://litl.it/'+data);
          });
      });
    });
    

    模块:

    public static function checkOrShorten($long_url)
    {
    
        $link = new Link;
        $link->users_id = NULL;
    
        if (Auth::check())
        {
            $link->users_id = Auth::user()->id;
        }
    
        $link->long_url = $long_url;
        $query = DB::select("select short_url from links where long_url = '$long_url'");
        if ($query) 
        {
            foreach ($query as $links)
            {
                $link->short_url = $links->short_url;
            }   
            $url_id = DB::select("select id from links where long_url = '$long_url'");
            DB::table('users_links')->insert(array('link_id' => $url_id[0]->id, 'user_id' => $link->users_id, 'privacy' => 0));
        }
    
        while(is_null($link->short_url)) 
        {
            $link->short_url = str_random(4);
            $query = DB::select("select short_url from links where short_url = '". $link->short_url ."'"); 
    
            if(!$query)
            {
                $link->save();
                $url_id = DB::select("select id from links where short_url = '$link->short_url'");
                DB::table('users_links')->insert(array('link_id' => $url_id, 'user_id' => $link->users_id, 'privacy' => 0));
            }
        }
        return $link;
    }
    
    2 回复  |  直到 12 年前
        1
  •  1
  •   Antonio Carlos Ribeiro    12 年前

    你的剪短者工作得很好,但在你的第一个请求中,Laravel提出了一个例外:

    {"error":{"type":"ErrorException","message":"ksort() expects parameter 1 to be array, null given","file":"\/var\/www\/litl.it\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Query\/Builder.php","line":1407}}
    

    此错误返回为javascript的500错误,这是正常的。

    但无论如何,它都会创建缩短的url,所以在第二个请求中,它只返回数据库中已有的值。

    你应该在Laravel日志中有关于这个的信息(调用堆栈),运行

    php artisan tail
    

    尽量缩短另一个。由于您的网站是实时的,我可以使用 Postman Chrome Extension : http://puu.sh/7IfXJ.png .

    这部分代码可能有问题:

        if(!$query)
        {
            $link->save();
            $url_id = DB::select("select id from links where short_url = '$link->short_url'");
            DB::table('users_links')->insert(array('link_id' => $url_id, 'user_id' => $link->users_id, 'privacy' => 0));
        }
    

    当你在数据库中保存链接时,你会立即寻找它,有时你可能会得到一个空值,但是,由于你正在保存它,而Laravel试图将id返回到你的模型中,我认为你可以将其更改为:

        if(!$query)
        {
            $link->save();
    
            DB::table('users_links')->insert(array('link_id' => $link->id, 'user_id' => $link->users_id, 'privacy' => 0));
        }
    
        2
  •  0
  •   silkfire thezar    12 年前

    我想你在用 $.ajax() 以错误的方式。成功响应的回调将放在 success 函数的参数,而不是通过链接 .done() 到它的尾巴。

    还要学会使用 .on() 绑定函数,而不是默认的命名事件绑定器。jQuery是智能的,并自动将其转换为 .on() 在幕后。

    尝试重写代码:

    $(function() {
        $(document).on('click', '#litlingit', function() {
             $.ajax({
                type: 'post',
                data: 'url=' + $('input[name="long_url"]').val(),
                url: '/shorten',
                success: function(response) {
                   $('input[name="long_url"]').val('http://litl.it/' + response);
                }
             });
        });
    });
    
    推荐文章