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

Delphi: get path to APP DATA and saving files there



Получение переменных окружения ОС:
То есть получение пути к некой папке appfolder в User Application Data


const  dirName= '%appdata%\appfolder';
var   dirNameApp: string;

Function GetEnvironmentStrings(): TStrings;
var
  ptr: PChar;
  s: string;
  Done: boolean;
  ss:TStrings;
begin
  ss := TStringList.Create();
  s:='';
  Done:=FALSE;
  ptr:=windows.GetEnvironmentStrings;
  while Done=false do
  begin
    if ptr^=#0 then
    begin
      inc(ptr);
      if ptr^=#0 then Done:=TRUE
        else ss.Add(s);
      s:=ptr^;
    end else s:=s+ptr^;
  inc(ptr);
 end;
 result := ss;
end;
dirNameApp :=  GetEnvironmentStrings().Values['APPDATA'];

или так:



function GetWin(Comand: string): string;
var
buff: array [0 .. $FF] of char;
begin
ExpandEnvironmentStrings(PChar(Comand), buff, SizeOf(buff));
Result := buff;
end;


dirNameApp:= GetWin(dirName);
пример вызова


procedure TForm1.Refreshing();
var
  SR: TSearchRec;
  FindRes: Integer;
  dirName2: string;
begin
Form1.ListBox1.Clear;
dirName2 := GetWin(dirName);
  dirName2:=dirName2+'\*'+'.txt';
  FindRes := FindFirst(dirName2, faAnyFile, SR);
  while FindRes = 0 do
  begin
    // если каталог не найден
    if ((SR.Attr and faDirectory) = faDirectory) and
      //  если расширение "." или "..":
    ((SR.Name = '.') or (SR.Name = '..')) then
    begin
      FindRes := FindNext(SR);
      Continue;
    end;
    // Form1.ListBox1.Items.Add(SR.Name);
    Form1.ListBox1.Items.Add(Copy(SR.Name, 1, length(SR.Name)-4));
    FindRes := FindNext(SR);
  end;
  FindClose(SR);
end;




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

VBA MS Access log users


Ведение логов посещения приложения в MS Access через VBA

Необходимо создать две таблицы - Пользователи и Журнал

'Модуль функций
Option Compare Database 'сортировка символов определяется базой данных
Option Explicit 'запретить не объявленные переменные

'внешняя функция определения логина текущего пользователя компьютера
Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _
"GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

'внешняя функция определения имени текущего компьютера
Private Declare Function apiGetComputerName Lib "kernel32" Alias _
"GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long

'функция определения логина текущего пользователя компьютера
Function ТекущийПользователь() As String
Dim Результат As Long 'код возврата внешней функции
Dim ДлинаИмени 'длина имени пользователя
Dim ИмяПользователя As String 'имя пользователя
    ИмяПользователя = String(254, 0) 'заполняем строку имени пользователя нулями
    ДлинаИмени = 255 'устанавливаем начальную длину имени
    Результат = apiGetUserName(ИмяПользователя, ДлинаИмени) 'запрашиваем значение
    If Результат <> 0 Then
        ТекущийПользователь = Left(ИмяПользователя, ДлинаИмени - 1)
    Else
        ТекущийПользователь = ""
    End If
End Function

'функция определения имени текущего компьютера
Function ТекущийКомпьютер() As String
Dim Результат As Long 'код возврата внешней функции
Dim ДлинаИмени 'длина имени пользователя
Dim ИмяКомпьютера As String 'имя пользователя
    ДлинаИмени = 16
    ИмяКомпьютера = String(ДлинаИмени, 0)
    Результат = apiGetComputerName(ИмяКомпьютера, ДлинаИмени)
    If Результат <> 0 Then
        ТекущийКомпьютер = Left(ИмяКомпьютера, ДлинаИмени)
    Else
        ТекущийКомпьютер = ""
    End If
End Function




Private Sub Form_Open(Cancel As Integer)
Dim RS As Recordset
    Set RS = CurrentDb.OpenRecordset("Журнал", dbOpenTable)
    RS.Index = "PrimaryKey"
    RS.Seek "=", ТекущийПользователь(), ТекущийКомпьютер()
    If RS.NoMatch Then
        RS.AddNew
        RS!Пользователь = ТекущийПользователь()
        RS!Компьютер = ТекущийКомпьютер()
        RS!Вход = Now()
        RS!Выход = Null
        RS!Счётчик = 1
        RS.Update
    Else
        RS.Edit
        RS!Вход = Now()
        RS!Выход = Null
        RS!Счётчик = RS!Счётчик + 1
        RS.Update
    End If
    Set RS = Nothing
End Sub





Private Sub Form_Close()
Dim RS As Recordset
    Set RS = CurrentDb.OpenRecordset("Журнал", dbOpenTable)
    RS.Index = "PrimaryKey"
    RS.Seek "=", ТекущийПользователь(), ТекущийКомпьютер()
    If RS.NoMatch Then
        RS.AddNew
        RS!Пользователь = ТекущийПользователь()
        RS!Компьютер = ТекущийКомпьютер()
        RS!Вход = Null
        RS!Выход = Now()
        RS!Счётчик = 1
        RS.Update
    Else
        RS.Edit
        RS!Выход = Now()
        RS.Update
    End If
    Set RS = Nothing
End Sub

MSSQL and VBA - automatic mail sender auto-created Excel file


Вариант отправки автоматической справки из MS SQL посредством VBA


'модуль формирования сводной таблицы по проекту
Option Compare Database 'сортировка символов определяется базой данных
Option Explicit 'запретить не объявленные переменные
Dim RS As New ADODB.Recordset 'объект набора данных
Dim EA As Excel.Application 'объект приложения Excel
Dim i As Integer, j, MyVal As Integer 'счетчики
Dim DA 'динамический массив для вывода данных
Const Шаблон As String = "\Шаблоны\Справка.xlt" 'относительный путь к шаблону
 Const emails As String = "grrg@mail.org; tgrta@mail.org; grtgtrv@mail.org; rgtn@mail.org"
 Dim e As Variant
 Dim FileAttachment As String
 Dim FileAttachmentTwo As String
 Dim Проект, Продукт, Имя, Представление As String

