Получение разрешения экрана с помощью PHP

Мне нужно найти разрешение экрана пользователя, который посещает мой сайт?


person Elitmiar    schedule 01.10.2009    source источник
comment
Это делается с помощью JavaScript, а не PHP. PHP выполняется только на стороне сервера. Однако, проверяя разрешение экрана пользователя, имейте в виду, что не все пользователи просматривают его в полноэкранном режиме!   -  person sjstrutt    schedule 01.10.2009
comment
Способ CSS для визуализации дизайна в зависимости от размера: stackoverflow.com/questions/19186243/   -  person Breaking not so bad    schedule 31.07.2014
comment
Используйте JavaScript, чтобы получить эту информацию и отправить через AJAX   -  person Elyor    schedule 13.08.2015
comment
Аналогичный вопрос с альтернативными параметрами: Может ли php определить размер/разрешение монитора клиентского браузера?   -  person ashleedawg    schedule 01.05.2019
comment
Это действительно должно быть выполнимо через PHP (я знаю, что в настоящее время это невозможно). Говоря, что этого не должно быть, потому что PHP является серверной частью, мы игнорируем всю другую клиентскую информацию, которую мы ДЕЙСТВИТЕЛЬНО получаем через $_REQUEST, такую ​​как HTTP_USER_AGENT. Почему мы не можем иметь другое поле с размером порта просмотра браузеров?   -  person Sophivorus    schedule 12.06.2020


Ответы (22)


Вы не можете сделать это с чистым PHP. Вы должны сделать это с помощью JavaScript. О том, как это сделать, написано несколько статей.

По сути, вы можете установить cookie или даже использовать Ajax для отправки информации в PHP-скрипт. Если вы используете jQuery, вы можете сделать это примерно так:

jquery:

$(function() {
    $.post('some_script.php', { width: screen.width, height:screen.height }, function(json) {
        if(json.outcome == 'success') {
            // do something with the knowledge possibly?
        } else {
            alert('Unable to let PHP know what the screen resolution is!');
        }
    },'json');
});

PHP (some_script.php)

<?php
// For instance, you can do something like this:
if(isset($_POST['width']) && isset($_POST['height'])) {
    $_SESSION['screen_width'] = $_POST['width'];
    $_SESSION['screen_height'] = $_POST['height'];
    echo json_encode(array('outcome'=>'success'));
} else {
    echo json_encode(array('outcome'=>'error','error'=>"Couldn't save dimension info"));
}
?>

Все это действительно просто, но это должно вас куда-то привести. Обычно разрешение экрана — это не то, что вам действительно нужно. Вас может больше интересовать размер фактического порта просмотра браузера, поскольку именно там отображается страница...

