КОнтакты, предложения, отзывы

.rar или .zip
Вложение
Онлайн-чат
На этом сайте, вы найдёте полезную информацию, практические советы в области веб-программирования, веб-дизайна и веб-разработок в целом. Мы с удовольствием поделимся с вами реальными примерами и решениями задач, связанных с jQuery , JavaScript , PHP и MySQL , версткой сайтов , поможем разобраться новичкам с современными технологиями, такими как Ajax , HTML5 , CSS3 и многими другими.

php js полезные функции

Функции на PHP

Класс модели (начало)


namespace models;

define('ROOT', dirname(__FILE__));  
// Или define('ROOT', __DIR__); 

require ROOT. '/config/db_params.php';

  // Содержимое файла db_params.php ::
  define('HOST', 'localhost');
  define('DBNAME', 'web4myself');
  define('LOGIN', 'root');
  define('PASSWORD', '');
  define('TABLENAME', 'posts');
  define('USERSTABLE', 'users');


class Model{
  
  protected $db;
  
  public function __construct(){
    try{
      mb_internal_encoding("UTF-8");
      $this->db =  new \PDO('mysql: host='.HOST.'; dbname='. DBNAME, LOGIN, PASSWORD);
        
      $this->db->setAttribute( \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION );
      $this->db->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_ASSOC); 
      $this->db->exec("SET NAMES 'utf8mb4'"); 
      $this->db->exec("SET CHARACTER SET 'utf8mb4'");
      $this->db->exec("SET SESSION collation_connection = 'utf8mb4_general_ci'");
    } catch (\Exception $e) {
      echo 'Ошибка конструктора ' . $err->getMessage(). '<br> в файле '.$err->getFile().", строка ".$err->getLine() . "<br><br>Стэк вызовов: " . preg_replace('/#\d+/', '<br>$0', $err->getTraceAsString());
      exit;  
    }
  }
  
 // универсальная функция для операций с таблицами MySQL
  /**
  * 
  * @param string $query - строка запроса
  * @param array $values - массив подставляемых в запрос значений (если есть)
  * @param bool $param
  * 
  * @return массив строк если не задан @param или количество обновлённых, втавленных или присутсвующих в таблице строк
  */
  public function query($query, array $values = array(
), $param=false){
    try{
      $stmt = $this->db->prepare($query);
      $values_len = count($values);
      
      for ($i = 0; $i < $values_len; $i++) {
        $value = trim($values[$i]);
        if (preg_match('/^\d+$/', $value)) {
          $stmt->bindValue($i + 1, $value, \PDO::PARAM_INT);
        }
        else {
          $stmt->bindValue($i + 1, $value, \PDO::PARAM_STR);
        }
      }
      $stmt->execute($values);
      if(!$param){
        return $stmt->fetchAll();
      }else{
        return $stmt->rowCount(); 
      }
      return $stat;
    } catch (\PDOException $err) {
      echo 'Ошибка при операции с БД ' . $err->getMessage(). '<br> 
              в файле '.$err->getFile().", строка ".$err->getLine() . "<br><br>Стэк вызовов: " . preg_replace('/#\d+/', '<br>$0', $err->getTraceAsString()); 
        exit;  
    }
    
  }
  
  public function escapeStr($str, $size=0){
      $str = trim($str);
      $str = preg_replace('/`/', '', $str);
      $str = htmlentities($str, ENT_QUOTES, "UTF-8");
      if($size)$str = mb_substr($str, 0, $size, "UTF-8");
      return $str;
  }
 
  
  function __destruct(){
    $this->db = null;
    unset($this);
  }
  
}


/* примеры использования функции query */

$m = new Model();

$n = $m->query("select * from `".TABLENAME."` where `id` between ? and ?", [1, 3], true);
$n = $m->query("insert into `".TABLENAME."` values(null, 111)", [], true);
$n = $m->query("update `".TABLENAME."` set `text`=? where `id` between ? and ?", ['aaa11112', '1', '3'], true); // примечание - если обновляемые данные те же, что уже в таблице, rowCount вернёт 0

