Как исправить ошибку HTTPS out URL с помощью preg-match? - PullRequest
1 голос
/ 26 апреля 2020

Это может быть очень простой вопрос c, и я не совсем уверен, как его задать. У меня есть топ-лист веб-сайта, где люди могут получать «номера», просматривая их с моего сайта.
Все работает нормально, если пользователь добавляет сайт с http: //, но если пользователь добавляет сайт с «https: //» ссылка не работает.

Ссылка будет просто открыта как «https //». но двоеточие не появляется в базовом URL для HTTP. Поэтому ссылка не открывается правильно.

Кто-нибудь знает, как я мог бы использовать 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;

1 Ответ

1 голос
/ 26 апреля 2020

Добавьте 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 ing затем:

$count = ($site->hits_out) + 1;
...