Sub ХодТПП()
   Проект = "КакойтоПроект"
   Продукт = "%"
   Представление = "SELECT Отчет.* " & _
   " FROM dbo.Отчет('" & Проект & "', '" & Продукт & "') Отчет"
    Set EA = CreateObject("Excel.Application") 'запускаем Excel
    EA.Workbooks.Add Template:=Application.CurrentProject.Path & Шаблон 'открываем шаблон
    EA.Goto "дата" 'переходим к метке подзаголовка
    EA.ActiveCell.Formula = EA.ActiveCell.Formula & " по состоянию на " & Date & " " & Time 'выводим текущую дату и время
    EA.Goto "таблица" 'переходим к метке таблицы
    'Dim cmd As ADODB.Command
    Set cmd = New ADODB.Command
    With cmd
    .CommandTimeout = 60
    End With
    RS.Open Представление, CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdText
    'rs.Open Представление, cmd.ActiveConnection
    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
    RS.Close 'закрываем набор данных
    Set RS = Nothing 'освобождаем память
    EA.Goto "дата" 'переходим к метке подзаголовка
    'EA.ActiveCell.Formula = EA.ActiveCell.Formula & " по состоянию на " & Date & " " & Time 'выводим текущую дату и время
    Имя = Replace(Проект, "]", "")
    Имя = Replace(Проект, "[", "")
    Имя = Replace(Проект, "_", " ")
    Имя = Replace(Проект, "/", " ")
    Имя = Replace(Проект, "%", "")
    If Len(Имя) > 0 Then EA.ActiveCell.Offset(-1, 0).Formula = EA.ActiveCell.Offset(-1, 0).Formula & " по проекту " & Имя
    If Продукт <> "%" Then EA.ActiveCell.Offset(-1, 0).Formula = EA.ActiveCell.Offset(-1, 0).Formula & " по продукту " & Продукт
    'сохраняем документ
    EA.ActiveWorkbook.CheckCompatibility = False
    EA.DisplayAlerts = False
    EA.ActiveWorkbook.SaveAs Application.CurrentProject.Path & "\" & Year(Date) & "-" & Month(Date) & "-" & Day(Date) & "=Отчет_" & Имя & " " & Replace(Продукт, "%", ""), xlExcel8, , , , , , True
    EA.Visible = True 'делаем Excel видимым
    EA.DisplayAlerts = True
    EA.Application.Quit
    Set EA = Nothing 'очищаем переменную и отключаемся от Excel
    Set cmd = Nothing
    FileAttachmentTwo = Application.CurrentProject.Path & "\" & Year(Date) & "-" & Month(Date) & "-" & Day(Date) & "=справка_" & Имя & " " & Replace(Продукт, "%", "") & ".xls"
     
     
 
    e = SendEMail(emails, "Тема сообщения", "См. вложение" & Chr(13) & Chr(13) & "С уважением, " & Chr(13) & "Друг семьи  " & Chr(13) & "Тел.  такой то", FileAttachment & "," & FileAttachmentTwo)
End Sub

Public Function SendEMail(MailTo As String, Subjectline As String, MyBodyText As String, MyAttachment As String)
Dim MyOutlook As Outlook.Application
Dim MyMail As Outlook.MailItem
Dim BodyFile As String
Dim SplitFiles
'Subjectline$ = "TEMA"
'MyBodyText = "It is auto-letter"
Set MyOutlook = New Outlook.Application
Set MyMail = MyOutlook.CreateItem(olMailItem)
MyMail.To = MailTo
MyMail.Subject = Subjectline$
MyMail.Body = MyBodyText
'MyMail.CC = "site@mail.org"
MyMail.BCC = "site@mail.org"
SplitFiles = Split(MyAttachment, ",")
If Len(MyAttachment) > 0 Then MyMail.Attachments.Add Trim(SplitFiles(0))
'If Len(MyAttachment) > 0 Then MyMail.Attachments.Add Trim(SplitFiles(1)) ' можно присоединить еще один сформированный файл
'MyMail.Attachments.Add "C:\somefile.xls"
'With MItem
'    .To = "test@email.com"
'    .Subject = "Commission check for future contracts"
'    .Body = Msg
'    .Attachments.Add "C:\My Documents\sample.xls"
'    .send
'End With
MyMail.send
Set MyMail = Nothing
Set MyOutlook = Nothing
End Function








MS SQL fragment keys in table

На сервере MS SQL посмотреть процент фрагментации ключей:

SELECT      a.index_id, name, avg_fragmentation_in_percent
FROM          sys.dm_db_index_physical_stats(DB_ID(N'DBname1'), OBJECT_ID(N'dbo.Регистрация'), NULL, NULL, NULL) AS a JOIN
                        sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id;


пятница, 27 сентября 2013 г.

Как отключить скролл страницы яваскриптом js

Как отключить скролл страницы яваскриптом js


Это отключит скролл:

window.onmousewheel = document.onmousewheel = window.onscroll = document.onscroll = function (e) {return false;};

Что бы скролл включить обратно, поставь тоже самое на другой ивент и верни `true`

window.onmousewheel = document.onmousewheel = window.onscroll = document.onscroll = function (e) {return true;};

PHP: Find all the links on a page

PHP: Find all the links on a page


$html = file_get_contents('http:// example .com');
$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$links = $xpath->evaluate("/html/body//a");

for ($i = 0; $i < $links->length; $i++) {
    $link = $links->item($i);
    $url = $link->getAttribute('href');
    if (strpos($url, '#') === false)
        echo $url . '<br>';
}

Брут (подбор) пароля по md5 php скриптом


Брут (подбор) пароля по md5 php скриптом



// Устанавливаем неограниченное время выполнения скрипта
  set_time_limit(0);
  // Читаем пароли из файла password
  $pass = file("password.txt");
  foreach($pass as $password)
  {
    // Замеряем время, затраченное на подбор пароля
    $begin = time();
    echo decrypt_md5(trim($password),"");
    $end = time();
    echo "  (На подбор затрачено ".($end - $begin)." секунд) <br>";
  }
  // Функция посимвольного перебора пароля
  // $pass - расшифровываемый пароль
  // $answer - текущий ответ, при первом вызове - пустая строка
  function decrypt_md5($pass, $answer)
  {
    $arr = array('a','b','c','d','e','f',
                 'g','h','i','j','k','l',
                 'm','n','o','p','q','r','s',
                 't','u','v','w','x','y','z');
    // Будем считать, что пароль не превышает
    // 4 символов
    $max_number = 3;
    if(strlen($answer) > $max_number) return;
    for($j = 0; $j < count($arr); $j++)
    {
      $temp = $answer.$arr[$j];
      if(md5($temp) == $pass) return $temp;
      // Рекурсивно вызываем фукнцию для увеличения
      // длины подбираемого пароля
      $result = decrypt_md5($pass, $temp);
      // Если функция возвращает непустую строку,
      // следовательно, найден ответ и дальше искать
      // не следует
      if(strlen($result) > 0) return $result;
    }
  }


VBA Корректировка значений ячеек

VBA Корректировка значений ячеек

Заменить нули на пустые значения в выделенном диапазоне


Public Sub X2()
    Dim cel As Range
 
    On Error Resume Next
 
    For Each cel In Selection
        If cel.Value = 0 Then
            cel.Value = ""
        End If
    Next cel
End Sub


Поправить значения в столбце на текстовые значения

Sub m_1()
Dim oCell As Range
Dim LastRow As Long
Dim Colmn As String
Colmn = "c"
Columns(Colmn).NumberFormat = "@"
LastRow = Cells.SpecialCells(xlCellTypeLastCell).Row
For Each oCell In Range(Colmn & "1:" & Colmn & LastRow)
    oCell.Errors(xlNumberAsText).Ignore = True
    oCell.FormulaR1C1Local = oCell.FormulaLocal
    ' oCell.FormulaR1C1Local = Replace(oCell.FormulaLocal, ",", ".") ' заменить запятую точкой
Next oCell
End Sub




четверг, 26 сентября 2013 г.

VBA cells auto-increment


Простановка нумерации и обрисовка границ в ячейках по первому столбцу:


