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

Php 缩短url函数,需要两个ajax请求来返回缩短的url字符串,php,jquery,ajax,laravel,laravel-4,Php,Jquery,Ajax,Laravel,Laravel 4,使用Laravel框架,我制作了一些函数来生成缩短的url,该函数可以正常工作(几乎可以),我必须进行两次ajax调用才能返回缩短的url 第一个ajax调用收到一个500错误 下面是第二次成功呼叫: 我对一个函数如何同时工作(但不是真的)感到困惑 编辑(其他信息): /缩短用于路由: Route::post('/shorten', array('uses' => 'UrlController@shorten')); 职能: 进一步调用UrlController中的shorten函数

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

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

下面是第二次成功呼叫:

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

编辑(其他信息):

/缩短用于路由:

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;
}
阿贾克斯:

模块:

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

我认为您使用
$.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);
            }
         });
    });
});
    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));
    }

您的shortener运行良好,但在您的第一个请求中,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
尽量缩短另一个。由于您的站点处于活动状态,我可以使用以下工具进行一些在线测试:

这部分代码可能有问题:

$(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);
            }
         });
    });
});
    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));
    }

感谢silkfire,我尝试了一下代码,同样的问题也出现了。关于这个问题还有什么想法吗?@samayres1992这很可能是服务器端的问题。你能评论一下你的代码并在你的/shorten页面中返回一些固定的字符串吗?Laravel可能正在处理帖子信息。而不是
$long\u url=$\u POST['url']
try
$long\u url=Input::get('url')刚刚编辑,试图为这件事提供一些线索。