суббота, 30 ноября 2013 г.

List tables with structure in MySQL


Получить список таблиц и их структуру в MySQL  


SHOW DATABASES; - список баз данных
SHOW TABLES [FROM db_name]; -  список таблиц в базе
SHOW COLUMNS FROM таблица [FROM db_name]; - список столбцов в таблице
SHOW CREATE TABLE table_name; - показать структуру таблицы в формате "CREATE TABLE"
SHOW INDEX FROM tbl_name; - список индексов
SHOW GRANTS FOR user [FROM db_name]; - привилегии для пользователя.


SHOW VARIABLES; - значения системных переменных
SHOW [FULL] PROCESSLIST; - статистика по mysqld процессам
SHOW STATUS; - общая статистика
SHOW TABLE STATUS [FROM db_name]; - статистика по всем таблицам в базе


Kill all queries in MySQL

Определение и уничтожение нежелательных запросов в MySQL



Показать все запущенные запросы можно так:

SHOW PROCESSLIST

Или можно показать все запущенные запросы с условием:

SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND = 'Query' AND TIME > 10


Убить нежелательный запрос можно по идентификатору, полученному из предыдущих запросов:
KILL "ID";

Но можно и пакетно удалить все нежелательные запросы по условию:

SELECT CONCAT('KILL ',ID,';') FROM   INFORMATION_SCHEMA.PROCESSLIST
WHERE  USER = 'loginweb'  AND COMMAND = 'Query'  AND TIME > 10;




среда, 27 ноября 2013 г.

Delphi: Windows System Tray with API Shell_NotifyIcon

Помещаем иконку в трей на Delphi


uses
ShellApi;
const
  WM_ICONTRAY = WM_USER + 1;
type
  TMainForm = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    TrayIconData: TNotifyIconData;
    { Private declarations }
  public
    { Public declarations }
    procedure TrayMessage(var Msg: TMessage); message WM_ICONTRAY;
  end;



procedure TForm1.FormCreate(Sender: TObject);
begin
  with TrayIconData do
  begin
    cbSize:= SizeOf(TrayIconData);
    Wnd:= Handle;
    uID:= 0;
    uFlags:= NIF_MESSAGE + NIF_ICON + NIF_TIP;
    uCallbackMessage:= WM_ICONTRAY;
    hIcon:= Application.Icon.Handle;
    szTip:= 'Допустим, название Вашего приложения';
  end;
  Shell_NotifyIcon(NIM_ADD, @TrayIconData);
end;



procedure TForm1.FormDestroy(Sender: TObject);
begin
  Shell_NotifyIcon(NIM_DELETE, @TrayIconData);
end;
procedure TForm1.TrayMessage(var Msg: TMessage);
var
  P: TPoint;
begin
  case Msg.LParam of
    WM_LBUTTONDOWN:
      ShowMessage('Нажата левая кнопка мыши');
    WM_RBUTTONDOWN:
    begin
      GetCursorPos(p);
      PopupMenu1.Popup(P.X, P.Y);
    end;
  end;
end;






вторник, 26 ноября 2013 г.

PHP: Simplest Parse XML with Simplexml

Parser XML with PHP:


$xml_string = "<?xml version='1.0'?>
    <users>
       <user id='2' status='Admin'>
          <username>Mikki Mau</username>
          <useremail>mikki@mydomain.com</useremail>
       </user>
       <user id='3' status='User'>
          <username>Miki Mau</username>
          <useremail>mikki@mydomain.com</useremail>
       </user>
    </users>";
$xml = simplexml_load_string($xml_string);
foreach ($xml->user as $user) {
    //Get "id" and "status" attributes
    echo $user['id'].' ('.$user['status'].')<br>';
    //Get subnodes
    echo $user->username. '<br>';
    echo $user->useremail. '<br>';
}

RSS example on PHP and HTML



RSS файл
----------

<?php
 header("Content-Type: text/xml");
 echo "<?xml version=\"1.0\" encoding=\"windows-1251\"?>";
?>

<rss version="2.0">
<channel>
<title>Название канала</title>
<link>Сайт</link>
<description>Описание</description>
<language>Язык</language>

<item>
<title>название</title>
 <link>ссылка на заметку</link>
<description>текст</description>
<author>email автора</author>
<guid>ссылка на заметку</guid>
</item>

</channel>
</rss>

Фаил index
-------
<link rel="alternate" type="application/rss+xml" title="Lessons RSS" href="http://www.site.info/rss.php" />







РЕАЛИЗАЦИЯ


<?php
require(lala-lala.db);

header("Content-Type: text/xml");
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";

echo '<rss version="2.0">
<channel>';

$start=0;
$limit=50;
$db = new Mysqli;
$db->connectdb();
$request = ("SELECT * FROM `wp_posts` WHERE  `post_status` ='publish' AND `post_type` = 'post' ORDER BY ID DESC LIMIT $start, $limit");
$array=$db->mysqli_array($request);
$data = '<title>'.SITE_NAME.'</title>';
$data.= '<link>'.URL.'</link>';
$data.= '<description>'.DESCRIPTION.'</description>';
$data.= '<language>ru</language> ';

if ($array) {
foreach($array as $id=>$myrow) {
$data.= '<item>';
$data.= '<title>'.$myrow["post_title"].'</title>';
$data.= '<link>'.$myrow["post_name"].'</link>';
$data.= '<description>'.strip_tags(htmlspecialchars($myrow["post_excerpt"])).'</description>';
$data.= '<author>'.EMAIL.'</author>';
$data.= '<guid>'.$myrow["post_name"].'</guid>';
$data.= '</item>';
}
}

echo $data.'</channel>
</rss>';
// В шапку добавить: <link rel="alternate" type="application/rss+xml" title="RSS" href="http://www.site.info/rss.php" />
?>

Класс PHP-MySQLi-Database-Class-master





Пример реализации:


----.....

 'Inserted title',
'body' => 'Inserted body'
);
$results = $db->insert('posts', $insertData);
print_r($results);
?>





Сам класс: 


 * @author Josh Campbell
 * @copyright Copyright (c) 2010
 * @license http://opensource.org/licenses/gpl-3.0.html GNU Public License
 * @version 1.1
 **/
