如何使用 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;