print_r($n);

Функции проверки данных и шифрования паролей

// проверка введённых данных
public function validate($value, $pattern, $message){
  if(preg_match($pattern, $value)) return '';
  return $message;
}

// ещё один вариант проверки данных 
public function validate_num($value, $pattern){
  // если соответствует рег. выражению, то возвращается 0
  return intval(!preg_match($pattern, $value));
}


// шифрование пароля
public function set_password($password){
  return md5(md5(sha1($password)));
}

отправка письма в html-формате

// отправка письма в html-формате с напоминанием пароля
/**
* 
* @param $email - кому письмо
* @param $login - логин зарегистрировавшегося пользователя
* @param $password - пароль
* @param $from - почтовый адрес сайта
* 
* @return true в случае успеха, false в ином 
*/
public function _mail_($email, $login, $password, $from){
  $subject = 'Не забудьте пароль';
  $message = "<a  style='display:block; margin:auto;' href='http://web4myself.ru'><img src='http://web4myself.ru/img/Shot5.jpg'></a>
             Ваш логин: <b>".$login."</b><br>
             Пароль: <b>".$password."</b>";
  $headers = "From: $from\r\nReply-to: $from\r\nContent-type: text/html; charset=utf-8";
  // Отправляем сообщение, используя mail() функцию 
  if(mail($email, $subject, $message, $headers)) return true;
  return false;
}


// отправка письма с вложением (.rar или .zip) или без него
public function _mail_($from, $to, $name, $message, $subject, $file=null){
  
  if(!$from){
    $to = "$name <$to>";
    $from = "web4myself.ru <$this->adminEmail>";
  }
  
  // сюда передаём $_FILES, хотя можно обойтись и без передачи его в функцию, так как он доступен глобально
  if(!empty($file)){
    
    if (is_uploaded_file($file['file']['tmp_name'])){
    
    $tmp = $file['file']['tmp_name'];
    $name = basename($file['file']['name']);
    $name = strtolower(preg_replace("/[^\w.а-яё\-]/i", "", $name));
    $err = $this->check_mimeType($tmp, '/application\/(octet-stream|x-rar|zip)/', '2');
    if($err){
      exit($err);
    }
    
    $uploadfile = ROOT."/template/attachments/$name";
    if(move_uploaded_file($file['file']['tmp_name'], $uploadfile)){
      
      $fp = fopen($uploadfile,"r"); 
      if(!$fp){ 
        exit(2); 
      } 
      $file = fread($fp, filesize($uploadfile)); 
      fclose($fp); 
      
      $boundary = "--".md5(uniqid(time()));// генерируем разделитель 
      $headers .= "MIME-Version: 1.0\n"; 
      $headers .="Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
      $headers .= "From: $from\n"; 
      $multipart .= "--$boundary\n"; 
      $multipart .= "Content-Type: text/html; charset=utf-8\n"; 
      $multipart .= "Content-Transfer-Encoding: Quot-Printed\n\n"; 
      $multipart .= "$message\n\n";
      $message_part = "--$boundary\n"; 
      $message_part .= "Content-Type: application/octet-stream\n"; 
      $message_part .= "Content-Transfer-Encoding: base64\n"; 
      $message_part .= "Content-Disposition: attachment; filename = \"".$name."\"\n\n"; 
      $message_part .= chunk_split(base64_encode($file))."\n"; 
      $multipart .= $message_part."--$boundary--\n";
      
      unlink($uploadfile);
      
      return mail($to, $subject, $multipart, $headers);
        
      }  
    }
  }
  
  $headers= "MIME-Version: 1.0\r\n";
  $headers .= "Content-type: text/html; charset=utf-8\r\n";
  $headers .= "From: $from\r\n";
  
  $html = "<img src='".$this->domain."/template/images/1465402267.gif' style='display: block; width: 100%;' />
  
           <h1 style='color: #cddd92; text-align: center; font-weight: bold; font-size: 27px !important; margin-top: 11px;'>
             Extends of
           </h1>
  
  <img src='".$this->domain."/template/images/1494080839.3824.png' style='display: block; width: 77%; margin: auto;' />";
  
  
  $fullMessage = "<div style='margin: 17px 0;'>
               $html $message
              </div>
             ";
  
  return mail($to, $subject, $fullMessage, $headers);
  
}