Sub m_1()
Dim oCell As Range
Dim LastRow As Long
Dim i As Integer
Columns("A").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove ' добавить новую колонку
Columns("A").NumberFormat = "General"
LastRow = Cells.SpecialCells(xlCellTypeLastCell).Row
For Each oCell In Range("A3:" & "A" & LastRow)
    oCell.Errors(xlNumberAsText).Ignore = True
    i = i + 1
    oCell.FormulaR1C1Local = i
    Range(oCell, oCell).Borders(xlInsideVertical).Weight = xlThin
    Range(oCell, oCell).Borders(xlEdgeLeft).Weight = xlThin
    Range(oCell, oCell).Borders(xlInsideHorizontal).Weight = xlThin
    Range(oCell, oCell.Offset(0, 0)).Borders(xlEdgeBottom).Weight = xlThin
Next oCell
End Sub


VBA merge cells

VBA объединение ячеек


Sub test()
' объединяет ячейки содинаковыми значениями на странице в указанном столбце
Dim RowIndex As Long
Dim StartRow As Long
Dim LastRow As Long
Dim ColumnToMerge As Long
Dim countHPageBreak As Long
Dim hPB As HPageBreak
Dim pageLastRow() As Variant
Dim i As Long, ihPB As Long
Dim flag As Boolean
   
   
    StartRow = 2 ' с какой строки начинать
    ColumnToMerge = 2 ' в какой колонке объединять
    flag = True  ' учитывать ли значения слева False - нет, True - да
    countHPageBreak = ActiveSheet.HPageBreaks.Count
   
    ReDim pageLastRow(countHPageBreak) As Variant
   
    i = 0
    For Each hPB In ActiveSheet.HPageBreaks
     pageLastRow(i) = hPB.Location.Row - 1
     i = i + 1
    Next hPB
    pageLastRow(countHPageBreak) = Cells(Rows.Count, ColumnToMerge).End(xlUp).Row
   
   
   
    Application.DisplayAlerts = False
    For ihPB = 0 To countHPageBreak
       
        For RowIndex = StartRow + 1 To pageLastRow(ihPB)
           
            With Cells(RowIndex, ColumnToMerge)
               
                If .Value = .Offset(-1, 0).MergeArea.Cells(1).Value Then
                  If flag Then
                     If .Offset(0, -1).MergeArea(1).Value = .Offset(-1, -1).MergeArea(1).Value Then  '.Offset(0, -1).MergeArea.Address <> .Offset(-1, -1).MergeArea.Address Then
                         Range(Cells(RowIndex, ColumnToMerge), .Offset(-1, 0)).Merge
                     End If
                   Else
                  Range(Cells(RowIndex, ColumnToMerge), .Offset(-1, 0)).Merge
                  End If
                End If
         
            End With
           
           
        Next RowIndex
       
        StartRow = pageLastRow(ihPB) + 1
    Next ihPB
    Application.DisplayAlerts = True
End Sub



LDAP catalog VBA parser

С помощью VBA можно посмотреть информацию и контакты в сети пользователей:

Function GetADInfo(ByVal SearchField, ByVal SearchString, ByVal ReturnField)

' Указываем  имя домена ("dc=domain, dc=local")
Dim adoCommand, strDomain, objConnection

strDomain = "dc=winitpro,dc=ru"

Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Provider=ADsDSOObject;"

' Подключаемся
Set adoCommand = CreateObject("ADODB.Command")
adoCommand.ActiveConnection = objConnection

' Рекурсивный поиск по AD, начиная с корня домена
adoCommand.CommandText = _
 "<LDAP://" & strDomain & ">;(&(objectCategory=" & "User" & ")" & _
 "(" & SearchField & "=" & SearchString & "));" & SearchField & "," & ReturnField & ";subtree"

' создаем набор записей RecordSet
Dim objRecordSet
Set objRecordSet = adoCommand.Execute

If objRecordSet.RecordCount = 0 Then
GetADInfo = "not found"  ' ничего не найдено
Else
GetADInfo = objRecordSet.Fields(ReturnField) ' возвращаемое значение
End If

' Закрываем подключение
objConnection.Close

' Очищаем переменные
Set objRecordSet = Nothing
Set objCommand = Nothing
Set objConnection = Nothing

End Function



Ячейка B2 (наименование организации):
=GetADInfo("samAccountName";A2; "Company")
Ячейка C2 (CN):
=GetADInfo("samAccountName";A2; "distinguishedName")
также вместо "Company" можно подставить "name" чтобы получить учетку или "mail" чтобы получить почтовый ящик пользователя
ОБЯЗАТЕЛЬНО чтобы эта бяка работала надо в References добавить  Microsoft VBScript Regular Expressions 5.5

Visual basic MS Access ADODB example loop

Visual basic MS Access ADODB example loop



Option Compare Database
Option Explicit
Dim rs As New ADODB.Recordset
Dim EA As Excel.Application
Dim i As Integer, j, MyVal As Integer
Dim DA
Const Shablon As String = "\Path\Shablon.xlt"
Dim Zapros As String


Sub Something(view As String)
    Set EA = CreateObject("Excel.Application")
    EA.Workbooks.Add Template:=Application.CurrentProject.Path & Shablon
view = "SELECT * FROM " & view
rs.Open view, 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
    rs.Close
    Set rs = Nothing
    Zapros = Replace(Zapros, "]", "")
    Zapros = Replace(Zapros, "[", "")
    EA.ActiveWorkbook.SaveAs Application.CurrentProject.Path & "\" & Year(Date) & "-" & Month(Date) & "-" & Day(Date) & "_" & Zapros & "_file", xlExcel8, , , , , , True

    EA.Visible = True
    Set EA = Nothing
    End Sub





Private Sub button1_Click()
Dim i As Integer
Dim Imya  As String
Dim LB As ListBox
    Set LB = Me!Listbox1
    If LB.ListIndex < 0 Then
        Imya  = ""
        Exit Sub
    Else
        Imya  = Nz(LB)
    End If
    Set LB = Nothing
   
    Application.DoCmd.OpenForm
   ' Form_Listform.Repaint  
   ' If os = "Windows XP" Then Application.DoCmd.RepaintObject acForm, "Loading"
    Application.DoCmd.RepaintObject acForm, "Loading"
    Application.DoCmd.Hourglass True
     Something("[" & Imya  & "]")
    'Application.DoCmd.Close acForm, "Listform", acSaveYes
    Application.DoCmd.Hourglass False
   
    Application.DoCmd.Close acForm, "Loading", acSaveYes
    Application.DoCmd.RunCommand acCmdAppMinimize
End Sub















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

Служебные запросы на сервере MS SQL


Служебные запросы на сервере MS SQL



Версия Базы

SELECT      SUBSTRING(@@VERSION, 22, 4) AS Version, @@VERSION AS FullVersion, DB_NAME() AS Base, USER_NAME() AS Login

Все Объекты

SELECT      name, object_id, principal_id, schema_id, parent_object_id, type, type_desc, create_date, modify_date, is_ms_shipped, is_published,
                        is_schema_published
FROM          sys.objects



Запросы с параметрами

