如何使用 preg-match 更正 HTTPS out URL 错误?
How to correct HTTPS out URL error with preg-match?
这可能是一个非常基本的问题,我什至不太确定如何提出。我有一个排名靠前的网站,人们可以通过访问我的网站的人获得 'out' 个号码。
如果用户添加带有 'http://' 的网站,一切正常,但是,如果用户添加带有 'https://' 的网站,则 link 不起作用。
link 将简单地打开为 'https//'。但是冒号没有出现在 HTTPs 的基础 URL 中。因此 link 无法正确打开。
有谁知道我怎样才能像下面这样使用 preg_matches
来解决这个问题?
if(isset($_GET['action']) && $_GET['action'] == "out" && !empty($_GET['key']))
{
//echo "<pre>";
$site = ORM::for_table('topsite')->where_equal('hash_key',$_GET['key'])->find_one();
//print_r($site);
//echo $site->url;die();
$count = ($site->hits_out) + 1;
//echo $count;
$query = ORM::get_db()->prepare("update `topsite` set hits_out='".$count."' where id='".$site->id."'");
if(!preg_match('/http:/',$site->url))
{
$site->url = "http://".$site->url;
}
if( $query->execute() )
{
header("Location:$site->url");
}
else
{
header("Location: $base_url");
}
exit;
在协议中添加 s
并使用 ?
使其成为可选项。然后在 header
中使用找到的匹配项,这样您就知道要使用哪个协议。
if(!preg_match('/https?:/', $site->url, $protocol))
{
$site->url = $protocol[0] . '//' . $site->url;
}
(您可能可以更改定界符并将 //
也包含在协议中,这样连接会少一些)
不相关但额外注意,你准备的声明是不安全的。
$query = ORM::get_db()->prepare("update `topsite` set hits_out='".$count."' where id='".$site->id."'");
应该写成:
$query = ORM::get_db()->prepare("update `topsite` set hits_out=? where id= ?");
那么应该使用绑定。根据驱动程序的不同,语法会有所不同,对于 PDO 这将起作用:
$query->execute(array($count, $site->id))
还有一点不相关,hits_out
的递增应该在SQL,而不是PHP。多个用户可能同时点击该页面,您将失去对当前方法的计数。我推荐:
set hits_out = hits_out + 1
而不是 select
然后:
$count = ($site->hits_out) + 1;
这可能是一个非常基本的问题,我什至不太确定如何提出。我有一个排名靠前的网站,人们可以通过访问我的网站的人获得 'out' 个号码。
如果用户添加带有 'http://' 的网站,一切正常,但是,如果用户添加带有 'https://' 的网站,则 link 不起作用。
link 将简单地打开为 'https//'。但是冒号没有出现在 HTTPs 的基础 URL 中。因此 link 无法正确打开。
有谁知道我怎样才能像下面这样使用 preg_matches
来解决这个问题?
if(isset($_GET['action']) && $_GET['action'] == "out" && !empty($_GET['key']))
{
//echo "<pre>";
$site = ORM::for_table('topsite')->where_equal('hash_key',$_GET['key'])->find_one();
//print_r($site);
//echo $site->url;die();
$count = ($site->hits_out) + 1;
//echo $count;
$query = ORM::get_db()->prepare("update `topsite` set hits_out='".$count."' where id='".$site->id."'");
if(!preg_match('/http:/',$site->url))
{
$site->url = "http://".$site->url;
}
if( $query->execute() )
{
header("Location:$site->url");
}
else
{
header("Location: $base_url");
}
exit;
在协议中添加 s
并使用 ?
使其成为可选项。然后在 header
中使用找到的匹配项,这样您就知道要使用哪个协议。
if(!preg_match('/https?:/', $site->url, $protocol))
{
$site->url = $protocol[0] . '//' . $site->url;
}
(您可能可以更改定界符并将 //
也包含在协议中,这样连接会少一些)
不相关但额外注意,你准备的声明是不安全的。
$query = ORM::get_db()->prepare("update `topsite` set hits_out='".$count."' where id='".$site->id."'");
应该写成:
$query = ORM::get_db()->prepare("update `topsite` set hits_out=? where id= ?");
那么应该使用绑定。根据驱动程序的不同,语法会有所不同,对于 PDO 这将起作用:
$query->execute(array($count, $site->id))
还有一点不相关,hits_out
的递增应该在SQL,而不是PHP。多个用户可能同时点击该页面,您将失去对当前方法的计数。我推荐:
set hits_out = hits_out + 1
而不是 select
然后:
$count = ($site->hits_out) + 1;