Проверка mime-типа файла

// получение mime-типа файла
public function get_mimeType($filename){
  $finfo = finfo_open(FILEINFO_MIME_TYPE); 
  // возвращает mime-тип
  $mime = finfo_file($finfo, $filename);
  finfo_close($finfo);
  return $mime;
}


// проверка миме-типа файла
public function check_mimeType($filename, $pattern, $message){
  $finfo = finfo_open(FILEINFO_MIME_TYPE);// возвращает mime-тип
  $mime = finfo_file($finfo, $filename);
  finfo_close($finfo);
  if(!preg_match($pattern, $mime)){
      return $message;
  } else return '';
}

// пример использования ::
$obj->get_mimeType($file, '/image\/(jpeg|png|gif)/', 'Файл не является изображением<br>');

Функция ресайза изображения (ImageMagick)

/**
* @param $orig - путь к исходному файлу
* @param $path - путь сохранения выходного файла
* @param $size - размер картинки, ширина или высота выходного файла в зависимости от пропорций
* 
* @return $result - true или false
*/
public function resizeUploadImg($orig, $path, $size){
  
  $result=FALSE;

  try {
    $img = new \Imagick(realpath($orig)); 
        
    // если это гифка
    if($img->getImageMimeType()=='image/gif'){
      
      foreach ($img as $frame) {
        $frame->thumbnailImage($size, $size, true);
      }
      // Обратите внимание, writeImages вместо writeImage
      $result=$img->writeImages($path, true);
    
    }else{
      $img->thumbnailImage($size, $size, true);
      $img->setImageCompression(Imagick::COMPRESSION_JPEG);
      $img->setImageCompressionQuality(70);
      $result = $img->writeImage($path);
    }
    $img->clear();
  }catch(Exception $e){
    echo 'У нас проблема '. $e->getMessage(). " в файле ".$e->getFile().", строка ".$e->getLine();
  }
  
  return $result;
  
} 

Получение случайных елементов массива

/* Случайный элемент списка (числового массива) */
// Первый способ :: array_rand($array, [$num=1]) Выбирает одно или несколько случайных значений из массива. Возвращает ключ (или ключи) данных случайных элементов. 
$input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank");
$rand_keys = array_rand($input, 2);
echo $input[$rand_keys[0]] . "<br>";
echo $input[$rand_keys[1]] . "<br>";

$input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank");
$rand_keys = array_rand($input);
echo $input[$rand_keys] . "<br>";

// Второй способ
$arr = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// Генерируем случайный индекс массива
$index = rand(0,count($arr) - 1);
// Выводим случайный элемент массива
echo $arr[$index]; 


/* случайное значение из ассоциативного массива */
$arr = array(
           'vovan' => 'alive',
           'boss' => 'nofollow',
           'sancho' => 'forever'
       );
       
// array_keys — Возвращает все или некоторое подмножество ключей массива
$keys = array_keys($arr);
$rand_key = array_rand($keys);
$rand_elem = $keys[$rand_key];
echo $arr[$rand_elem] . "<br>";


Функции на javascript и jQuery

Похожая на $.ajax() функция, но написанная лично мной на чистом javascript