class MysqliDB {
/**
* Static instance of self
*
* @var object
*/
protected static $_instance;
/**
* MySQLi instance
*
* @var object
*/
protected $_mysqli;
/**
* The SQL query to be prepared and executed
*
* @var object
*/
protected $_query;
/**
* An array that holds where conditions 'fieldname' => 'value'
*
* @var array
*/
protected $_where = array();
/**
* Dynamic type list for where condition values
*
* @var array
*/
protected $_whereTypeList;
/**
* Dynamic type list for table data values
*
* @var array
*/
protected $_paramTypeList;
/**
* Dynamic array that holds a combination of where condition/table data value types and parameter referances
*
* @var array
*/
protected $_bindParams = array(''); // Create the empty 0 index
public function __construct($host, $username, $password, $db) {
$this->_mysqli = new mysqli($host, $username, $password, $db)
or die('There was a problem connecting to the database');
self::$_instance = $this;
}
/**
* A method of returning the static instance to allow access to the
* instantiated object from within another class.
* Inheriting this class would require reloading connection info.
*
* @uses $db = MySqliDb::getInstance();
*
* @return object Returns the current instance.
*/
public static function getInstance()
{
return self::$_instance;
}
/**
* Reset states after an execution
*
* @return object Returns the current instance.
*/
protected function reset()
{
$this->_where = array();
$this->_bindParams = array(''); // Create the empty 0 index
unset($this->_query);
unset($this->_whereTypeList);
unset($this->_paramTypeList);
}
/**
* Pass in a raw query and an array containing the parameters to bind to the prepaird statement.
*
* @param string $query Contains a user-provided query.
* @param array $bindData All variables to bind to the SQL statment.
* @return array Contains the returned rows from the query.
*/
public function rawQuery($query, $bindParams = NULL)
{
$this->_query = filter_var($query, FILTER_SANITIZE_STRING);
$stmt = $this->_prepareQuery();
if (gettype($bindParams) === 'array') {
$params = array(''); // Create the empty 0 index
foreach ($bindParams as $prop => $val) {
$params[0] .= $this->_determineType($val);
array_push($params, $bindParams[$prop]);
}
                call_user_func_array(array($stmt, "bind_param"),$this->refValues($params));
}
$stmt->execute();
$this->reset();
$results = $this->_dynamicBindResults($stmt);
return $results;
}
/**
*
* @param string $query Contains a user-provided select query.
* @param int $numRows The number of rows total to return.
* @return array Contains the returned rows from the query.
*/
public function query($query, $numRows = NULL)
{
$this->_query = filter_var($query, FILTER_SANITIZE_STRING);
$stmt = $this->_buildQuery($numRows);
$stmt->execute();
$this->reset();
$results = $this->_dynamicBindResults($stmt);
return $results;
}
/**
* A convenient SELECT * function.
*
* @param string $tableName The name of the database table to work with.
* @param integer $numRows The number of rows total to return.
* @return array Contains the returned rows from the select query.
*/
public function get($tableName, $numRows = NULL)
{
$this->_query = "SELECT * FROM $tableName";
$stmt = $this->_buildQuery($numRows);
$stmt->execute();
$this->reset();
$results = $this->_dynamicBindResults($stmt);
return $results;
}
/**
*
* @param _query = "INSERT into $tableName";
$stmt = $this->_buildQuery(NULL, $insertData);
$stmt->execute();
$this->reset();
($stmt->affected_rows) ? $result = $stmt->insert_id : $result = false;
return $result;
}
/**
* Update query. Be sure to first call the "where" method.
*
* @param string $tableName The name of the database table to work with.
* @param array $tableData Array of data to update the desired row.
* @return boolean
*/
public function update($tableName, $tableData)
{
$this->_query = "UPDATE $tableName SET ";
$stmt = $this->_buildQuery(NULL, $tableData);
$stmt->execute();
$this->reset();
($stmt->affected_rows) ? $result = true : $result = false;
return $result;
}
/**
* Delete query. Call the "where" method first.
*
* @param string $tableName The name of the database table to work with.
* @param integer $numRows The number of rows to delete.
* @return boolean Indicates success. 0 or 1.
*/
public function delete($tableName, $numRows = NULL) {
$this->_query = "DELETE FROM $tableName";
$stmt = $this->_buildQuery($numRows);
$stmt->execute();
$this->reset();
($stmt->affected_rows) ? $result = true : $result = false;
return $result;
}
/**
* This method allows you to specify multipl (method chaining optional) WHERE statements for SQL queries.
*
* @uses $MySqliDb->where('id', 7)->where('title', 'MyTitle');
*
* @param string $whereProp The name of the database field.
* @param mixed $whereValue The value of the database field.
*/
public function where($whereProp, $whereValue)
{
$this->_where[$whereProp] = $whereValue;
return $this;
}

