Различные решения PHP

Проблема IP в PHP

IPv4 следует хранить как INT UNSIGNED NOT NULL.

Проблема: в модуле голосования есть проблемы с IP голосующих, так как php не понимает беззнаковые числа.

Решение 1.

Because PHP's integer type is signed, and many IP addresses will result in negative integers on 32-bit architectures, you need to use the «%u» formatter of sprintf() or printf() to get the string representation of the unsigned IP address.

То есть следует использовать sprintf('%u', $ip) или printf('%u', $ip).

Решение 2. На уровне MySQL есть функции INET_ATON() и INET_NTOA() - то есть от ip2long() возможно вообще отказаться:

$query = "INSERT INTO ... INET_ATON('".addslashes($_SERVER['REMOTE_ADDR'])."')";

Версия для печати

Ссылка на версию для печати:

print.php
<a target="_blank" href="<?php
  if (isset($_GET['tmpl'])) echo $_SERVER['REQUEST_URI'];
  else {
    $query = parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY);
    $url = $_SERVER['REQUEST_URI'] . ($query ? '&tmpl=print' : '?tmpl=print');
    echo $url;
  }
  ?>">Версия для печати</a>

Сохранение массива в БД через array_map

save.php
public function save($data) {
  $wrapApostrophe = function($elm) { return '`'.$elm.'`'; };
  $wrapSlashes = function($elm) { return "'".addslashes($elm)."'"; };
 
  $q1 = implode(', ', array_map($wrapApostrophe, array_keys($data)));
  $q2 = implode(', ', array_map($wrapSlashes, array_values($data)));
 
  $query = "INSERT INTO `{$this->options->table}` ($q1) VALUES ($q2)";
 
  $this->db->Query($query);
}

Редукция массива через array_reduce

array_reduce.php
$array = array(
0 => array('id' => 1, 'section_id' => 1),
1 => array('id' => 2, 'section_id' => 2),
2 => array('id' => 3, 'section_id' => 2),
3 => array('id' => 3, 'section_id' => 3),
);
 
function reduceCallback($result, $item) {
  $result[] = $item['section_id'];
  return $result;
}
 
$result = array_reduce($array, 'reduceCallback', array());
echo var_dump($result);

Простой парсинг RSS

parse-rss.php
$url = 'http://medportal.ru/news/rss/'; //адрес RSS ленты
$rss = simplexml_load_file($url); // Интерпретирует XML-файл в объект
$queryData = array();
 
// формирование данных для вставки
 
foreach($rss->channel->item as $item) {
  $guid = md5($item->guid);
  $title = addslashes($item->title);
  $description = addslashes($item->description);
  $category = addslashes($item->category);
  $pubDate = addslashes(strftime("%Y-%m-%d %H:%M:%S", strtotime($item->pubDate)));
  $link = addslashes($item->link);
  $queryData[] = "('$guid', '$title', '$description', '$category', '$pubDate', '$link', 1)";
}
 
// вставка данных (первичный ключ id, по автоинкрименту, для предотвращения дублирования рассчитывается md5 от guid)
$query = "INSERT IGNORE INTO `external_rss` (`guid`, `title`, `description`, `category`, `pubDate`, `link`, `is_active`) VALUES ".implode(', ', $queryData);
$db->Query($query);
Печать/экспорт