SELECT      TOP 100 PERCENT SCHEMA_NAME(SCHEMA_ID) AS Schem, SO.name AS ObjectName, SO.Type_Desc AS [ObjectType (UDF/SP)],
                        P.parameter_id AS ParameterID, P.name AS ParameterName, TYPE_NAME(P.user_type_id) AS ParameterDataType,
                        P.max_length AS ParameterMaxBytes, P.is_output AS IsOutPutParameter, SO.OBJECT_ID
FROM          sys.objects SO INNER JOIN
                        sys.parameters P ON SO.OBJECT_ID = P.OBJECT_ID
WHERE      (SO.OBJECT_ID IN
                            (SELECT      OBJECT_ID
                              FROM           sys.objects
                              WHERE       TYPE IN ('P', 'FN', 'IF'))) AND (NOT (P.name IS NULL))
ORDER BY Schem, SO.name, P.parameter_id



Расширенные - Подстановки

SELECT      OBJECT_NAME(ob.object_id) AS TableName, ex.name AS Prop, ex.value AS Extended, type, SCHEMA_NAME(SCHEMA_ID) AS Schem
FROM          sys.objects ob INNER JOIN
                        sys.extended_properties ex ON ob.object_id = ex.major_id
WHERE      (OBJECT_NAME(ob.object_id) LIKE N'Детали') AND (ex.name LIKE N'MS_SubdatasheetName' OR
                        ex.name LIKE N'MS_Link%')





Расширенные Свойства Объектов

SELECT      TOP 100 PERCENT tab2.minor_id, tab2.TableName, tab2.ColumnName, tab1.RowSource, tab2.MSColumnWidth
FROM          (SELECT      TOP 100 PERCENT ex.minor_id, OBJECT_NAME(c.object_id) AS [TableNam], c.name AS [ColumnNam], ex.value AS RowSource
                        FROM           sys.columns c LEFT OUTER JOIN
                                                sys.extended_properties ex ON ex.major_id = c.object_id AND ex.minor_id = c.column_id AND ex.name = 'MS_RowSource'
                        WHERE       (OBJECTPROPERTY(c.object_id, 'IsMsShipped') = 0)
                        ORDER BY OBJECT_NAME(c.object_id)) tab1 FULL OUTER JOIN
                            (SELECT      TOP 100 PERCENT ex.minor_id, OBJECT_NAME(c.object_id) AS [TableName], c.name AS [ColumnName],
                                                      ex.value AS MSColumnWidth
                              FROM           sys.columns c LEFT OUTER JOIN
                                                      sys.extended_properties ex ON ex.major_id = c.object_id AND ex.minor_id = c.column_id AND ex.name = 'MS_ColumnWidth'
                              WHERE       (OBJECTPROPERTY(c.object_id, 'IsMsShipped') = 0)
                              ORDER BY OBJECT_NAME(c.object_id)) tab2 ON tab1.ColumnNam = tab2.ColumnName AND tab1.TableNam = tab2.TableName
WHERE      (tab2.TableName = N'Проекты')
ORDER BY tab1.minor_id

или

SELECT      OBJECT_NAME(c.object_id) AS TableName, c.name AS ColumnName, major_id, minor_id, ex.name, ex.value AS Extended, type, type_desc,
                        SCHEMA_NAME(SCHEMA_ID) AS Schem
FROM          sys.objects ob FULL OUTER JOIN
                        sys.columns c ON ob.object_id = c.object_id FULL OUTER JOIN
                        sys.extended_properties ex ON ex.minor_id = c.column_id AND ex.major_id = c.object_id
WHERE      (OBJECT_NAME(c.object_id) = N'Проекты') AND (OBJECTPROPERTY(c.object_id, 'IsMsShipped') = 0)

или

SELECT      TOP 100 PERCENT ex.minor_id, OBJECT_NAME(c.object_id) AS TableN, c.name AS ColumnN, ex.value AS ColumnWidth
FROM          sys.columns c LEFT OUTER JOIN
                        sys.extended_properties ex ON ex.major_id = c.object_id AND ex.minor_id = c.column_id AND ex.name = 'ColumnWidth'
WHERE      (OBJECTPROPERTY(c.object_id, 'IsMsShipped') = 0) AND (OBJECT_NAME(c.object_id) = N'Детали')
ORDER BY OBJECT_NAME(c.object_id)



Расширенные Свойства - Сортировка

SELECT DISTINCT name, value
FROM          sys.extended_properties
WHERE      (name LIKE 'MS_OrderBy')



Роли Запросов

SELECT      OBJECT_NAME(id) AS Объект, USER_NAME(uid) AS Роль, action
FROM          sys.sysprotects
WHERE      (USER_NAME(uid) <> 'public')



 Инфа о пользователях и их роли

SELECT      CASE sp.type WHEN 'u' THEN 'WIN' WHEN 's' THEN 'SQL' WHEN 'g' THEN 'GRP' END AS [Login Type], CONVERT(char(45), sp.name) AS srvLogin,
                        CONVERT(char(45), sp2.name) AS srvRole, CONVERT(char(25), dbp.name) AS dbUser, CONVERT(char(25), dbp2.name) AS dbRole,
                        sp.create_date AS USER_create_date, dbo.Пользователи.Логин, dbo.Пользователи.ФИО, dbo.Пользователи.Подразделение
FROM          sys.server_principals sp INNER JOIN
                        sys.database_principals dbp ON sp.sid = dbp.sid INNER JOIN
                        sys.database_role_members dbrm ON dbp.principal_Id = dbrm.member_principal_Id INNER JOIN
                        sys.database_principals dbp2 ON dbrm.role_principal_id = dbp2.principal_id LEFT OUTER JOIN
                        sys.server_role_members srm ON sp.principal_id = srm.member_principal_id LEFT OUTER JOIN
                        sys.server_principals sp2 ON srm.role_principal_id = sp2.principal_id LEFT OUTER JOIN
                        dbo.Пользователи ON CONVERT(char(25), dbp.name) = dbo.Пользователи.Логин


  Активные пользователи

SELECT      TOP 100 PERCENT master.sys.sysprocesses.loginame AS логин, dbo.Пользователи.ФИО,
                        dbo.Пользователи.Отдел, COUNT(master.sys.sysprocesses.loginame) AS соединения, SUM(master.sys.sysprocesses.physical_io)
                        AS операций
FROM          dbo.Подразделения RIGHT OUTER JOIN
                        dbo.Пользователи ON dbo.Подразделения.Код = dbo.Пользователи.Подразделение RIGHT OUTER JOIN
                        master.sys.sysprocesses ON dbo.Пользователи.Логин = master.sys.sysprocesses.loginame
WHERE      (master.sys.sysprocesses.dbid = DB_ID('База'))
GROUP BY master.sys.sysprocesses.loginame, dbo.Пользователи.ФИО, dbo.Пользователи.Отдел
ORDER BY master.sys.sysprocesses.loginame






 Получение списка владельцев базы

ALTER PROCEDURE DbOwnersФормирование
AS  SET NOCOUNT ON