function _ajax_(obj) {

  try {
    var xhr = new XMLHttpRequest()
  } catch (e1) {
    try {
      var xhr = new ActiveXObject("Msxml2.XMLHTTP")
    } catch (e2) {
      try {
        var xhr = new ActiveXObject("Microsoft.XMLHTTP")
      } catch (e3) {
        var xhr = false
      }
    }
  }
  obj.type = obj.type || "GET";
  if (obj.type === 'POST') {
    xhr.open("POST", obj.url, true);
    var params = '';
    if (typeof obj.data === 'string') {
      params = obj.data;
      xhr.setRequestHeader("Content-type",
        "application/x-www-form-urlencoded");
      //console.log(params);
    } else if (typeof obj.data === 'object') {

      if (obj.contentType === false) {
        params = obj.data;
      } else {
        for (var i in obj.data) {
          params += i + '=' + obj.data[i] + '&';
        }
        params = params.slice(0, -1);
        xhr.setRequestHeader("Content-type",
          "application/x-www-form-urlencoded");
      }
      xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    }
    xhr.onreadystatechange = function() {
      if (xhr.readyState == 4 && xhr.status == 200) {
        if (obj.dataType === 'json') {
          obj.success(JSON.parse(this.responseText));
        } else {
          obj.success(this['response' + obj.dataType]);
        }
      }
      //else console.log( "Ajax error: " + this.statusText);
    }
    xhr.send(params);
  } else if (obj.type === "GET") {
    var params = '?';
    if (typeof obj.data === 'string')
      params += obj.data;
    else if (typeof obj.data === 'object') {
      for (var i in obj.data) {
        params += i + '=' + encodeURIComponent(obj.data[i]) + '&'
      }
      params = params.slice(0, -1);
      params += "&nocache=" + Math.random() * 1000000;
    }
    xhr.open("GET", obj.url + params, true);
    xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    xhr.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
        if (obj.dataType === 'json') {
          obj.success(JSON.parse(this.responseText));
        } else {
          obj.success(this['response' + obj.dataType]);
        }
      }
       //else console.log( "Ajax error: " + this.statusText)
    }
    xhr.send(null);
  }
}

/**
 * Пример использования ::
 */
_ajax_({
  url: './php/reggi.php',
  type: 'POST',
  dataType: 'Text',
  contentType: false,// для того, чтобы моожно было передать и файл
  data: formData,
  success: function(response) {
    window.clearInterval(interval);
    // если пришла кодовая цифра,
    if (response == 1) {
      responseDiv.html('Вы успешно зарегистрировались, ваш логин и пароль выслан на ваш Е-мэйл');
    } else if (response == 2) {
      responseDiv.html('Пользователь с таким логином и/или E-mail уже зарегистрирован');
    } else {
      responseDiv.html(response);
    }
  }
});

/**
 * Два дня писал :)))
 */

Установка обработчиков событий

var utils = {
  addListener: null,
  removeListener: null
};

if (typeof window.addEventListener === "function") {
  utils.addListener = function(e, type, fn) {
    e.addEventListener(type, fn, false);
  }
  utils.removeListener = function(e, type, fn) {
    e.removeEventListener(type, fn, false);
  }
} else if (typeof document.attachEvent === "function") {
  utils.addListener = function(e, type, fn) {
    e.attachEvent("on" + type, fn);
  }
  utils.removeListener = function(e, type, fn) {
    e.detachEvent("on" + type, fn);
  }
} else {
  utils.addListener = function(e, type, fn) {
    e["on" + type] = fn;
  }
  utils.removeListener = function(e, type, fn) {
    e["on" + type] = null;
  }
}

Кроссбраузерная функция отмены действия по умолчанию

function preventdefault(e){
  e = e || window.event;
  if(e.preventDefault) e.preventDefault();
  else e.returnValue  = false; 
}

Случайные элементы js-массива

// Случайное число между min и max (дробное)
function getRandomArbitary(min, max){
  return Math.random() * (max - min) + min;
}