        /**
* This methods returns the ID of the last inserted item
*
* @return integer The last inserted item ID.
*/
public function getInsertId()
{
        return $this->_mysqli->insert_id;
    }
/**
* Escape harmful characters which might affect a query.
*
* @param string $str The string to escape.
* @return string The escaped string.
*/
public function escape ( $str )
{
return $this->_mysqli->real_escape_string ( $str );
}
/**
* This method is needed for prepared statements. They require
* the data type of the field to be bound with "i" s", etc.
* This function takes the input, determines what type it is,
* and then updates the param_type.
*
* @param mixed $item Input to determine the type.
* @return string The joined parameter types.
*/
protected function _determineType($item)
{
switch (gettype($item)) {
case 'NULL':
case 'string':
return 's';
break;
case 'integer':
return 'i';
break;
case 'blob':
return 'b';
break;
case 'double':
return 'd';
break;
}
}
/**
* Abstraction method that will compile the WHERE statement,
* any passed update data, and the desired rows.
* It then builds the SQL query.
*
* @param int $numRows The number of rows total to return.
* @param array $tableData Should contain an array of data for updating the database.
* @return object Returns the $stmt object.
*/
protected function _buildQuery($numRows = NULL, $tableData = NULL)
{
(gettype($tableData) === 'array') ? $hasTableData = true : $hasTableData = false; (!empty($this->_where )) ? $hasConditional = true : $hasConditional = false;
// Did the user call the "where" method?
if (!empty($this->_where)) {
// if update data was passed, filter through and create the SQL query, accordingly.
if ($hasTableData) {
$i = 1;
$pos = strpos($this->_query, 'UPDATE');
if ( $pos !== false) {
foreach ($tableData as $prop => $value) {
// determines what data type the item is, for binding purposes.
$this->_paramTypeList .= $this->_determineType($value);
// prepares the reset of the SQL query.
($i === count($tableData)) ?
$this->_query .= $prop . ' = ?':
$this->_query .= $prop . ' = ?, ';
$i++;
}
}
}
//Prepair the where portion of the query
$this->_query .= ' WHERE '; $i = 1;
foreach ($this->_where as $column => $value) {
// Determines what data type the where column is, for binding purposes.
$this->_whereTypeList .= $this->_determineType($value);
// Prepares the reset of the SQL query.
($i === count($this->_where)) ?
$this->_query .= $column . ' = ?':
$this->_query .= $column . ' = ? AND ';
$i++;
}
}
// Determine if is INSERT query
if ($hasTableData) {
$pos = strpos($this->_query, 'INSERT');
if ($pos !== false) {
//is insert statement
$keys = array_keys($tableData);
$values = array_values($tableData);
$num = count($keys);
// wrap values in quotes
foreach ($values as $key => $val) {
$values[$key] = "'{$val}'";
$this->_paramTypeList .= $this->_determineType($val);
}
$this->_query .= '(' . implode($keys, ', ') . ')';
$this->_query .= ' VALUES(';
while ($num !== 0) {
($num !== 1) ? $this->_query .= '?, ' : $this->_query .= '?)';
$num--;
}
}
}
// Did the user set a limit
if (isset($numRows)) {
$this->_query .= " LIMIT " . (int) $numRows;
}
// Prepare query
$stmt = $this->_prepareQuery();
// Prepare table data bind parameters
if ($hasTableData) {
$this->_bindParams[0] = $this->_paramTypeList;
foreach ($tableData as $prop => $val) {
array_push($this->_bindParams, $tableData[$prop]);
}
}
// Prepare where condition bind parameters
if($hasConditional) {
if ($this->_where) {
$this->_bindParams[0] .= $this->_whereTypeList;
foreach ($this->_where as $prop => $val) {
array_push($this->_bindParams, $this->_where[$prop]);
}
} }
// Bind parameters to statment
if ($hasTableData || $hasConditional){
call_user_func_array(array($stmt, "bind_param"),$this->refValues($this->_bindParams));
}
return $stmt;
}
/**
* This helper method takes care of prepared statements' "bind_result method
* , when the number of variables to pass is unknown.
*
* @param object $stmt Equal to the prepared statement object.
* @return array The results of the SQL fetch.
*/
protected function _dynamicBindResults($stmt)
{
$parameters = array();
$results = array();
$meta = $stmt->result_metadata();
$row = array();
while ($field = $meta->fetch_field()) {
$row[$field->name] = NULL;
$parameters[] = &$row[$field->name];
}
        call_user_func_array(array($stmt, "bind_result"),$parameters);
while ($stmt->fetch()) {
$x = array();
foreach ($row as $key => $val) {
$x[$key] = $val;
}
array_push($results, $x);
}
return $results;
}
/**
* Method attempts to prepare the SQL query
* and throws an error if there was a problem.
*/
protected function _prepareQuery()
{
if (!$stmt = $this->_mysqli->prepare($this->_query)) {
trigger_error("Problem preparing query ($this->_query) ".$this->_mysqli->error, E_USER_ERROR);
}
return $stmt;
}
public function __destruct()
{
$this->_mysqli->close();
}
function refValues($arr)
{
//Reference is required for PHP 5.3+
if (strnatcmp(phpversion(),'5.3') >= 0) {
        $refs = array();
        foreach($arr as $key => $value)
            $refs[$key] = &$arr[$key];
        return $refs;
    }
  return $arr;
}
} // END class

воскресенье, 24 ноября 2013 г.

Перекодировать текст из utf-8 в windows-1251(cp-1251) на PHP

Перекодировать текст из utf-8 в windows-1251(cp-1251) на PHP 



<?php echo iconv("utf-8", "windows-1251", "Пора переходить на cp-1251."); ?>

Простой класс для работы с базой данных

Простой класс для работы с базой данных



class DB {
    private static $instance;
    private $MySQLi;
    private function __construct(array $dbOptions){
        $this->MySQLi = @ new mysqli($dbOptions['db_host'],$dbOptions['db_user'], $dbOptions['db_pass'],$dbOptions['db_name'] );
        if (mysqli_connect_errno()) {
             throw new Exception('Ошибка базы данных.');
        }
        $this->MySQLi->set_charset("utf8");
    }
    public static function init(array $dbOptions){
        if(self::$instance instanceof self){
            return false;
        }
        self::$instance = new self($dbOptions);
    }
    public static function getMySQLiObject(){
        return self::$instance->MySQLi;
    }
    public static function query($q){
        return self::$instance->MySQLi->query($q);
    }
    public static function esc($str){
        return self::$instance->MySQLi->real_escape_string(htmlspecialchars($str));
    }
    public static function insert_id($str){
        return self::$instance->MySQLi->insert_id;
    }
    public static function affected_rows(){
        return self::$instance->MySQLi->affected_rows;
    }
}



Пример работы с классом


<?php
/* Конфигурация базы данных. Добавьте свои данные */
$dbOptions = array(
    'db_host' => 'localhost',
    'db_user' => '',
    'db_pass' => '',
    'db_name' => ''
);
//Имя таблицы, в которой хранятся заметки
$table_name = 'articles';
//Подключаем класс для работы с базой данных
require "db.class.php";
// Соединение с базой данных
DB::init($dbOptions);
$page_id = (!empty($_GET['id']))? intval($_GET['id']): false;
if(!$page_id){
 
    //Выбираем 3 заметки из базы данных
    $result = DB::query('SELECT * FROM '.$table_name.' LIMIT 3');
 
    //Здесь будет храниться список заметок
    $articles = array();
 
    while($row = $result->fetch_assoc()){
        $articles[] = $row;
    }
}
else{
    //Выбираем заметку из базы данных по переданному id
    $result = DB::query('SELECT * FROM '.$table_name.' WHERE id='.$page_id.' LIMIT 1');
 
    //Если такой заметки нет в базе данных
    //выводим 404 ошибку
    if(!$post = $result->fetch_assoc()){
     
        header("HTTP/1.0 404 Not Found");
        header("HTTP/1.1 404 Not Found");
        header("Status: 404 Not Found");
        die('Нет такой заметки');
     
    }
}
?>

суббота, 23 ноября 2013 г.

Способ загружать файлы без блокировки через ЯваСкрипт


Способ загружать файлы без блокировки через ЯваСкрипт:


для js (для скриптов)

var js = document.createElement('script');
js.src = 'myscript.js';
var head = document.getElementsByTagName('head')[0];
head.appendChild(js);