IF OBJECT_ID('tempdb..##Temp') IS NOT NULL BEGIN DROP TABLE ##Temp END
IF OBJECT_ID('tempdb..##Temp') IS NULL
begin
CREATE  TABLE  ##Temp (
    DBName SYSNAME,
    Username SYSNAME,
    Rolename NVARCHAR(50),
    IsOwner BIT
)
end

    '
        USE [База];
        INSERT INTO ##Temp
            SELECT
                DB_NAME(),
                dp.name,
                dp2.name,
                CASE
                    WHEN dp2.name = ''db_owner'' THEN 1
                    ELSE 0
                END AS ''db_owner''
            FROM
                sys.database_principals AS dp
            LEFT JOIN
                sys.database_role_members AS rm
                    ON
                        rm.member_principal_id = dp.principal_id
            LEFT JOIN
                sys.database_principals AS dp2
                    ON
                        rm.role_principal_id = dp2.principal_id
            WHERE
                dp.type <> ''R''
    '
RETURN 
EXEC sp_MSforeachdb

и потом :

ALTER PROCEDURE dbo.DbOwnersПолучение
AS SELECT      *
FROM          dbo.[##Temp]
RETURN


Удаление роли пользователя

ALTER PROCEDURE dbo.УдалениеРолиПользователя
(
 @уКого nvarchar(50),
 @роль varchar(255) )
AS
/* SET NOCOUNT ON */
-- ALTER ROLE  @роль DROP MEMBER @уКого;   //2012 SQL
EXEC sp_droprolemember  @роль, @уКого;


Добавление роли пользователю

ALTER PROCEDURE dbo.ДобавлениеРолиПользователю
(
 @Кому nvarchar(50),
 @роль varchar(255) )
AS
/* SET NOCOUNT ON */
-- ALTER ROLE  @роль ADD MEMBER @Кому; //2012 SQL
EXEC sp_addrolemember @роль, @Кому;



Предоставить доступ к объекту

ALTER PROCEDURE ДатьДоступКобъекту
(
@объект nvarchar(50),   -- входной параметр, идентификатор
@КомуДоступ varchar(255) )
AS
SET NOCOUNT ON
BEGIN
  DECLARE @s nvarchar(1024)
  SET @s=''
SET @s= 'GRANT SELECT ON   @объект  TO @КомуДоступ    '
   EXEC (@s)
END






Изменения за последние 10 дней

SELECT      TOP 100 PERCENT name AS object_name, SCHEMA_NAME(schema_id) AS schema_name, type_desc, create_date, modify_date
FROM          sys.objects
WHERE      (modify_date > GETDATE() - 10)
ORDER BY modify_date


Получить Объем Базы Данных

ALTER PROCEDURE [схема].ОбъемБазыДанных
AS
SET NOCOUNT ON
-- DBCC UPDATEUSAGE(0)
-- DB size.
EXEC sp_spaceused
-- Table row counts and sizes.
CREATE TABLE #t
(
    [name] NVARCHAR(128),
    [rows] CHAR(11),
    reserved VARCHAR(18),
    data VARCHAR(18),
    index_size VARCHAR(18),
    unused VARCHAR(18)
)
INSERT #t EXEC sp_msForEachTable 'EXEC sp_spaceused ''?'''
SELECT *
FROM   #t
-- # of rows.
SELECT SUM(CAST([rows] AS int)) AS [rows]
FROM   #t
DROP TABLE #t





Список Ключей-Связей Столбцов
SELECT      TOP (100) PERCENT LEFT(QUOTENAME(FK.CONSTRAINT_NAME), 50) AS [Foreign Key], CAST(QUOTENAME(FK.TABLE_CATALOG)
                        + '.' + QUOTENAME(FK.TABLE_SCHEMA) + '.' + QUOTENAME(FK.TABLE_NAME) + '.' + QUOTENAME(FK.COLUMN_NAME) AS NVARCHAR(530))
                        AS [поле, которое ссылается], CAST(QUOTENAME(PK.TABLE_CATALOG) + '.' + QUOTENAME(PK.TABLE_SCHEMA)
                        + '.' + QUOTENAME(PK.TABLE_NAME) + '.' + QUOTENAME(PK.COLUMN_NAME) AS NVARCHAR(530)) AS [поле, на которое ссылается]
FROM          INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS PK INNER JOIN
                        INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS C ON PK.CONSTRAINT_CATALOG = C.UNIQUE_CONSTRAINT_CATALOG AND
                        PK.CONSTRAINT_SCHEMA = C.UNIQUE_CONSTRAINT_SCHEMA AND PK.CONSTRAINT_NAME = C.UNIQUE_CONSTRAINT_NAME INNER JOIN
                        INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS FK ON C.CONSTRAINT_CATALOG = PK.CONSTRAINT_CATALOG AND
                        C.CONSTRAINT_SCHEMA = FK.CONSTRAINT_SCHEMA AND C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME AND
                        PK.ORDINAL_POSITION = FK.ORDINAL_POSITION
ORDER BY FK.CONSTRAINT_NAME, PK.ORDINAL_POSITION






 Связи Таблицы
SELECT      TOP 100 PERCENT FK.COLUMN_NAME AS Field, PK.COLUMN_NAME AS Source, FK.TABLE_NAME AS FieldTab, PK.TABLE_NAME AS SourceTab
FROM          INFORMATION_SCHEMA.KEY_COLUMN_USAGE PK INNER JOIN
                        INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C ON PK.CONSTRAINT_CATALOG = C.UNIQUE_CONSTRAINT_CATALOG AND
                        PK.CONSTRAINT_SCHEMA = C.UNIQUE_CONSTRAINT_SCHEMA AND PK.CONSTRAINT_NAME = C.UNIQUE_CONSTRAINT_NAME INNER JOIN
                        INFORMATION_SCHEMA.KEY_COLUMN_USAGE FK ON C.CONSTRAINT_CATALOG = PK.CONSTRAINT_CATALOG AND
                        C.CONSTRAINT_SCHEMA = FK.CONSTRAINT_SCHEMA AND C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME AND
                        PK.ORDINAL_POSITION = FK.ORDINAL_POSITION


Случайные 5 пользователей
SELECT      TOP 5 ROW_NUMBER() OVER (ORDER BY Отдел ASC) AS '№', ФИО, Отдел
FROM          dbo.Пользователи
WHERE      (Отдел LIKE N'Б%')
ORDER BY NEWID()






MS SQL example cross-procedure



Пример перекрестного запроса MS SQL



USE [dbName1]
GO
/****** Object:  StoredProcedure [dbo].[Справка]    Script Date: 08/01/2011 15:49:39 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Справка]
AS
SELECT *
FROM (
SELECT Table1.Приоритет, Продукт, Артикул, Наименование, Вид, Заказ, Куплено, Продано
FROM dbo.Table1 INNER JOIN
            dbo.Table2 ON dbo.Table1.Модель = dbo.Table2.Продукт INNER JOIN
            dbo.Table3 ON dbo.Table2.Код = dbo.Table3.Код INNER JOIN
            dbo.Table5 ON dbo.Table3.Код = dbo.Table5.Код AND dbo.Table3.Покупатель = dbo.Table5.Клиент INNER JOIN
            dbo.Table4 ON dbo.Table5.Адрес = dbo.Table4.Адрес
) old
pivot (count(Вид) FOR Вид IN ([провода],[клеммы],[конденсаторы],[изоляция],[светодиоды],[прочее])
) AS new
ORDER BY Приоритет







MS Access SQL Examples


Запросы на выборку из таблицы
Самыми распространенными и простыми запросами SQL в базе данных являются запросы на выборку. Отличают их по ключевому слову SELECT[1]. Эти запросы применяют тогда, когда необходимо отобрать часть записей из одной или нескольких таблиц. Наиболее часто запросы применяют в формах, списках и модулях. 
Вот несколько примеров на данную тему:

1. Форма. Me.RecordSource = "SELECT * FROM [Данные]" (явное указание запроса)
2. Список. Me.ПолеСоСписком1.RowSource = запросSQL (запрос считывается из базы данных).
3. Модуль. Set rst = dbs.OpenRecordset(strSQL) (запрос берется из текстовой переменной, где strSQL="SELECT * FROM [Пример 05]")


Ниже приводятся запросы на выборку для одной таблицы. Естественно, что эти примеры лучше изучать на практике. Для этого скачайте программу: la_query.mdb. Запустите пример 1 и, изменяя содержание запроса, например, добавляя ключевые слова, Вы будете видеть результат в списке формы. Если запрос будет неправильным, то список будет пустой. А теперь изучите запросы.

Примеры  SQL - запросов:


Запрос с Excel для вставки в Access

SELECT *
FROM [Excel 8.0;DATABASE=C:\2.xls].[Лист1$B14:I190];
Выборка без указания таблиц
Код:
SELECT "Ура!", "Вперед!" as Лозунг

Выборка всех записей из таблицы
Код:
SELECT * FROM [Данные]

Выборка всех записей из колонки
Код:
SELECT ALL [Книга] FROM [Данные]

Выборка 1 поля с указанием источника
Код:
SELECT [T5].КурсUSD From [Данные] AS [T5];

Выборка с условием для разных полей
Код:
SELECT * FROM [Данные] WHERE [Дата]=#11/15/2000# and ([Книга]='Война и Мир') and ([СуммаРуб]=500);

Выборка с вычислением результата
Код:
SELECT *, "USD=" & Format([СуммаРуб]/[КурсUSD],"0.00") as [СуммаUSD] FROM [Данные];

Выборка с сортировкой /вверх, вниз/
Код:
SELECT * FROM [Данные] ORDER BY [СуммаРуб] ASC, [КурсUSD] DESC;
Выборка 1 записи   SELECT TOP 1 * FROM [Данные];

Выборка 25 % записей
Код:
SELECT TOP 25 PERCENT * FROM [Данные] ORDER BY КурсUSD DESC;

Выборка уникальных записей /книг/
Код:
SELECT DISTINCT [Книга] FROM [Данные];

Выборка максимального числа
Код:
SELECT Max(КурсUSD) as MaxUSD From [Данные];

Выборка среднего числа
Код:
SELECT Avg(КурсUSD) as Средний From [Данные];

Выборка минимального числа
Код:
SELECT Min(КурсUSD) as Минимальный From [Данные];

Выборка первого числа
Код:
SELECT First(КурсUSD) as Первый From [Данные];

Выборка последнего числа
Код:
SELECT Last(КурсUSD) as Последний From [Данные];

Выборка суммы
Код:
SELECT Sum(СуммаРуб) as Сумма From [Данные];

Выборка c подсчетом строк
Код:
SELECT Count(КурсUSD) as Кол_во From [Данные];

Выборка из закрытой таблицы
Код:
SELECT * FROM [Данные] WITH OWNERACCESS OPTION

Выборка c группировкой
Код:
SELECT First(Книга) as Книги, avg(СуммаРуб) as [Средняя Цена] FROM [Данные] GROUP BY Книга

Выборка после группировки
Код:
SELECT First(Книга) as Книги, Avg(СуммаРуб) as [Средняя Цена] FROM [Данные] GROUP BY Книга HAVING Avg(СуммаРуб)>350


При разработке запросов Вам потребуются много разных слов, например, *, ALL, AS, FROM, ASC, DESC, TOP, PERCENT, DISTINCT, MAX, MIN, SUM, AVG, FIRST, LAST, COUNT, ORDER BY, WITH OWNERACCESS OPTION,GROUP BY, HAVING. Описание их дано в словаре и в справочной системе.


Словарь
• [1] SELECT (выбрать) - выбирает столбцы для запроса
• [2] FROM (из) - слово определяет имя таблицы или запроса
• [3] *, ALL (все) - слова определяют вариант отбора записей
• [4] TOP (верх), PERCENT (процент) - слова необходимы для получения нескольких записей из таблиц
• [5] AS (как) - слово используется для нового названия поля или таблицы
• [6] DISTINCT (отличающийся) - слово применяется для отбора только уникальных записей из колонки
• [7] WHERE (где) - слово для отбора записей по условному выражению
• [8] ORDER BY, ASC, DESC - слова используются для сортировки записей по возрастанию и убыванию
• [9] GROUP BY, HAVING - первые слова используются для группировки, а третье для отбора записей уже после вычислений (HAVING аналог WHERE)
• [10] MAX, MIN, FIRST, LAST - функции группировки для получения максимального, минимального, первого и последнего числа в выборке.
• [11] SUM, AVG - функции группировки, которые вычисляют сумму, среднее значение и количество записей запроса
• [12] WITH OWNERACCESS OPTION - используется для получения записей из таблицы, которая создана другим пользователем и защищена от просмотра


Пример  соединения с файлами .dbf
Код:
Dim myConnect As New ADODB.Connection
Dim myRecordset As New ADODB.Recordset
Dim sql_448 As String = "Select DATA_F From CPLAT.DBF Where KOD_DN = 448"
myConnect.CursorLocation = CursorLocationEnum.adUseClient
            myConnect.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + _
            "ata Source=D:\SKSDATA\GOS\DBPLAT;" + "Extended Properties=""dBase III;"";"""
            myConnect.Open()
myRecordset = myConnect.Execute(sql_448)
            TextBox2.Text = myRecordset.Fields("ATA_F".Value)


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

javascript аналог preg_match_all

Javascript аналог preg_match_all



function preg_match_all(regex, haystack) {
   var globalRegex = new RegExp(regex, 'g');
   var globalMatch = haystack.match(globalRegex);
   matchArray = new Array();
   for (var i in globalMatch) {
 nonGlobalRegex = new RegExp(regex);
 nonGlobalMatch = globalMatch[i].match(nonGlobalRegex);
 matchArray.push(nonGlobalMatch[1]);
   }
   return matchArray;
}



Транслитерация кириллических символов


 Транслитерация кириллических символов



  public static function convertToAscii($str)
    {
        static $UTF8_LOWER_ACCENTS = NULL;
        static $UTF8_UPPER_ACCENTS = NULL;
        if ( is_null($UTF8_LOWER_ACCENTS) ) {
            $UTF8_LOWER_ACCENTS = array(
'а'=>'a','б'=>'b','в'=>'v','г'=>'g','д'=>'d','е'=>'e','ё'=>'yo','ж'=>'zh','з'=>'z','и'=>'i','й'=>'y',
'к'=>'k','л'=>'l','м'=>'m','н'=>'n','о'=>'o','п'=>'p','р'=>'r','с'=>'s','т'=>'t','у'=>'u','ф'=>'f',
'х'=>'h','ц'=>'ts','ч'=>'ch','ш'=>'sh','щ'=>'shch','ъ'=>'','ы'=>'i','ь'=>'','э'=>'e','ю'=>'yu','я'=>'ya',
' '=>'-',
  'à' => 'a', 'ô' => 'o', 'ď' => 'd', 'ḟ' => 'f', 'ë' => 'e', 'š' => 's', 'ơ' => 'o',
  'ß' => 'ss', 'ă' => 'a', 'ř' => 'r', 'ț' => 't', 'ň' => 'n', 'ā' => 'a', 'ķ' => 'k',
  'ŝ' => 's', 'ỳ' => 'y', 'ņ' => 'n', 'ĺ' => 'l', 'ħ' => 'h', 'ṗ' => 'p', 'ó' => 'o',
  'ú' => 'u', 'ě' => 'e', 'é' => 'e', 'ç' => 'c', 'ẁ' => 'w', 'ċ' => 'c', 'õ' => 'o',
  'ṡ' => 's', 'ø' => 'o', 'ģ' => 'g', 'ŧ' => 't', 'ș' => 's', 'ė' => 'e', 'ĉ' => 'c',
  'ś' => 's', 'î' => 'i', 'ű' => 'u', 'ć' => 'c', 'ę' => 'e', 'ŵ' => 'w', 'ṫ' => 't',
  'ū' => 'u', 'č' => 'c', 'ö' => 'oe', 'è' => 'e', 'ŷ' => 'y', 'ą' => 'a', 'ł' => 'l',
  'ų' => 'u', 'ů' => 'u', 'ş' => 's', 'ğ' => 'g', 'ļ' => 'l', 'ƒ' => 'f', 'ž' => 'z',
  'ẃ' => 'w', 'ḃ' => 'b', 'å' => 'a', 'ì' => 'i', 'ï' => 'i', 'ḋ' => 'd', 'ť' => 't',
  'ŗ' => 'r', 'ä' => 'ae', 'í' => 'i', 'ŕ' => 'r', 'ê' => 'e', 'ü' => 'ue', 'ò' => 'o',
  'ē' => 'e', 'ñ' => 'n', 'ń' => 'n', 'ĥ' => 'h', 'ĝ' => 'g', 'đ' => 'd', 'ĵ' => 'j',
  'ÿ' => 'y', 'ũ' => 'u', 'ŭ' => 'u', 'ư' => 'u', 'ţ' => 't', 'ý' => 'y', 'ő' => 'o',
  'â' => 'a', 'ľ' => 'l', 'ẅ' => 'w', 'ż' => 'z', 'ī' => 'i', 'ã' => 'a', 'ġ' => 'g',
  'ṁ' => 'm', 'ō' => 'o', 'ĩ' => 'i', 'ù' => 'u', 'į' => 'i', 'ź' => 'z', 'á' => 'a',
  'û' => 'u', 'þ' => 'th', 'ð' => 'dh', 'æ' => 'ae', 'µ' => 'u', 'ĕ' => 'e',
            );
        }
        $str = str_replace(
                array_keys($UTF8_LOWER_ACCENTS),
                array_values($UTF8_LOWER_ACCENTS),
                $str
            );
        if ( is_null($UTF8_UPPER_ACCENTS) ) {
            $UTF8_UPPER_ACCENTS = array(
  'À' => 'A', 'Ô' => 'O', 'Ď' => 'D', 'Ḟ' => 'F', 'Ë' => 'E', 'Š' => 'S', 'Ơ' => 'O',
  'Ă' => 'A', 'Ř' => 'R', 'Ț' => 'T', 'Ň' => 'N', 'Ā' => 'A', 'Ķ' => 'K',
  'Ŝ' => 'S', 'Ỳ' => 'Y', 'Ņ' => 'N', 'Ĺ' => 'L', 'Ħ' => 'H', 'Ṗ' => 'P', 'Ó' => 'O',
  'Ú' => 'U', 'Ě' => 'E', 'É' => 'E', 'Ç' => 'C', 'Ẁ' => 'W', 'Ċ' => 'C', 'Õ' => 'O',
  'Ṡ' => 'S', 'Ø' => 'O', 'Ģ' => 'G', 'Ŧ' => 'T', 'Ș' => 'S', 'Ė' => 'E', 'Ĉ' => 'C',
  'Ś' => 'S', 'Î' => 'I', 'Ű' => 'U', 'Ć' => 'C', 'Ę' => 'E', 'Ŵ' => 'W', 'Ṫ' => 'T',
  'Ū' => 'U', 'Č' => 'C', 'Ö' => 'Oe', 'È' => 'E', 'Ŷ' => 'Y', 'Ą' => 'A', 'Ł' => 'L',
  'Ų' => 'U', 'Ů' => 'U', 'Ş' => 'S', 'Ğ' => 'G', 'Ļ' => 'L', 'Ƒ' => 'F', 'Ž' => 'Z',
  'Ẃ' => 'W', 'Ḃ' => 'B', 'Å' => 'A', 'Ì' => 'I', 'Ï' => 'I', 'Ḋ' => 'D', 'Ť' => 'T',
  'Ŗ' => 'R', 'Ä' => 'Ae', 'Í' => 'I', 'Ŕ' => 'R', 'Ê' => 'E', 'Ü' => 'Ue', 'Ò' => 'O',
  'Ē' => 'E', 'Ñ' => 'N', 'Ń' => 'N', 'Ĥ' => 'H', 'Ĝ' => 'G', 'Đ' => 'D', 'Ĵ' => 'J',
  'Ÿ' => 'Y', 'Ũ' => 'U', 'Ŭ' => 'U', 'Ư' => 'U', 'Ţ' => 'T', 'Ý' => 'Y', 'Ő' => 'O',
  'Â' => 'A', 'Ľ' => 'L', 'Ẅ' => 'W', 'Ż' => 'Z', 'Ī' => 'I', 'Ã' => 'A', 'Ġ' => 'G',
  'Ṁ' => 'M', 'Ō' => 'O', 'Ĩ' => 'I', 'Ù' => 'U', 'Į' => 'I', 'Ź' => 'Z', 'Á' => 'A',
  'Û' => 'U', 'Þ' => 'Th', 'Ð' => 'Dh', 'Æ' => 'Ae', 'Ĕ' => 'E',
  'А'=>'A','Б'=>'B','В'=>'V','Г'=>'G','Д'=>'D','Е'=>'E','Ё'=>'Yo','Ж'=>'Zh','З'=>'Z','И'=>'I','Й'=>'Y',
'К'=>'K','Л'=>'L','М'=>'M','Н'=>'N','О'=>'O','П'=>'P','Р'=>'R','С'=>'S','Т'=>'T','У'=>'U','Ф'=>'F',
'Х'=>'H','Ц'=>'Ts','Ч'=>'CH','Ш'=>'Sh','Щ'=>'Shch','Ъ'=>'','Ы'=>'I','Ь'=>'','Э'=>'E','Ю'=>'Yu','Я'=>'Ya',
            );
        }
        $str = str_replace(
                array_keys($UTF8_UPPER_ACCENTS),
                array_values($UTF8_UPPER_ACCENTS),
                $str
            );
        return $str;
    }




Почистить папку в Yandex почте с огромным числом писем на jQuery

Почистить папку в Yandex почте с огромным числом писем на jQuery  

В настройках поставьте максимальное число отображаемых писем (200), иначе по умолчанию будет удалять только по 20 писем, далее выделяем все видимые письма в папке, нажимаем кнопку удалить, повторяем процедуру через 5 секунд.


(function(){
 $('.block-messages-list-box.b-layout__first-pane input[type=checkbox]:not(:first)').trigger('click').trigger('click');
 $('a.b-toolbar__item.b-toolbar__item_delete.daria-action').click();
 setTimeout(arguments.callee,5000);
})();
Удаленные письма попадают в папку «Удаленные». Которая тоже штатными средствами не чистится. Придется повторить процедуру дважды.

Возвращаем в jQuery $.browser

Возвращаем в jQuery $.browser - в новых версиях  jQuery $.browser не работает, потому существует такой костыль:

(function() {

    var matched, browser;

// jQuery.uaMatch поддерживается для совместимости  
jQuery.uaMatch = function( ua ) {
        ua = ua.toLowerCase();

        var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
            /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
            /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
            /(msie) ([\w.]+)/.exec( ua ) ||
            ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
            [];

        return {
            browser: match[ 1 ] || "",
            version: match[ 2 ] || "0"
        };
    };

    matched = jQuery.uaMatch( navigator.userAgent );
    browser = {};

    if ( matched.browser ) {
        browser[ matched.browser ] = true;
        browser.version = matched.version;
    }

// Chrome is Webkit, but Webkit is also Safari.
    if ( browser.chrome ) {
        browser.webkit = true;
    } else if ( browser.webkit ) {
        browser.safari = true;
    }

    jQuery.browser = browser;

    jQuery.sub = function() {
        function jQuerySub( selector, context ) {
            return new jQuerySub.fn.init( selector, context );
        }
        jQuery.extend( true, jQuerySub, this );
        jQuerySub.superclass = this;
        jQuerySub.fn = jQuerySub.prototype = this();
        jQuerySub.fn.constructor = jQuerySub;
        jQuerySub.sub = this.sub;
        jQuerySub.fn.init = function init( selector, context ) {
            if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
                context = jQuerySub( context );
            }

            return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
        };
        jQuerySub.fn.init.prototype = jQuerySub.fn;
        var rootjQuerySub = jQuerySub(document);
        return jQuerySub;
    };

})();


Продлеваем время жизни сессии PHP

Продлеваем время жизни сессии PHP



Допустим, мы хотим задать время жизни сесии - 3 часа.

Для этого в файле php.ini устанавливаем следующие параметры:
session.gc_maxlifetime = 10800
session.cookie_lifetime = 10800

Если у вас нет возможности внести изменения в файл php.ini, то можно сделать установку этих параметров при помощи файла .htaccess. Для этого вносим в него следующие строки:
php_value session.gc_maxlifetime 10800
php_value session.cookie_lifetime 10800

Кроме того, вы можете установить время жизни сессионной куки из PHP при помощи функции session_set_cookie_params. К примеру:
<?php
session_set_cookie_params(10800);
?>

При этом нужно учитывать, что функциция set_cookie_params должна быть вызвана до того, как сессия будет открыта при помощи session_start.Функция set_cookie_params также позволяет установить путь, домен, настройки безопасности для сессионной куки.




Эмуляция CURLOPT_FOLLOWLOCATION

Эмуляция CURLOPT_FOLLOWLOCATION

когда появляется ошибка CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set , что означает, что для использования опции CURLOPT_FOLLOWLOCATION необходимо выключить safe_mode или деактивировать директиву open_basedir. Часто хостинг-компании не позволяют сделать ни того ни другого.
Опция CURLOPT_FOLLOWLOCATION необходима для того, чтобы, при получении заголовка Location происходило автоматическое перенаправление на указанный URL (301-й, 302-й редирект).

Для решения этой проблемы воспользуйтесь следующей функцией вместо curl_exec.
Функция curl_redir_exec проверяет в возвращаемых заголовках заголовок Location, если он присутствует, то пытается перейти по url указанному в заголовке, если он отсутствует — отдает полученное содержимое



function curl_redir_exec($ch){
    static $curl_loops = 0;
    static $curl_max_loops = 20;
    if ($curl_loops >= $curl_max_loops)
    {
    $curl_loops = 0;
        return FALSE;
    }
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $data = curl_exec($ch);
    list($header, $data) = explode("\r\n\r\n", $data, 2);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    if ($http_code == 301 || $http_code == 302){
        $matches = array();
        preg_match('/Location:(.*?)\n/', $header, $matches);
        $url = @parse_url(trim(array_pop($matches)));
        if (!$url){
            //couldn't process the url to redirect to
            $curl_loops = 0;
            return $data;
        }
        $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
        if (!$url['scheme'])
            $url['scheme'] = $last_url['scheme'];
        if (!$url['host'])
            $url['host'] = $last_url['host'];
        if (!$url['path'])
            $url['path'] = $last_url['path'];
        $new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:'');
        curl_setopt($ch, CURLOPT_URL, $new_url);
        //debug('Redirecting to', $new_url);
        return curl_redir_exec($ch);
    }else{
        $curl_loops=0;
        return $data;
    }
}


function curl_redir_exec($ch){
    static $curl_loops = 0;  
    static $curl_max_loops = 20;  
    if ($curl_loops >= $curl_max_loops)  
    {  
    $curl_loops = 0;  
        return FALSE;  
    }  
    curl_setopt($ch, CURLOPT_HEADER, true);  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
    $data = curl_exec($ch);  
    list($header, $data) = explode("\r\n\r\n", $data, 2);  
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);  
    if ($http_code == 301 || $http_code == 302){  
        $matches = array();  
        preg_match('/Location:(.*?)\n/', $header, $matches);  
        $url = @parse_url(trim(array_pop($matches)));  
        if (!$url){  
            //couldn't process the url to redirect to  
            $curl_loops = 0;  
            return $data;  
        }
        $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));  
        if (!$url['scheme'])  
            $url['scheme'] = $last_url['scheme'];  
        if (!$url['host'])  
            $url['host'] = $last_url['host'];  
        if (!$url['path'])  
            $url['path'] = $last_url['path'];  
        $new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:'');  
        curl_setopt($ch, CURLOPT_URL, $new_url);  
        //debug('Redirecting to', $new_url);  
        return curl_redir_exec($ch);  
    }else{  
        $curl_loops=0;  
        return $data;  
    }
}

четверг, 19 сентября 2013 г.

Get Age By Birthday on php

Получить возраст на PHP по дню рождения




function birthday($birthday){
    
$age strtotime($birthday);
    if(
$age === false){
        return 
false;
    }
    list(
$y1,$m1,$d1) = explode("-",date("Y-m-d",$age));
    
$now strtotime("now");
    list(
$y2,$m2,$d2) = explode("-",date("Y-m-d",$now));
    
$age $y2 $y1;
    if((int)(
$m2.$d2) < (int)($m1.$d1))
        
$age -= 1;
    return 
$age;
}

echo 
birthday('1982-07-25'); 


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

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