// Пример: Случайное число между min и max (целое)
function getRandomInt(min, max){
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

function getRandElFromArray(arr){
  var max = arr.length - 1,
      rand = Math.floor(Math.random() * (max + 1));
  return arr[rand];
}

var arr = [12, 22, 55, 66, 77, 90],
  len = arr.length-1,
  rand= getRandomInt(0, len);
  
console.log(arr[rand]);
console.log(getRandElFromArray(arr));

/*
Объекты в JavaScript сочетают в себе два важных функционала.
Первый – это ассоциативный массив: структура, пригодная для хранения любых данных. Рассмотрим использование объектов именно как массивов.

Аналогичная PHP-функции array_keys
Если указан необязательный параметр search_value, функция возвращает только ключи, совпадающие с этим параметром. В обратном случае, функция возвращает все ключи массива input.  strict - определяет использование строгой проверки на равенство (===) при поиске.
*/

function array_keys( input, search_value, strict ) {

  var tmp_arr = new Array(),
        include = true,
        cnt = 0;
        
  // делаем проход по всему массиву
  for ( key in input ){
    include = true;
    
    // если передан искомый ключ
    if ( search_value != undefined ) {
      if( strict && input[key] !== search_value ){
        include = false;
      } else if( input[key] != search_value ){
        include = false;
      }
    }

    if( include ) {
      // Добавляем ключ в созданный массив 
      tmp_arr[cnt] = key;
      cnt++;
    }
  }
  // Возвращаем массив с ключами
  return tmp_arr;
}

// создадим 'массив' и помедитируем над ним..
var arr = new Object({firstname: 'Kevin', surname: 'van Zonneveld'});// и шо дальше? кто подскажет кто поймёт? :)))

// и выход тут же мы нашли, вернее он нашелся сам::
var arr = {firstname: 'Саня',
           surname: 'Пехота',
           age: 33},
           keys = array_keys( arr ),
           rand_key = getRandElFromArray(keys),
           rand_elem = arr[rand_key];// вот и он, наш случайный товарищ, подельник и брат :::
           console.log(rand_elem);
           
// Object.keys возвращает массив с ключами ассоциативного массива. Если нужно, можно использовать вместо фунции array_keys
console.log(Object.keys({firstname: 'Саня',
                   surname: 'Пехота',
                   age: 33}));

Валидация формы

// расширяем джейкверю на функцию validate
$.fn.validate = function (pattern) {
  var el = $(this);
    if(pattern.test(el.val())){
        el.css({'box-shadow': 'inset 0 0 2px 1px green'});
      return 0;
    }else {
      el.css({'box-shadow': 'inset 0 0 2px 1px red'});
      return 1;
    }
}

/* Делаем проверку полей с помощью этой функции
     Проверка и отправка формы связи */
var form = $('.form');
form.submit(function(e){
  preventdefault(e);
  var $that = $(this),
      nameInp = $that.find('[name=name]'),
      phoneInp = $that.find('[name=phone]'),
      textInp = $that.find('[name=text]'),
      
      name = nameInp.val(),
      phone = phoneInp.val(),
      text = textInp.val(),
      
      fall;
      
  fall = nameInp.validate(/^ ? ?[_\-a-zа-яё]{2,17} ?([_\-a-zа-яё]*){2,17} ?([_\-a-zа-яё]*){2,17} ?$/i)
  // Допустим, нам нужно чтобы можно было ввести или телефон или E-mail::
        + phoneInp.validate(/^ ? ?((\+?\d? ?\(?\d{3}\)? ?\d{3}( |-)?\d{2}( |-)?\d{2})|(\w+@[\w]+?\.[a-z]{2,6})) ?$/);
  if(text)fall += textInp.validate(/^[^\<\>]{3,333}$/);
        
  var data = {
      name: trim(name),
      phone:trim(phone),
      text:trim(text)
  };
          
  if(!fall){
    submitInp.prop("disabled", true);
    $.ajax({
       // Отправляем её аяксом, естесственно.. AJAX FOREVER
    });
  }
});


TRIM

String.prototype.trim = function(charlist){
  charlist = !charlist ? ' \s\xA0' : charlist.replace        (/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '\$1');
	var re = new RegExp('^[' + charlist + ']+|[' + charlist + ']+$', 'g');
	return this.replace(re, '');
};

console.log('/   ffff    /'.trim('/'));
2016.04.30 106

Войдите или Зарегистрируйтесь чтобы оставить комментарий

Комментарии


    Яндекс.Метрика Яндекс.Метрика