Php Проверка ссылка на доступность

Небольшой php скрипт который проверяет доступность ссылки, для меня приемлемыми были ответы 200,301,302,403,405:

<?php
function is_valid_url($url)
{
$timeout = 10;
$ch = curl_init($url);

// Set request options
curl_setopt_array($ch, array(
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_NOBODY => true,
CURLOPT_TIMEOUT => $timeout,
CURLOPT_USERAGENT => "page-check/1.0"
));

// Execute request
curl_exec($ch);

if(curl_errno($ch)) {
curl_close($ch);
return false;
}

$url = @parse_url($url);

if ( ! $url) {
return false;
}

$url = array_map('trim', $url);
$url['port'] = (!isset($url['port'])) ? 80 : (int)$url['port'];
$path = (isset($url['path'])) ? $url['path'] : '';

if ($path == '')
{
$path = '/';
}

$path .= ( isset ( $url['query'] ) ) ? "?$url[query]" : '';

if ( isset ( $url['host'] ) AND $url['host'] != gethostbyname ( $url['host'] ) )
{

$headers = get_headers_curl("$url[scheme]://$url[host]:$url[port]$path");

$headers = ( is_array ( $headers ) ) ? implode ( "\n", $headers ) : $headers;
preg_match_all ( '#^HTTP/.*\s+[0-9]+\s#i', $headers,$match );
$tmp = explode(' ',$match[0][0]);
//print_r($tmp);
$code = array(200,301,302,403,405);
if(in_array($tmp[1],$code)){
return true ;
}
}
return false;
}
?>

Php переводим при помощи Google

Используя специальный api вы можете переводить текст вашего сайта «на лету». Для этого вам понадобиться следующая функция:

<?php
function gtranslate($s_text, $s_lang, $d_lang){
//определяем переменную, которая содержит api url Google Translate
$url = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=".urlencode($s_text)
."&langpair=".urlencode($s_lang.'|'.$d_lang);
$c = curl_init();
curl_setopt($c, CURLOPT_URL, $url);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_REFERER, "http://teaseo.ru");
$b = curl_exec($c);
curl_close($c);
$json = json_decode($b, true);
if ($json['responseStatus'] != 200)return false;
return $json['responseData']['translatedText'];
}  
?>

Использовать можно так :

$text=gtranslate($text, «ru», «uk»);

Php PDO работаем с MySQL

Кто-то пишет свой набор функций для работы с MySQL, кто-то работает с фреймворками где обычно есть полный набор необходимых инструментов, а мне вот например нравиться PDO. И так, для подключения к базе —

<?php
$dbhost ='localhost';
// username and password to log onto db server
$dbuser ='user';
$dbpass ='password';
// name of database
$dbname='base';
//Charset
$sqlchar='utf8';


$db = new PDO ( 'mysql:host=' . $dbhost . ';dbname=' . $dbname, $dbuser, $dbpass);
$db->query ( 'SET character_set_connection = '.$sqlchar );
$db->query ( 'SET character_set_client = '.$sqlchar );
$db->query ( 'SET character_set_results = '.$sqlchar );
?>

Получаем одну строку:

$row = $db->query(«select row from tablename WHERE 1;»)->fetch();

Все строки

$row = $db->query(«select row from tablename WHERE 1;»)->fetchAll();

Определения кода ошибки