для css (для стилей)

var h = document.getElementsByTagName('head')[0];
var link = document.createElement('link');
link.href = 'mycss.css';
link.type = 'text/css';
link.rel = 'stylesheet';
h.appendChild(link);


Продвинутая JavaScript отладка form при помощи console.table()

Продвинутая JavaScript отладка form при помощи console.table() в console.log в браузере Chrome


[].forEach.call(document.querySelectorAll('form'), function (input) {
    var table = [];
    console.group('HTMLForm "' + input.name + '": ' + input.action);
        console.log('Element: ', input, '\nName: ' +
            input.name + '\nMethod: ' + input.method.toUpperCase() +
                         '\nAction: ' + input.action || 'null');
        ['input', 'textarea', 'select'].forEach(function (control) {
            [].forEach.call(input.querySelectorAll(control), function (node) {
                table.push({
                    'Element':      node,
                    'Type':         node.type,
                    'Name':         node.name,
                    'Value':        node.value,
                    'Pretty Value': (isNaN(node.value) || node.value === '' ?
                        node.value : parseFloat(node.value))
                });
            });
        });
 });

Весь смысл в том чтобы использовать вместо console.log(languages); табличное представление
console.table(languages);

Сканирование папки на PHP с русскими именами файлов и папок


Сканирование папки на PHP с русскими именами файлов и папок в том числе:


$uri = urldecode(mb_substr($_SERVER["REQUEST_URI"], 0, -1));

function treeList($path = "/") {
  $prefix = ($path == "") ? $_SERVER['DOCUMENT_ROOT'] : "";
  $return = preg_replace("#(.*)/(.*)$#u","\$1",$path);
  echo ' <ul> ';
  echo ' <li><a href="javascript:history.go(-1);'.$return.'">[...назад...]</a></li> ';
  foreach (glob($_SERVER['DOCUMENT_ROOT']."$path/*") as $item) {
    $isdir = (is_dir($item)) ? true : false;
    $item = str_replace(array($_SERVER['DOCUMENT_ROOT'],"//"),array("","/"),$item);
$item = iconv("utf-8", "windows-1251", $item);
    if ($isdir) echo ' <li><b><a href="'.$item.'">'.$item.'</a></b></li> ';
     else if(strpos($item,'index.php')===false) echo ' <li><a href="'.$item.'">'.$item.'</a></li> ';
    }
  echo ' </ul> ';
  }
treeList("/".$uri);




В файле .htaccess пишем:

AddDefaultCharset windows-1251
AddCharset windows-1251 *
<IfModule mod_charset.c>
CharsetSourceEnc windows-1251
CharsetDefault windows-1251
</IfModule>
 




среда, 20 ноября 2013 г.

jQuery: close popup by click on body

Чтобы скрыть всплывающее окно по клику снаружи:


$("body").click(function(e) {
    if($(e.target).closest(".popup").length==0) $(".popup").css("display","none");
});

Find Domain From a URL String

Function will take a string and find the domain name of that string.

function stringDomain($string){
    $a = explode('/',$string);
    return str_replace('www.','',$a[2]);
}
$URL = 'http://codefeel.blogspot.ru/p/site-map.html';
echo stringDomain($URL);  // prints: codefeel.blogspot.ru


Build a table using a mysql query with PHP


Создание таблицы в HTML динамически на основе запроса MySQL для PHP





require(PATH.'/app/config.php');
$link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD)
        or die("Could not connect: " . mysql_error());
$db = mysql_select_db(DB_NAME, $link);
mysql_query("set names utf8");
$query="SELECT * FROM messages LIMIT 5";
$results = mysql_query($query);
// while ($myrows = mysql_fetch_array($results)){
// echo $myrows["name"];
// }
function displayTable($query = ""){
    $table = '';
    $sql = mysql_query($query);
    $table .= '<table>';
    $table .= '<tr>';
    while($field = mysql_fetch_field($sql)){
        $table .= '<th>'.$field->name.'</th>';
    }
    $table .= '</tr>';
    while($row = mysql_fetch_assoc($sql)){
        $table .= '<tr>';
        foreach($row as $key => $item){
            $table .= '<td style="padding-right:50px;">'.($item).'</td>';
        }
        $table .= '</tr>';
    }
    $table .= '</table>';
    return $table;
}
echo displayTable($query);



Delphi: How to Get MAC address


How to get the MAC Address with Delhi?

Установить на форму Label1 и Button1 


function GetMACAdress: string;
var
  NCB: PNCB;
  Adapter: PAdapterStatus;
  URetCode: PChar;
  RetCode: char;
  I: integer;
  Lenum: PlanaEnum;
  _SystemID: string;
  TMPSTR: string;
begin
  Result    := '';
  _SystemID := '';
  Getmem(NCB, SizeOf(TNCB));
  Fillchar(NCB^, SizeOf(TNCB), 0);
  Getmem(Lenum, SizeOf(TLanaEnum));
  Fillchar(Lenum^, SizeOf(TLanaEnum), 0);
  Getmem(Adapter, SizeOf(TAdapterStatus));
  Fillchar(Adapter^, SizeOf(TAdapterStatus), 0);
  Lenum.Length    := chr(0);
  NCB.ncb_command := chr(NCBENUM);
  NCB.ncb_buffer  := Pointer(Lenum);
  NCB.ncb_length  := SizeOf(Lenum);
  RetCode         := Netbios(NCB);
  i := 0;
  repeat
    Fillchar(NCB^, SizeOf(TNCB), 0);
    Ncb.ncb_command  := chr(NCBRESET);
    Ncb.ncb_lana_num := lenum.lana[I];
    RetCode          := Netbios(Ncb);
    Fillchar(NCB^, SizeOf(TNCB), 0);
    Ncb.ncb_command  := chr(NCBASTAT);
    Ncb.ncb_lana_num := lenum.lana[I];
    // Must be 16
    Ncb.ncb_callname := '*               ';
    Ncb.ncb_buffer := Pointer(Adapter);
    Ncb.ncb_length := SizeOf(TAdapterStatus);
    RetCode        := Netbios(Ncb);
    //---- calc _systemId from mac-address[2-5] XOR mac-address[1]...
    if (RetCode = chr(0)) or (RetCode = chr(6)) then
    begin
      _SystemId := IntToHex(Ord(Adapter.adapter_address[0]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[1]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[2]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[3]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[4]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[5]), 2);
    end;
    Inc(i);
  until (I >= Ord(Lenum.Length)) or (_SystemID <> '00-00-00-00-00-00');
  FreeMem(NCB);
  FreeMem(Adapter);
  FreeMem(Lenum);
  GetMacAdress := _SystemID;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  label1.Caption := GetMACAdress;
