Php 缩短url函数,需要两个ajax请求来返回缩短的url字符串
使用Laravel框架,我制作了一些函数来生成缩短的url,该函数可以正常工作(几乎可以),我必须进行两次ajax调用才能返回缩短的url 第一个ajax调用收到一个500错误 下面是第二次成功呼叫: 我对一个函数如何同时工作(但不是真的)感到困惑 编辑(其他信息): /缩短用于路由: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函数
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')代码>刚刚编辑,试图为这件事提供一些线索。