$ercode = $db->exec(«delete from tablename where id='».$id.»‘;»)->errorCode();
print_r($ercode);

Определения последнего ID

$lastid = $db->lastInsertId();

Определение количества строк

$player_stat = $db->query(«SELECT COUNT(*) FROM players WHERE name = ‘».$val[‘name’].»‘;»)->fetchColumn()

Вставить новую строку, если данные хранятся в массиве $t в формате $t[название столбца] = данные

$q = $db->prepare(«INSERT INTO table («.(implode(«,»,array_keys($t))).») VALUES (‘».(implode(«‘,'»,$t)).»‘);»)->execute();

Изменяем строку

$db->prepare(«UPDATE table SET column=’data’ WHERE id = ‘1’;»)->execute();

Для того что бы проверить подключены ли модуль php-pdo и php-pdo_mysq:

<?php
if ( !extension_loaded('pdo')  ){
....
}elseif ( !extension_loaded('pdo_mysql') ) {
....
}
?>


Php количество дней в месяце.

В общем-то ничего сложного нет, но так что бы не забыть, все очень просто, что бы получить количество дней в определенном месяце :

<?php
date("t", strtotime("2011-02"));
?>

Для того, что бы узнать номер дня в году (формат времени гггг-мм-дд):

<?php
date("z", strtotime("2011-02-05"));
?>

Что бы узнать номер недели (формат времени гггг-мм-дд):

<?php
date("W", strtotime("2011-02-05"));
?>

PHP Warning: PHP Startup: fileinfo: Unable to initialize module

Вот такое предупреждение я стал получать при выполнении команды php -v:

PHP Warning: PHP Startup: fileinfo: Unable to initialize module

решение оказалось банально простым, необходимо выполнить :

pecl install fileinfo memcache

Php несколько простых примеров не безопасного кода

И так, недавно я столкнулся с кодом написанным неким Фрилансером для конторы в которой я работаю. И так, вот кусочек его кода:

<?php
if(!$top)
$top="top_home.php";
include($top)
?>

Это код обрабатывал ссылку такого типа:

www.server.com/index.php?top=page.php

Но, что бы это все работало пришлось в php.ini включить переменную:

register_globals = On

а это абсолютно небезопасно, и мы попросили его переделать это, и вот что он сделал:

<?php
if(!$_GET[top])
$_GET[top]="top_home.php";
include($_GET[top])
?>

но это не намного безопасней предыдущего. Например, при помощи вот такого запроса можно просмотреть файлы системы:

www.server.com/index.php?top=/etc/passwd

Я бы порекомендовал :

1. Используйте fopen()для открытия файлов, сохраняйте в переменную и затем выводите используя print
2. Не используйте include();
3. Проверяйте входящие переменные при помощи регулярных выражений, как пример:

<?php
if (ereg("^[a-z]+\.html$", $_GET[cen])) {
echo "Good!";
} else {
die("Try hacking somebody else's site.");
}
?>

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

Минимум необходимых опций для обеспечения безопасности, в php.ini:

allow_url_fopen = Off
enable_dl = Off
expose_php = Off
error_log = /var/log/error_php.log

Вот и все, не совершайте глупых ошибок, и будьте аккуратны

Php Узнаем расширение файла

Для того, что бы найти расширение файла воспользуемся функцией pathinfo:

<?php

$video = 'hostonnet.avi';
$info = pathinfo($video);
echo '<pre>';
print_r($info);

// Расширение файла

echo $info['extension'] . "<br>"; // avi

// Имя файла без расширения

echo $info['filename'] . "<br>"; // hostonnet

?>

PhP Функция для подключения всех файлов в директории

Данная функция подключает все файлы находящиеся в указанной директории:

<?php
function include_from($dir, $ext='php'){
$opened_dir = opendir($dir);

while ($element=readdir($opened_dir)){
$fext=substr($element,strlen($ext)*-1);
if(($element!='.') && ($element!='..') && ($fext==$ext)){
include($dir.$element);
}
}
closedir($opened_dir);
}
?>

PhP текущий онлайн сайта

И так, если понадобится на сайте показывать текущее количество online пользователей, это можно реализовать так. Создадим таблицу:

CREATE TABLE useronline (
timestamp int(15) DEFAULT ‘0’ NOT NULL,
ip varchar(40) NOT NULL,
file varchar(100) NOT NULL,
PRIMARY KEY (timestamp),
KEY ip (ip),
KEY file (file)
);

а теперь перейдем к php скрипту:

<?php
// Ваши настройки MySQL сервера
$server = "xxx";
$db_user = "xxx";
$db_pass = "xxx";
$database = "xxx";
//Конектимся к базе
$db = mysql_connect($server, $db_user,$db_pass);
mysql_select_db($database,$db);

$timeoutseconds = 300; //5 minutes

$timestamp = time();
$timeout = $timestamp-$timeoutseconds;

$insert = mysql_query("INSERT INTO useronline VALUES ('$timestamp','$REMOTE_ADDR','$PHP_SELF')",$db);
if(!($insert)) {
print "Useronline Insert Failed > ";
}
$delete = mysql_query("DELETE FROM useronline WHERE timestamp<$timeout",$db);
if(!($delete)) {
print "Useronline Delete Failed > ";
}
$result = mysql_query("SELECT DISTINCT ip FROM useronline WHERE file='$PHP_SELF'",$db);
if(!($result)) {
print "Useronline Select Error > ";
}
$user = mysql_num_rows($result);

mysql_close();

// Вывод результатов
if($user == 1) {
print("$user user online\n");
} else {
print("$user users online\n");
}
?>

PhP Использование Cookies в CURL

Нам понадобиться файл cookies.txt с сохраненными куками, далее подаем в функцию url сайта.

function get_from_forum($URL)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $URL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_COOKIEJAR, ‘cookies.txt’);
curl_setopt($ch, CURLOPT_COOKIEFILE, ‘cookies.txt’);

$output = curl_exec($ch);
curl_close($ch);
return $output;
}