end;


//***************************************************
// Another Code from
// http://delphi.vitpc.com/treasury/lan.htm
//***************************************************
uses
  NB30;
type
  TAdapterStatus = record
    adapter_address: array [0..5] of char;
    filler: array [1..4 * SizeOf(char) + 19 * SizeOf(Word) + 3 * SizeOf(DWORD)] of
    Byte;
  end;
  THostInfo = record
    username: PWideChar;
    logon_domain: PWideChar;
    oth_domains: PWideChar;
    logon_server: PWideChar;
  end;{record}

function IsNetConnect: Boolean;
begin
  if GetSystemMetrics(SM_NETWORK) and $01 = $01 then Result := True
  else
    Result := False;
end;{function}
function AdapterToString(Adapter: TAdapterStatus): string;
begin
  with Adapter do Result :=
      Format('%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x',
      [Integer(adapter_address[0]), Integer(adapter_address[1]),
      Integer(adapter_address[2]), Integer(adapter_address[3]),
      Integer(adapter_address[4]), Integer(adapter_address[5])]);
end;{function}
function GetMacAddresses(const Machine: string;
  const Addresses: TStrings): Integer;
const
  NCBNAMSZ = 16;        // absolute length of a net name
  MAX_LANA = 254;       // lana's in range 0 to MAX_LANA inclusive
  NRC_GOODRET = $00;       // good return
  NCBASTAT = $33;       // NCB ADAPTER STATUS
  NCBRESET = $32;       // NCB RESET
  NCBENUM = $37;       // NCB ENUMERATE LANA NUMBERS
type
  PNCB = ^TNCB;
  TNCBPostProc = procedure(P: PNCB);
  stdcall;
  TNCB = record
    ncb_command: Byte;
    ncb_retcode: Byte;
    ncb_lsn: Byte;
    ncb_num: Byte;
    ncb_buffer: PChar;
    ncb_length: Word;
    ncb_callname: array [0..NCBNAMSZ - 1] of char;
    ncb_name: array [0..NCBNAMSZ - 1] of char;
    ncb_rto: Byte;
    ncb_sto: Byte;
    ncb_post: TNCBPostProc;
    ncb_lana_num: Byte;
    ncb_cmd_cplt: Byte;
    ncb_reserve: array [0..9] of char;
    ncb_event: THandle;
  end;
  PLanaEnum = ^TLanaEnum;
  TLanaEnum = record
    Length: Byte;
    lana: array [0..MAX_LANA] of Byte;
  end;
  ASTAT = record
    adapt: TAdapterStatus;
    namebuf: array [0..29] of TNameBuffer;
  end;
var
  NCB: TNCB;
  Enum: TLanaEnum;
  I: integer;
  Adapter: ASTAT;
  MachineName: string;
