【问题标题】:Shorten url function, requires two ajax requests to return shortned url string缩短url函数,需要两个ajax请求返回缩短的url字符串
【发布时间】:2014-05-01 03:18:04
【问题描述】:

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

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

这是第二次成功的调用:

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

编辑(附加信息):

/shorten 用于路由:

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

功能:

进一步调用UrlController中的shortcut函数:

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

【问题讨论】:

  • Laravel 可能正在对帖子信息做一些事情。而不是$long_url = $_POST['url']; 尝试$long_url = Input::get('url');

标签: php jquery ajax laravel laravel-4


【解决方案1】:

您的缩短器运行良好,但在您的第一个请求中,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}}

这个错误返回 500 错误到 javascript,这是正常的。

但无论如何它都会创建缩短的 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】:

我认为您以错误的方式使用 $.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);
            }
         });
    });
});

【讨论】:

  • 感谢 Silkfire,我尝试了代码并出现了同样的问题。关于这个问题还有什么想法吗?
  • @samayres1992 这很可能是服务器端问题。你能评论你的代码并在你的 /shorten 页面中返回一些固定的字符串吗?
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 2011-09-28
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
相关资源
最近更新 更多