person KyleFarris    schedule 01.10.2009
comment
Кайл, ты нашел способ получить размеры порта просмотра браузера? - person a coder; 18.09.2012
comment
@KyleFarris ... я не очень хорошо разбираюсь в jquery и json .. как это будет код, как показано ниже $(function() { $.post('header.php', { width: 800px }, function(json) { if(json.outcome == 'success') { header-800px.php // do something with the knowledge possibly? } else { header.php; } },'json'); }); - person Accore LTD; 26.11.2013
comment
Я не согласен с вами по поводу разрешения просмотра, однако ответ отличный! Думаю, эта информация может быть использована для статистики и бана. Я бы предпочел для этого пользовательский агент и ip. Разрешение экрана тоже хорошо! - person volter9; 08.05.2014
comment
Каково значение some_script.php? Должно ли это быть имя страницы, загружающей скрипт? Может ли он быть общим для всех страниц? - person WilliamK; 17.01.2018
comment
рабочий ответ был бы еще лучше. С чем мне что-то делать?? - person ashleedawg; 01.05.2019
comment
nm, я сделал один здесь :-) - person ashleedawg; 01.05.2019

Непосредственно с PHP это невозможно, но...

Я пишу этот простой код, чтобы сохранить разрешение экрана в сеансе PHP для использования в галерее изображений.

<?php
session_start();
if(isset($_SESSION['screen_width']) AND isset($_SESSION['screen_height'])){
    echo 'User resolution: ' . $_SESSION['screen_width'] . 'x' . $_SESSION['screen_height'];
} else if(isset($_REQUEST['width']) AND isset($_REQUEST['height'])) {
    $_SESSION['screen_width'] = $_REQUEST['width'];
    $_SESSION['screen_height'] = $_REQUEST['height'];
    header('Location: ' . $_SERVER['PHP_SELF']);
} else {
    echo '<script type="text/javascript">window.location = "' . $_SERVER['PHP_SELF'] . '?width="+screen.width+"&height="+screen.height;</script>';
}
?>

Новое решение, если вам нужно отправить другой параметр в методе Get (от Guddu Modok)

<?php
session_start();
if(isset($_SESSION['screen_width']) AND isset($_SESSION['screen_height'])){
    echo 'User resolution: ' . $_SESSION['screen_width'] . 'x' . $_SESSION['screen_height'];
    print_r($_GET);
} else if(isset($_GET['width']) AND isset($_GET['height'])) {
    $_SESSION['screen_width'] = $_GET['width'];
    $_SESSION['screen_height'] = $_GET['height'];
$x=$_SERVER["REQUEST_URI"];    
    $parsed = parse_url($x);
$query = $parsed['query'];
parse_str($query, $params);
unset($params['width']);
unset($params['height']);
$string = http_build_query($params);
$domain=$_SERVER['PHP_SELF']."?".$string;
        header('Location: ' . $domain);
} else {
$x=$_SERVER["REQUEST_URI"];    
    $parsed = parse_url($x);
$query = $parsed['query'];
parse_str($query, $params);
unset($params['width']);
unset($params['height']);
$string = http_build_query($params);
$domain=$_SERVER['PHP_SELF']."?".$string;
    echo '<script type="text/javascript">window.location = "' . $domain . '&width="+screen.width+"&height="+screen.height;</script>';
}
?>
person Carlos Ricardo Schmitz    schedule 10.07.2012
comment
Хорошее решение - реализовано и прекрасно работает. Я также вытащил http_user_agent (хотя он не всегда заполнен/точен). Хотелось бы, чтобы был способ получить фактический размер порта просмотра браузера. (в отличие от разрешения экрана). - person a coder; 18.09.2012
comment
Мне нравится это решение. Простой - перенаправление на страницу с размером в URL. Для тех, кто читает это - вы можете получить размер области просмотра браузера - см. stackoverflow.com/questions/8794338, в котором говорится (с jquery) использовать функции .height() и .width(). - person Ukuser32; 24.02.2016
comment
Хорошее решение, но, пожалуйста, не могли бы вы предоставить нам его с использованием файлов cookie вместо сеансов? - person John Max; 04.08.2016
comment
Как проще всего сделать это незаметно для пользователя? (например, без параметров URL и т. д.) - person ashleedawg; 01.05.2019
comment
Это на самом деле довольно гениально! - person santa; 25.05.2019
comment
Он работает, но всегда перенаправляет на /index.php при первом входе пользователя. - person Frostbourn; 03.09.2020

PHP является серверным языком - он выполняется только на сервере, а результирующий вывод программы отправляется клиенту. Таким образом, нет доступной информации об «экране клиента».

Тем не менее, вы можете попросить клиента сообщить вам, какое у него разрешение экрана, через JavaScript. Напишите небольшой скриптлет для отправки вам screen.width и screen.height — возможно, через AJAX или, что более вероятно, с начальной «страницей перехода», которая находит их, а затем перенаправляет на http://example.net/index..php?size=AxB

Хотя, говоря как пользователь, я бы предпочел, чтобы вы разработали сайт, который плавно обрабатывает любое разрешение экрана. Я просматриваю в окнах разного размера, в основном не развернутых.

person Adam Wright    schedule 01.10.2009
comment
+1 за подробные объяснения, а не за максимальное увеличение окон браузера. Окна моего браузера обычно имеют ширину около 800 пикселей; веб-страницы, которые изменяют свой размер в зависимости от разрешения моего экрана, — проклятие моего существования! - person Alex Barrett; 01.10.2009

Я обнаружил, что использование CSS внутри моего html внутри моего php помогло мне.

<?php             
    echo '<h2 media="screen and (max-width: 480px)">'; 
    echo 'My headline';
    echo '</h2>'; 

    echo '<h1 media="screen and (min-width: 481px)">'; 
    echo 'My headline';
    echo '</h1>'; 

    ?>

Это приведет к выводу заголовка меньшего размера, если размер экрана 480 пикселей или меньше. Так что не нужно передавать какие-либо вары, используя JS или что-то подобное.

person delp    schedule 24.07.2012
comment
Это не отвечает на вопрос - person ashleedawg; 01.05.2019

Это очень простой процесс. Да, вы не можете получить ширину и высоту в PHP. Это правда, что JQuery может обеспечить ширину и высоту экрана. Сначала перейдите на https://github.com/carhartl/jquery-cookie и получите файл jquery.cookie. .js. Вот пример использования php для получения ширины и высоты экрана:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Test</title>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
        <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
        <script src="js/jquery.cookie.js"></script>
        <script type=text/javascript>
            function setScreenHWCookie() {
                $.cookie('sw',screen.width);
                $.cookie('sh',screen.height);
                return true;
            }
            setScreenHWCookie();
        </script>
    </head>
    <body>
        <h1>Using jquery.cookie.js to store screen height and width</h1>
    <?php
         if(isset($_COOKIE['sw'])) { echo "Screen width: ".$_COOKIE['sw']."<br/>";}
         if(isset($_COOKIE['sh'])) { echo "Screen height: ".$_COOKIE['sh']."<br/>";}
    ?>
    </body>
    </html>

У меня есть тест, который вы можете выполнить: http://rw-wrd.net/test.php

person Rich R    schedule 10.05.2018
comment
Это ничего не делает для меня в Firefox. - person ashleedawg; 01.05.2019

Самый простой способ

<?php 
//-- you can modified it like you want

echo $width = "<script>document.write(screen.width);</script>";
echo $height = "<script>document.write(screen.height);</script>";

?>
person WebSon    schedule 06.02.2019
comment
Интересно, почему пользователи SO минусуют такие хорошие ответы, как этот. Большое спасибо, ваш ответ обеспечивает прямой доступ через PHP к ширине и высоте экрана, и я тестировал его даже на старых мобильных устройствах. Спасибо - person John Max; 02.10.2020
comment
Глупый. Вы уже в DOM. Вы никуда не пойдете с этим кодом. Если только вы не поняли, как использовать код на стороне сервера на клиентской машине. Если вы знаете, как это сделать, то я исправляюсь - вы потрясающие! :) - person Ricalsin; 25.02.2021
comment
Работает на меня. Очень признателен. Проголосовал. - person James Osguthorpe; 10.06.2021

Используйте JavaScript (screen.width и screen.height IIRC, но я могу ошибаться, давно не занимался JS). PHP не может этого сделать.

person Cat Plus Plus    schedule 01.10.2009

Полностью рабочий пример

Я не смог найти реально работающий пример PHP, чтобы «невидимо» (без параметров URL) возвратить размер экрана клиента и другие свойства в PHP на стороне сервера, поэтому я соедините этот пример.

JS заполняет и отправляет скрытую форму (скрипт создан PHP из массива свойств JS), POSTing сам с собой (данные теперь доступны в PHP) и возвращает данные в виде таблицы.

(Проверено в "нескольких" браузерах.)

<!DOCTYPE html>
<html>
<head>
    <title>*Client Info*</title>
    <style>table,tr{border:2px solid gold;border-collapse:collapse;}td{padding:5px;}</style>
</head>

<body>
<?php
  $clientProps=array('screen.width','screen.height','window.innerWidth','window.innerHeight', 
    'window.outerWidth','window.outerHeight','screen.colorDepth','screen.pixelDepth');

  if(! isset($_POST['screenheight'])){

    echo "Loading...<form method='POST' id='data' style='display:none'>";
    foreach($clientProps as $p) {  //create hidden form
      echo "<input type='text' id='".str_replace('.','',$p)."' name='".str_replace('.','',$p)."'>";
    }
    echo "<input type='submit'></form>";

    echo "<script>";
    foreach($clientProps as $p) {  //populate hidden form with screen/window info
      echo "document.getElementById('" . str_replace('.','',$p) . "').value = $p;";
    }
    echo "document.forms.namedItem('data').submit();"; //submit form
    echo "</script>";

  }else{

    echo "<table>";
    foreach($clientProps as $p) {   //create output table
      echo "<tr><td>".ucwords(str_replace('.',' ',$p)).":</td><td>".$_POST[str_replace('.','',$p)]."</td></tr>";
    }
    echo "</table>";
  }
?>
<script>
    window.history.replaceState(null,null); //avoid form warning if user clicks refresh
</script>
</body>
</html>

Возвращаемые данные extract преобразуются в переменные. Например:

  • window.innerWidth возвращается в $windowinnerWidth
person ashleedawg    schedule 01.05.2019
comment
Спасибо за полный PHP-код. Это просто копипаст и отлично работает. - person LeO; 10.06.2019
comment
Отличный пример для подражания. Очень признателен. - person Neil_Tinkerer; 09.09.2020
comment
Это лучшая версия PHP, которую я когда-либо видел. Никаких осложнений и конфликтов с javascript, НО ПОЖАЛУЙСТА, как получить точную ширину в переменной php? - person John Max; 02.10.2020
comment
данные теперь доступны в PHP Они «доступны» для php только в том случае, если они находятся на сервере. Для этого ваш код должен будет отправить эти свойства DOM обратно на сервер с помощью вызова ajax. Или вы можете завершить свою процедуру отправки с помощью метода формы и получить ее таким образом, но вы этого не показали, и все уже довольно беспорядочно. Все, что вы здесь сделали, это напечатали несколько строк текста с помощью php, а затем поместили их в DOM. - person Ricalsin; 25.02.2021

Вы можете попробовать RESS (адаптивный дизайн + компоненты на стороне сервера), см. этот учебник:

http://www.lukew.com/ff/entry.asp?1392

person benske    schedule 02.07.2013
comment
Я обновил его: адаптивный дизайн + серверные компоненты :) - person benske; 02.07.2013

Вы можете проверить это, как показано ниже:

if(strstr(strtolower($_SERVER['HTTP_USER_AGENT']), 'mobile') || strstr(strtolower($_SERVER['HTTP_USER_AGENT']), 'android')) {
   echo "mobile web browser!";
} else {
echo "web browser!";
}
person Ildar Nasurlaev    schedule 19.05.2020
comment
Хотя это не отвечает на разрешение экрана, оно определяет, использует ли конечный пользователь мобильное устройство или нет, и это послужило моим целям. Я просто хочу предоставить посетителям моего веб-сайта другой набор пунктов меню в зависимости от их выбора устройства, и это отлично сработало для меня. Спасибо. - person Michael Moriarty; 07.08.2020
comment
Также работал очень хорошо для меня. Просто хотел изменить количество отображаемых продуктов (3 продукта для настольных компьютеров, 2 для мобильных устройств). - person James Osguthorpe; 10.06.2021

Я не думаю, что вы можете определить размер экрана исключительно с помощью PHP, но вы можете определить пользовательский агент.

<?php
    if ( stristr($ua, "Mobile" )) {
        $DEVICE_TYPE="MOBILE";
    }

    if (isset($DEVICE_TYPE) and $DEVICE_TYPE=="MOBILE") {
        echo '<link rel="stylesheet" href="/css/mobile.css" />'
    }
?>

Вот ссылка на более подробный скрипт: PHP Mobile Detect

person davidcondrey    schedule 27.04.2014

Вы можете установить ширину окна в файлах cookie, используя JS во внешнем интерфейсе, и вы можете получить ее в PHP:

<script type="text/javascript">
   document.cookie = 'window_width='+window.innerWidth+'; expires=Fri, 3 Aug 2901 20:47:11 UTC; path=/';
</script>

<?PHP
    $_COOKIE['window_width'];
?>
person Faisal Rehman    schedule 31.08.2018
comment
Неопределенный индекс: window_width - person John Max; 03.10.2020
comment
Это потому, что сначала запускается php, а затем javascript. - person Gray Programmerz; 13.03.2021

Вот код Javascript: (index.php)

<script>
    var xhttp = new XMLHttpRequest();  
    xhttp.open("POST", "/sqldb.php", true);
    xhttp.send("screensize=",screen.width,screen.height);
</script>

Вот код PHP: (sqldb.php)

$data = $_POST['screensize'];
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$statement = $pdo->prepare("UPDATE users SET screen= :screen WHERE id = $userid");
$statement->execute(array('screen' => $data));

Я надеюсь, что вы знаете, как получить $userid из сеанса, и для этого вам нужна база данных с таблицей, называемой пользователями, и таблицей внутри пользователей, называемой экраном ;=) С уважением, KSP

person PSK1337    schedule 20.11.2019

Единственный способ - использовать javascript, а затем получить javascript для публикации на вашем php (если вам действительно нужна серверная сторона res). Однако это полностью рухнет, если они отключат javascript.

person UK-AL    schedule 01.10.2009

JS:

$.ajax({
    url: "ajax.php",
    type: "POST",
    data: "width=" + $("body").width(),
    success: function(msg) {

        return true;
    }
});

ajax.php

if(!empty($_POST['width']))
    $width = (int)$_POST['width'];
person krówek    schedule 28.09.2014

Это можно легко сделать с помощью файлов cookie. Этот метод позволяет странице сверять сохраненные значения cookie с высотой и шириной экрана (или значениями высоты и ширины порта просмотра браузера), и если они отличаются, он сбрасывает cookie и перезагружает страницу. Код должен учитывать предпочтения пользователя. Если постоянные файлы cookie отключены, используйте файлы cookie сеанса. Если это не сработает, вам придется использовать настройку по умолчанию.

  1. Javascript: проверьте, установлены ли файлы cookie высоты и ширины
  2. Javascript: если установлено, проверьте, соответствует ли screen.height и screen.width (или что вы хотите) текущему значению файла cookie.
  3. Javascript: Если cookie не установлен или не соответствует текущему значению, то: a. Javascript: создайте постоянный или сеансовый файл cookie с именем (например) 'shw' для значения текущего screen.height и screen.width.
    b. Javascript: перенаправление на СЕБЯ с помощью window.location.reload(). Когда он перезагрузится, он пропустит шаг 3.
  4. PHP: $_COOKIE['shw'] содержит значения.
  5. Продолжить с PHP

Например, я использую некоторые распространенные функции файлов cookie, найденные в Интернете. Убедитесь, что setCookie возвращает правильные значения. Я помещаю этот код сразу после тега head. Очевидно, что функция должна быть в исходном файле.

<head>
<script src="/include/cookielib.js"></script>
<script type=text/javascript>
function setScreenHWCookie() {
    // Function to set persistant (default) or session cookie with screen ht & width
    // Returns true if cookie matches screen ht & width or if valid cookie created
    // Returns false if cannot create a cookies.
    var ok  = getCookie( "shw");
    var shw_value = screen.height+"px:"+screen.width+"px";
    if ( ! ok || ok != shw_value ) {
        var expires = 7 // days
        var ok = setCookie( "shw", shw_value, expires)
        if ( ok == "" ) {
            // not possible to set persistent cookie
            expires = 0
            ok = setCookie( "shw", shw_value, expires)
            if ( ok == "" ) return false // not possible to set session cookie
        }
        window.location.reload();
    }
    return true;
}
setScreenHWCookie();
</script>
....
<?php
if( isset($_COOKIE["shw"])) {
    $hw_values = $_COOKIE["shw"];
}
person user3236232    schedule 16.04.2015

PHP работает только на стороне сервера, а не на хосте пользователя. Используйте JavaScript или jQuery, чтобы получить эту информацию и отправить через AJAX или URL (?x=1024&y=640).

person IProblemFactory    schedule 01.10.2009
comment
Это будет ?x=1024&y=640 - person EFraim; 01.10.2009
comment
я думаю, вам нужно использовать &y вместо?y - person eylay; 30.10.2017

Быстрый ответ - нет, тогда вы, вероятно, спросите, почему я не могу сделать это с помощью php. ОК, вот более длинный ответ. PHP — это серверный язык сценариев, поэтому он не имеет ничего общего с типом конкретного клиента. Затем вы можете спросить: «Почему я могу получить агент браузера из php?», Это потому, что эта информация отправляется с начальными заголовками HTTP по запросу на сервер. Поэтому, если вам нужна информация о клиенте, которая не отправляется с заголовком HTTP, вы должны использовать клиентский язык сценариев, такой как javascript.

person Kisded Szabi - CodeRevolution    schedule 11.05.2019

Чтобы получить ширину экрана или высоту экрана
1- Создайте файл PHP (getwidthscreen.php) и напишите в нем следующие команды
PHP (getwidthscreen.php)

<div id="widthscreenid"></div>
<script>
document.getElementById("widthscreenid").innerHTML=screen.width;
</script>

2- Получите ширину экрана через сеанс cURL с помощью следующих команд
PHP (main.php)

$ch = curl_init( 'http://hostname/getwidthscreen.php' );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
$result = curl_exec( $ch );
print_r($result);
curl_close( $ch );
person R. Yaghoobi    schedule 03.04.2021

В PHP нет стандартного способа получить эту информацию. Однако это возможно, если вы используете стороннее решение. Детектор устройств 51Degrees для PHP имеет необходимые вам свойства:

Дает вам ширину и высоту экрана пользователя в пикселях. Чтобы использовать эти свойства, вам необходимо загрузить детектор с sourceforge. Затем вам нужно включить следующие 2 строки в ваш файл/файлы, где необходимо определить высоту и ширину экрана:

<?php
require_once 'path/to/core/51Degrees.php';
require_once 'path/to/core/51Degrees_usage.php';
?>

Где path/to/core — это путь к каталогу Core, который вы скачали с sourceforge. Наконец, чтобы использовать свойства:

<?php
echo $_51d['ScreenPixelsHeight']; //Output screen height.
echo $_51d['ScreenPixelsWidth']; //Output screen width.
?>

Имейте в виду, что эти переменные могут иногда содержать значение «Неизвестно», когда устройство не может быть идентифицировано.

person Mike    schedule 07.08.2014

решение: сделать масштабируемый веб-дизайн ... (наш, я должен сказать, правильный веб-дизайн) форматирование должно быть выполнено на стороне клиента, и я действительно хотел, чтобы информация передавалась на сервер, но информация все еще полезна (сколько объектов в строках типа сделка), но все же веб-дизайн должен быть гибким, поэтому каждый элемент строки не должен помещаться в таблицы, если это не фактическая таблица (и данные будут масштабироваться до ее отдельных ячеек), если вы используете div, вы можете складывать каждый элемент рядом друг с другом и ваше окно должно «разбить» строку в нужном месте. (просто нужен правильный css)

person Pere Noel    schedule 24.09.2016

person    schedule
comment
Вы не можете установить переменную php в JavaScript. - person japetko; 13.10.2016
comment
Чтобы объяснить это гениально: сначала php выполняется на стороне сервера, т.е. до достижения браузера, в то время как javascript выполняется после достижения браузера. - person Sumeet; 14.10.2016