begin
  Result := -1;
  Addresses.Clear;
  MachineName := UpperCase(Machine);
  if MachineName = '' then    MachineName := '*';
  FillChar(NCB, SizeOf(NCB), #0);
  NCB.ncb_command := NCBENUM;
  NCB.ncb_buffer  := Pointer(@Enum);
  NCB.ncb_length  := SizeOf(Enum);
  if Word(NetBios(@NCB)) = NRC_GOODRET then
  begin
    Result := Enum.Length;
    for I := 0 to Ord(Enum.Length) - 1 do
    begin
      FillChar(NCB, SizeOf(TNCB), #0);
      NCB.ncb_command  := NCBRESET;
      NCB.ncb_lana_num := Enum.lana[I];
      if Word(NetBios(@NCB)) = NRC_GOODRET then
      begin
        FillChar(NCB, SizeOf(TNCB), #0);
        NCB.ncb_command  := NCBASTAT;
        NCB.ncb_lana_num := Enum.lana[i];
        StrLCopy(NCB.ncb_callname, PChar(MachineName), NCBNAMSZ);
        StrPCopy(@NCB.ncb_callname[Length(MachineName)],
          StringOfChar(' ', NCBNAMSZ - Length(MachineName)));
        NCB.ncb_buffer := PChar(@Adapter);
        NCB.ncb_length := SizeOf(Adapter);
        if Word(NetBios(@NCB)) = NRC_GOODRET then
          Addresses.Add(AdapterToString(Adapter.adapt));
      end;
    end;
  end;
end;{function}


Delphi: Get temp directory

Delphi: Get temp directory




function GetTempDir: WideString; stdcall;
var
  Buffer: array[0..MAX_PATH] of Char;
begin
  GetTempPath((SizeOf(Buffer) div SizeOf(Char)) - 1, Buffer);
  Result := Buffer;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowMessage(GetTempDir);
end;


WinRAR archive copy from Access VBA to Excel/Word


Процедура архивирования экспортируемого файла из Access в Excel/Word  etc.


Sub SaveCopy()
Dim Wb As Workbook
Dim wbName, Today, WinRarApp$, iPath$, iFileName$, iFileNameRar$, Adr, RetVal
'каждый день сохраняет копию файла со вчерашней датой, производит архивацию этой копии и удаляет файл *.xls, оставляя только архив *.rar
    On Error GoTo ErrorHandler
    If MsgBox("Сохранить резервную копию файла?", vbOKCancel + vbQuestion, "Архив") = vbCancel Then Exit Sub
    Set Wb = ActiveWorkbook
    wbName = Wb.Name
    Today = Format(CStr(Date), "yyyy/mm/dd")
    iPath$ = "\"
    iFileName$ = Left(wbName, Len(wbName) - 4) + "_" + Today + ".xls"
    'Путь и название архива
    iFileNameRar$ = iPath$ + Left(iFileName$, Len(iFileName$) - 3) + "rar"
    'для проверки существования такого же файла
    If Dir(iPath$ + iFileName$) <> "" Or Dir(iFileNameRar$) <> "" Then
        MsgBox "Копия файла c датой " & Today & " в директории " & Chr(13) & iPath$ & " уже существует!", vbExclamation
        Exit Sub
    End If
    'сохранение копии файла с добавлением вчерашней даты
    Wb.SaveCopyAs (iPath$ + iFileName$)
    iFileName$ = iPath$ + iFileName$
    WinRarApp$ = "C:\Program Files\WinRAR\WinRAR.exe a -ep -df " '- ep -исключить пути из имён; -df - удалить файлы после архивации
    Adr = WinRarApp$ & " """ & iFileNameRar$ & """ """ & iFileName$ & """ " 'добавляем кавычки, чтобы можно было было иметь пробелы в названии файла
    RetVal = Shell(Adr, vbHide)
    MsgBox "Копия файла c датой " & Today & " сохранена и заархивирована!" & Chr(13) & "По адресу: " & iPath$, vbInformation, "Архивация данных"
    Exit Sub
ErrorHandler:
    MsgBox "При сохранении копии файла произошла ошибка!" & vbCrLf & "Описание: " & Err.Description & vbCrLf & "Номер: " & Err.Number, vbExclamation, "Ошибка"
End Sub

' вызов в теле процедуры:   SaveCopy (без Call)
' сохраняет файлы на диск C 

понедельник, 18 ноября 2013 г.

Export from Access with MySQL to Excel posts


Создаем самый главный наш скрипт экспорта из Access + MySQL в Excel в отдельном в модуле



'модуль формирования сводной таблицы по проекту
Option Compare Database 'сортировка символов определяется базой данных
Option Explicit 'запретить не объявленные переменные
Dim cnn As New ADODB.Connection
Const MySQLConnectString = "DSN=domen.net;SERVER=domen.net;UID=login;PORT=3306"
Dim rs As New ADODB.Recordset 'объект набора данных
Dim cmd As ADODB.Command
Dim EA As Excel.Application 'объект приложения Excel
Dim i As Integer, j, MyVal As Integer 'счетчики
Dim DA 'динамический массив для вывода данных
Const Шаблон As String = "\Справка.xlt" 'относительный путь к шаблону
Dim sq, Представление As String

   
Sub new1(Представление As String)
On Error Resume Next
    Set EA = CreateObject("Excel.Application") 'запускаем Excel
    EA.Workbooks.Add Template:=Application.CurrentProject.Path & Шаблон 'открываем шаблон
    EA.Cells.Select 'выделить все
    EA.Selection.Clear 'очистить
    'EA.Selection.NumberFormat = "@"  ' 0;-0;;@
    EA.Selection.NumberFormat = "0;-0;;@" ' формат: 0 - не показывать
   
   
Set cmd = New ADODB.Command
With cmd
.CommandTimeout = 60
End With
cnn.ConnectionString = "DSN=domen.net;SERVER=domen.net;UID=login;PORT=3306"
cnn.Open
sq = "SELECT * FROM db_name." & Представление

With rs
.ActiveConnection = cnn
.CursorType = adOpenDynamic
.CursorLocation = adUseClient
.Open sq
End With

'rs.Open Представление, CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdText
   
    ReDim DA(0 To 0, 0 To rs.Fields.Count - 1) 'выделяем память для заголовка таблицы
    For j = 0 To rs.Fields.Count - 1 'перебираем все поля функции
        DA(0, j) = rs.Fields(j).Name 'заносим имена полей в массив
    Next j
    EA.Range(EA.ActiveCell.Offset(0, 0), EA.ActiveCell.Offset(0, rs.Fields.Count - 1)).Formula = DA 'выводим шапку таблицы
    Erase DA 'очищаем массив, освобождаем память
   
    rs.MoveLast 'переходим в конец для подсчёта количества строк в наборе данных
    ReDim DA(0 To rs.RecordCount - 1, 0 To rs.Fields.Count - 1) 'выделяем память для данных таблицы
    rs.MoveFirst 'возвращаемся в начало
    i = 0 'инициализируем счётчик строк
    Do While Not rs.EOF ' перебираем строки
        For j = 0 To rs.Fields.Count - 1 'перебираем поля
            DA(i, j) = rs(j) 'заносим данные в массив
        Next j
        rs.MoveNext 'читаем следующую строку набора данных
        i = i + 1 ' увеличить порядковый месяц
    Loop
    'выводим массив в таблицу
    EA.Range(EA.ActiveCell.Offset(1, 0), EA.ActiveCell.Offset(rs.RecordCount, rs.Fields.Count - 1)).Formula = DA
    'выводим массив в таблицу
    EA.Range(EA.ActiveCell.Offset(1, 0), EA.ActiveCell.Offset(rs.RecordCount, rs.Fields.Count - 1)).Formula = DA
        'фомат шапки таблицы
    EA.Range(EA.ActiveCell.Offset(0, 0), EA.ActiveCell.Offset(0, rs.Fields.Count - 1)).ColumnWidth = 10 'ширина всех колонок
    EA.Columns("A:A").ColumnWidth = 21 'ширина 1-ой колонки
    EA.Range(EA.ActiveCell.Offset(0, 0), EA.ActiveCell.Offset(0, rs.Fields.Count - 1)).Font.Name = "Times New Roman"  'устанавливаем шрифт
    EA.Range(EA.ActiveCell.Offset(0, 0), EA.ActiveCell.Offset(0, rs.Fields.Count - 1)).Font.Size = 10  'устанавливаем размер шрифта
    EA.Range(EA.ActiveCell.Offset(0, 0), EA.ActiveCell.Offset(0, rs.Fields.Count - 1)).Font.FontStyle = "Bold"
    EA.Range(EA.ActiveCell.Offset(0, 0), EA.ActiveCell.Offset(0, rs.Fields.Count - 1)).WrapText = True 'перенос текста
    EA.Range(EA.ActiveCell.Offset(0, 0), EA.ActiveCell.Offset(0, rs.Fields.Count - 1)).VerticalAlignment = xlTop 'выравнивание по высоте - верх
    'обрисуем границы
    EA.Range(EA.ActiveCell.Offset(i, rs.Fields.Count - 1), EA.ActiveCell.Offset(0, 0)).Borders(xlEdgeTop).Weight = xlThin  'подчёркиваем строку
    EA.Range(EA.ActiveCell.Offset(i, 0), EA.ActiveCell.Offset(0, 0)).Borders(xlEdgeBottom).Weight = xlThin  'подчёркиваем строку
    EA.Range(EA.ActiveCell, EA.ActiveCell.Offset(i, rs.Fields.Count)).Borders(xlInsideVertical).Weight = xlThin   ' чертим внутреннюю вертикаль
    EA.Range(EA.ActiveCell, EA.ActiveCell.Offset(i, rs.Fields.Count - 1)).Borders(xlEdgeLeft).Weight = xlThin  ' чертится линия слева
    EA.Range(EA.ActiveCell, EA.ActiveCell.Offset(i, rs.Fields.Count - 1)).Borders(xlInsideHorizontal).Weight = xlThin  ' чертим внутреннюю горизонталь
    EA.Range(EA.ActiveCell.Offset(i, 0), EA.ActiveCell.Offset(0, rs.Fields.Count - 1)).Borders(xlEdgeBottom).Weight = xlThin  'подчёркиваем строку
   
     EA.Cells.Select 'выделить все
     EA.Selection.Columns.AutoFit
     EA.Columns("D:D").ColumnWidth = 10
   
    'зафиксировать панель
    ' EA.Rows("1:1").Select
    ' EA.ActiveWindow.FreezePanes = True
   
    'сохраняем документ
    EA.ActiveWorkbook.SaveAs Application.CurrentProject.Path & "\" & Year(Date) & "-" & Month(Date) & "-" & Day(Date) & "_" & "_справка", xlExcel8, , , , , , True
   
    EA.Visible = True 'делаем Excel видимым
    Set EA = Nothing 'очищаем переменную и отключаемся от Excel
' --
    rs.Close 'закрываем набор данных
    Set rs = Nothing 'освобождаем память
 
'Set prm = Nothing
Set cmd = Nothing
'cnn.Close
Set cnn = Nothing
End Sub


Да, и не забудьте кнопку:


Private Sub Кнопка7_Click()
new1 (List5.Value)
End Sub




MYSQL and ACCESS with VBA

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

Соединение с базой данных MySQL через Access на VBA предварительно установив ODBC драйвер для MySQL и настроив DSN - соединение в ODBC настройках.


В самом начале как обычно пишем:

Option Compare Database 'сортировка символов определяется базой данных
Option Explicit 'запретить не объявленные переменные
 Объявляем глобальные переменные, которые могут понадобиться
Dim con As New ADODB.Connection
Dim rs As New ADODB.Recordset 'объект набора данных

Dim i As Integer, j As Integer 'счетчики
Dim DA 'динамический массив для вывода данных
Const Шаблон As String = "\Шаблоны\Справка.xlt" 'относительный путь к шаблону
Dim sq As String
Dim b As Boolean

Заполняем листбокс перечнем таблиц из базы данных при загрузке формы

Private Sub Form_Load()
con.ConnectionString = "DSN=domen.net;SERVER=domen.net;UID=login;PORT=3306"
con.Open
Set rs = New ADODB.Recordset
sq = "SHOW FULL TABLES IN   `db_name` "
With rs
.ActiveConnection = con
.CursorType = adOpenDynamic
.CursorLocation = adUseClient
.Open sq
End With
' Combo1.RowSourceType = query
rs.MoveFirst
While Not rs.EOF
List5.AddItem (rs(0))
' Combo1.AddItem (rs(0))
' Combo1.RowSource = rs("Tables_in_db_name")
' MsgBox rs("Tables_in_db_name")
rs.MoveNext
Wend
'   Application.DoCmd.OpenQuery " select * from db_name.vote_track"    
End Sub

' Заполняем комбобокс:

Private Sub Кнопка0_Click()
Dim ConnectionMySQL As New ADODB.Connection
Const MySQL_ConnectString = "DSN=domen.net;SERVER=domen.net;UID=login;PORT=3306"
Dim RecordsetMySQL As New ADODB.Recordset 'объект набора данных
Set ConnectionMySQL = CreateObject("ADODB.Connection") ' Create connection object
ConnectionMySQL.CursorLocation = 2 ' Use client type cursor
ConnectionMySQL.Open MySQL_ConnectString, "", "", -1 ' Connect to the database
Set RecordsetMySQL = CreateObject("ADODB.Recordset")
RecordsetMySQL.Open "SHOW FULL TABLES IN   `db_name`", ConnectionMySQL, 2, 3, 1
Do While Not RecordsetMySQL.EOF ' Do Until RecordsetMySQL.EOF
' WScript.Echo RecordsetMySQL.Fields(0)
' MsgBox RecordsetMySQL.Fields(0)
  Combo1.AddItem RecordsetMySQL!Tables_in_db_name
 RecordsetMySQL.MoveNext
Loop
RecordsetMySQL.Close
ConnectionMySQL.Close
End Sub


Строку соединения можно написать напрямую  - не создавая  настроек DSN соединения в ODBC настройках.

Const ServerName As String = "m.net"
Const User_ID  As String = "rgrgr"
Const Database_Name As String = "rgrgr"
Const Password  As String = "gfgf"
Const MySQL_ConnectString = "Driver={MySQL ODBC 5.2 ANSI Driver};Server=" & ServerName & ";Database=" & Database_Name & _
    ";Uid=" & User_ID & ";Pwd=" & Password & ";"







воскресенье, 17 ноября 2013 г.

Навигация по страницам для сайта на PHP


Навигация по страницам для сайта на PHP

Функция постраничной навигации:

<?php

   function pagination($query, $per_page = 10,$page = 1, $url = '?'){      
    $query = "SELECT COUNT(*) as `num` FROM {$query}";
    $row = mysql_fetch_array(mysql_query($query));
    $total = $row['num'];
        $adjacents = "2";
    $page = ($page == 0 ? 1 : $page);
    $start = ($page - 1) * $per_page;     $prev = $page - 1;     $next = $page + 1;
        $lastpage = ceil($total/$per_page);
    $lpm1 = $lastpage - 1;
        $pagination = "";
    if($lastpage > 1)
    {     $pagination .= "<ul class='pagination'>";
                    $pagination .= "<li class='details'>Страница $page из $lastpage</li>";
    if ($lastpage < 7 + ($adjacents * 2))
    {     for ($counter = 1; $counter <= $lastpage; $counter++)
    {
    if ($counter == $page)
    $pagination.= "<li><a class='current'>$counter</a></li>";
    else
    $pagination.= "<li><a href='{$url}page=$counter'>$counter</a></li>";     }
    }
    elseif($lastpage > 5 + ($adjacents * 2))
    {
    if($page < 1 + ($adjacents * 2))     {
    for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)
    {
    if ($counter == $page)
    $pagination.= "<li><a class='current'>$counter</a></li>";
    else
    $pagination.= "<li><a href='{$url}page=$counter'>$counter</a></li>";     }
    $pagination.= "<li class='dot'>...</li>";
    $pagination.= "<li><a href='{$url}page=$lpm1'>$lpm1</a></li>";
    $pagination.= "<li><a href='{$url}page=$lastpage'>$lastpage</a></li>";     }
    elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
    {
    $pagination.= "<li><a href='{$url}page=1'>1</a></li>";
    $pagination.= "<li><a href='{$url}page=2'>2</a></li>";
    $pagination.= "<li class='dot'>...</li>";
    for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
    {
    if ($counter == $page)
    $pagination.= "<li><a class='current'>$counter</a></li>";
    else
    $pagination.= "<li><a href='{$url}page=$counter'>$counter</a></li>";     }
    $pagination.= "<li class='dot'>..</li>";
    $pagination.= "<li><a href='{$url}page=$lpm1'>$lpm1</a></li>";
    $pagination.= "<li><a href='{$url}page=$lastpage'>$lastpage</a></li>";     }
    else
    {
    $pagination.= "<li><a href='{$url}page=1'>1</a></li>";
    $pagination.= "<li><a href='{$url}page=2'>2</a></li>";
    $pagination.= "<li class='dot'>..</li>";
    for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++)
    {
    if ($counter == $page)
    $pagination.= "<li><a class='current'>$counter</a></li>";
    else
    $pagination.= "<li><a href='{$url}page=$counter'>$counter</a></li>";     }
    }
    }
        if ($page < $counter - 1){
    $pagination.= "<li><a href='{$url}page=$next'>Следующая</a></li>";
                $pagination.= "<li><a href='{$url}page=$lastpage'>Последняя</a></li>";
    }else{
    $pagination.= "<li><a class='current'>Следующая</a></li>";
                $pagination.= "<li><a class='current'>Последняя</a></li>";
            }
    $pagination.= "</ul>\n";     }
 
 
        return $pagination;
    }
?>
Файл вывода постраничной навигации:

 <?php
     $db = @mysql_connect('localhost', 'Имя пользователя', 'Пароль') or die(mysql_error());
    @mysql_select_db('Название БД', $db) or die(mysql_error());
    include_once ('function.php');
     $page = (int) (!isset($_GET["page"]) ? 1 : $_GET["page"]);
     $limit = 2;
     $startpoint = ($page * $limit) - $limit;
   
        // таблица для выборки
        $statement = "`records` where `active` = 1";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Навигация по страницам</title>
 <meta http-equiv="content-type" content="text/html; charset=windows-1251" />
 <link href="css/pagination.css" rel="stylesheet" type="text/css" />
 <link href="css/grey.css" rel="stylesheet" type="text/css" />
    <style type="text/css">
        .records {
            width: 615px;
            margin: 5px;
            padding:2px 5px;
            border:1px solid #B6B6B6;
        }
   
        .record {
            color: #474747;
            margin: 5px 0;
            padding: 3px 5px;
         background:#E6E6E6;
            border: 1px solid #B6B6B6;
            cursor: pointer;
            letter-spacing: 2px;
        }
        .record:hover {
            background:#D3D2D2;
        }
   
   
        .round {
         -moz-border-radius:8px;
         -khtml-border-radius: 8px;
         -webkit-border-radius: 8px;
         border-radius:8px;
        }
   
        p.createdBy{
            padding:5px;
            width: 510px;
         font-size:15px;
         text-align:center;
        }
        p.createdBy a {color: #666666;text-decoration: none;}    
    </style>
</head>
<body>
    <div class="records round">
        <?php
            //Показываем записи
            $query = mysql_query("SELECT * FROM {$statement} LIMIT {$startpoint} , {$limit}");
       
         while ($row = mysql_fetch_assoc($query)) {
        ?>
            <div class="record round"><?php echo "{$row['id']}#{$row['name']}";?></div>
        <?php
            }
        ?>
    </div>
<?php
 echo pagination($statement,$limit,$page);
?>
</body>
</html>

База данных для постраничной навигации:

CREATE TABLE IF NOT EXISTS `records` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET cp1251 COLLATE cp1251_general_ci NOT NULL,
  `active` int(11) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=27;


Стили для навигации.
Основной стиль:

ul.pagination{
margin:0px;
padding:0px;
height:100%;
overflow:hidden;
font:12px 'Tahoma';
list-style-type:none; }
ul.pagination li.details{
    padding:7px 10px 7px 10px;
    font-size:14px;
}
ul.pagination li.dot{padding: 3px 0;}
ul.pagination li{
float:left;
margin:0px;
padding:0px;
margin-left:5px;
}
ul.pagination li:first-child{
margin-left:0px;
}
ul.pagination li a{
color:black;
display:block;
text-decoration:none;
padding:7px 10px 7px 10px;
}
ul.pagination li a img{
border:none;
}

Тема стиля (серая):

ul.pagination li.details{
   color:#888888;
}
ul.pagination li a
{
color:#FFFFFF;
border-radius:3px; -moz-border-radius:3px;
-webkit-border-radius:3px;
}
ul.pagination li a
{
color:#474747;
border:solid 1px #B6B6B6;
padding:6px 9px 6px 9px;
background:#E6E6E6;
background:-moz-linear-gradient(top,#FFFFFF 1px,#F3F3F3 1px,#E6E6E6);
background:-webkit-gradient(linear,0 0,0 100%,color-stop(0.02,#FFFFFF),color-stop(0.02,#F3F3F3),color-stop(1,#E6E6E6));
}
ul.pagination li a:hover,
ul.pagination li a.current
{
background:#FFFFFF;
}
Тема стиля 2 (красная):


ul.pagination li.details{
  color:#AD2D2D;
}
   
    ul.pagination li a
{
border:solid 1px;
border-radius:3px; -moz-border-radius:3px;
-webkit-border-radius:3px;
padding:6px 9px 6px 9px;
}
ul.pagination li
{
padding-bottom:1px;
}
ul.pagination li a:hover,
ul.pagination li a.current
{ color:#FFFFFF;
box-shadow:0px 1px #EDEDED;
-moz-box-shadow:0px 1px #EDEDED;
-webkit-box-shadow:0px 1px #EDEDED;
}
   
ul.pagination li a
{
color:#E92F2F;
border-color:#FFA5A5;
background:#FFF8F8;
} ul.pagination li a:hover,
ul.pagination li a.current
{
text-shadow:0px 1px #B72E2E;
border-color:#AD2D2D;
background:#E43838;
background:-moz-linear-gradient(top,#FF9B9B 1px,#FE5555 1px,#E43838);
background:-webkit-gradient(linear,0 0,0 100%,color-stop(0.02,#FF9B9B),color-stop(0.02,#FE5555),color-stop(1,#E43838));
}    








Постоянные читатели

Популярные сообщения