Архив

Архив раздела ‘Новости’

Импорт mysql дампа средствами php

26 Апрель 2013 Нет комментариев

В моем примере база была InnoDB, поэтому пример привожу с ее фишками:

//читаем файл с дампом
$str = file_get_contents("dump.sql");

//если есть CREATE TABLE, тогда создаем таблицы
if( preg_match_all("/\-\- Table.*?\s\-\-\s(.*?)\-\-/s", $str, $p) ) {
$er = false;
foreach( $p[1] as $v ) {

if( trim($v) != '' ) {

if(!mysql_query(trim($v), $link)) {

echo '<strong style="color: red;">Ошибка запроса:'.$v.'</strong>';

$er = true;

}

}

}

}

//если есть инсерты, инсертим ;)
if(preg_match_all("/\-\- Dumping data.*?\s\-\-\s(.*?)\-\-/s", $str, $p)) <span style="font-size: 13px;">{</span>

foreach( $p[1] as $v ) {

if( trim($v) != '' ) {

if(!mysql_query(trim($v), $link)) {

echo '<strong style="color: red;">Ошибка запроса:'.$v.'</strong>';

$er = true;

}

}

}

}

//создаем связи между таблицами
if(preg_match_all("/\-\- Constraints.*?\s\-\-\s(.*?)\-\-/s", $str, $p)) <span style="font-size: 13px;">{</span>

foreach( $p[1] as $v ) {

if( trim($v) != '' ) {

if(!mysql_query(trim($v), $link)) {

echo '<strong style="color: red;">Ошибка запроса:'.$v.'</strong>';

$er = true;

}

}

}

}

if( $er !== false ) {
echo '<strong style="color: green;">'.gettext("Дамп базы данных установлен.").'</strong>';
}
else {
echo '<strong style="color: green;">'.gettext("Дамп базы данных установлен с ошибками.").'</strong>';
}
Categories: Новости Tags: ,

Подсчет записей в базе данных для пагинатора

27 Август 2012 Нет комментариев

При создании пагинатора или вывода количества записей для данного запроса на странице обычно используется 2 одинаковых запроса SELECT. Первым запросом мы считаем общее кол-во записей, соот-щих данным условием SELECT COUNT(*)… , вторым запросом выдергиваем кол-во записей нужных для этой страницы, используя LIMIT. В итоге мы получаем два огромных медленных запроса. Есть решение как сделать все это действие 1 большим запросом и 1 маленьким:

SELECT SQL_CALC_FOUND_ROWS * FROM table WHERE column > 1 LIMIT 0, 50;

Первым делаем наш запрос, что раньше шел вторым, т е тот что с лимитом, но добавляем в него SQL_CALC_FOUND_ROWS
Далее делаем запрос, который вернет общее кол-во записей, соот-щих условию предыдущего запроса, без учета LIMIT:
SELECT FOUND_ROWS();
Второй запрос должен выполняться сразу после первого.

Categories: Новости Tags:

INSERT UPDATE в одном флаконе. Часть 2.

27 Август 2012 Нет комментариев

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

Например есть некая таблица, где хранятся значения дополнительных параметров для товара, в таблице tFieldValue есть поля:

valueId

value

fieldId – ключ, указывающий значение какого параметра храним

goodId – ключ, указывающий на товар.

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

Чтобы решить эту задачу в 1 запрос в таблице tFieldValue из полей fieldId и goodId делаем 1 составной уникальный ключ, в phpmyadmin в структуре таблице выделяем эти два поля галочкой и нажимаем кнопку с уникальным ключом, либо запросом:

ALTER TABLE ` tFieldValue` ADD UNIQUE (

`fieldId` ,
`goodId`

);

Далее работаем с этой таблице как описано в части 1:

INSERT INTO `tFieldValue` (value,fieldId,goodId ) VALUES (‘8′, 120,1)
ON DUPLICATE KEY UPDATE value=’8′

Mysql будет искать запись в таблице tFieldValue с полем fieldId = 120 ,goodId=1, если найдет, то обновит value, если не найдет, тогда добавит новую запись.

Categories: Новости Tags:

ubuntu apache2 virtual hosts bash script

Перерыл кучу скриптом, выкладываю единственный скрипт на баше, который удалось найти, который нормально создает виртуальный хосты в ubuntu:

#!/bin/bash

### Checking for user
if [ "$(whoami)" != 'root' ]; then
echo “You have no permission to run $0 as non-root user. Use sudo !!!”
exit 1;
fi

### Configure email and vhost dir
email=’prasad@chaugule.in’ # email address of administrator
vhroot=’/etc/apache2/sites-available’ # no trailing slash
iserror=’no’
hosterror=”
direrror=”

# Take inputs host name and root directory
echo -e “Please provide hostname. e.g.dev,staging”
read hostname
echo -e “Please provide web root directory. e.g. /websites/dev,e.g. /websites/staging”
read rootdir

### Check inputs
if [ "$hostname" = "" ]
then
iserror=”yes”
hosterror=”Please provide domain name.”
fi

if [ "$rootdir" = "" ]
then
iserror=”yes”
direrror=”Please provide web root directory name.”
fi

### Displaying errors
if [ "$iserror" = "yes" ]
then
echo “Please correct following errors:”
if [ "$hosterror" != "" ]
then
echo “$hosterror”
fi

if [ "$direrror" != "" ]
then
echo “$direrror”
fi
exit;
fi

### check whether hostname already exists
if [ -e $vhroot"/"$hostname ]; then
iserror=”yes”
hosterror=”Hostname already exists. Please provide another hostname.”
fi

### check if directory exists or not
if ! [ -d $rootdir ]; then
iserror=”yes”
direrror=”Directory provided does not exists.”;
fi

### Displaying errors
if [ "$iserror" = "yes" ]
then
echo “Please correct following errors:”
if [ "$hosterror" != "" ]
then
echo “$hosterror”
fi

if [ "$direrror" != "" ]
then
echo “$direrror”
fi
exit;
fi

if ! touch $vhroot/$hostname
then
echo “ERROR: “$vhroot”/”$hostname” could not be created.”
else
echo “Virtual host document root created in “$vhroot”/”$hostname
fi

if ! echo ”
ServerAdmin $email
ServerName $hostname
ServerAlias $hostname www.$hostname
DocumentRoot $rootdir

AllowOverride All

AllowOverride All

ErrorLog /var/log/apache2/$hostname
LogLevel error
CustomLog /var/log/apache2/$hostname custom
” > $vhroot/$hostname
then
echo “ERROR: the virtual host could not be added.”
else
echo “New virtual host added to the Apache vhosts file”
fi

### Add hostname in /etc/hosts
if ! echo “127.0.0.1 $hostname” >> /etc/hosts
then
echo “ERROR: Not able write in /etc/hosts”
else
echo “Host added to /etc/hosts file”
fi

### enable website
a2ensite $hostname

### restart Apache
/etc/init.d/apache2 reload

### give permission to root dir
chmod 755 $rootdir

if ! touch $rootdir/phpinfo.php
then
echo “ERROR: “$rootdir”/phpinfo.php could not be created.”
else
echo “”$rootdir”/phpinfo.php created.”
fi
if ! echo “” > $rootdir/phpinfo.php
then
echo “ERROR: Not able to write in file “$rootdir”/phpinfo.php. Please check permissions.”
else
echo “Added content to “$rootdir”/phpinfo.php.”
fi

# show the finished message
echo “Complete! The new virtual host has been created.
To check the functionality browse http://”$hostname”/phpinfo.php
Document root is “$vhroot”/”$hostname

Categories: Новости Tags:

Что делать, если имена таблиц mysql переводятся в нижний регистр в Windows

10 Февраль 2012 Нет комментариев

В настройках mysql в файле my.ini надо добавить строку lower_case_table_names=0, тогда таблицы начнут создаваться в нужном вам регистре. Подробнее можно прочитать тут: http://www.mysql.ru/docs/man/Name_case_sensitivity.html

Categories: Новости Tags: ,

Что делать если не работает Apache в windows7, заблокирован 80 порт

9 Февраль 2012 Нет комментариев
  1. заходим в regedit (пуск – выполнить – regedit)
  2. идем в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP
  3. добавляем новую запись DWORD (32-bit)
  4. Называем ее NoRun
  5. два раза кликаем по записи и меняем значение на 1
  6. сохраняем и перезагружаем компьютер

 

Categories: Новости Tags: ,

Таймер обратного отсчета на javascript

20 Декабрь 2011 Нет комментариев

Выкладываю код таймера отсчета времени до определенной даты, который считает дни, часы, секунды.

 function timer( start, finish, step )
 {
      var now = new Date(start+step);
      var newTime = new Date(finish);
      var totalRemains = (newTime.getTime()-now.getTime());
      if (totalRemains>1)
      {
          var RemainsSec=(parseInt(totalRemains/1000));
          var RemainsFullDays=(parseInt(RemainsSec/(24*60*60)));
          var secInLastDay=RemainsSec-RemainsFullDays*24*3600;
          var RemainsFullHours=(parseInt(secInLastDay/3600));
          if (RemainsFullHours<10){RemainsFullHours="0"+RemainsFullHours};
          var secInLastHour=secInLastDay-RemainsFullHours*3600;
          var RemainsMinutes=(parseInt(secInLastHour/60));
          if (RemainsMinutes<10){RemainsMinutes="0"+RemainsMinutes};
          var lastSec=secInLastHour-RemainsMinutes*60;
          if (lastSec<10){lastSec="0"+lastSec};
          var mcend = new Date(finish);
          var mcnow = now.getTime();
        
         
          $("#timer").html("Осталось: "+RemainsFullDays+" дней "+RemainsFullHours+":"+RemainsMinutes+":"+lastSec);
          step += 1000;
          setTimeout("timer()",1000);
      } 
      else {
	      $("#timer").html("Время истекло.");
      }
  }
  $(document).ready(function(){
      timer(<?php echo time()*1000?>,<?php echo $finish*1000;?>,0);
   });

start – текущее время в миллисекундах
finish – время окончания в миллисекундах
step – шаг отсчета в миллисекундах

Categories: Новости Tags:

Декодер паролей Total Commander

18 Август 2011 Нет комментариев

Столкнулся с проблемой, когда нужен пароль от ftp для редактора, а пароля нет, есть только вбитый  в Total Commander, но оттуда его не вытащить, нашел в сети отличную программу, решающую проблему по получению пароля из Total Commander.

Тотал коммандер хранит свои фтп доступы в файле wcx_ftp.ini, он лежит в C:\Program Files\Total Commander\

Открываем его блокнотом, ищем нужный доступ, копируем зашифрованный пароль, вставляем в программу и получаем пароль.

Скачать программу для декодирования (получения) паролей из Total Commander

 

Categories: Новости Tags:

webmoney – как отключить sms подтверждения

24 Январь 2011 Нет комментариев

Начался новый рабочий год, шалко валко деньги на кошелек вебмани потекли, но при оплате ими появилась новая фишка – sms подтверждения. Вещь удобная для личного кошелька, но когда кошелек корпоративный и зарегистрирован не на тебя, то такая фишка копец как неудобно. Чтобы выключить sms подтверждения webmoney делаем простые телодвижения:

  1. Идем по ссылке https://security.webmoney.ru/asp/setsmssimpletrans.asp
  2. Авторизовываемся через квипер
  3. На открывшейся странице жмем на кнопку «ВЫКЛючить подтверждение через SMS»
  4. Получаем последнюю смску с кодом, жмем «Авторизоваться»
  5. Видим сообщение об отключении подтверждений по смс.
  6. Живем спокойно
Categories: Новости Tags:

flash multiupload files

20 Январь 2011 7 comments

В процессе написания очередного заказа впервые столкнулся с требованиями воткнуть на сайт мультизагрузчик изображений, вещь действительно нужная. Перелопатил много готовых решений, но самые классные из них как всегда платные. Обратился к священному писанию habrahabr’у и наковырял там интересную, но как всегда недоточенную напильником статью про плагин для jquery с flash мультизагрузчиком файлов http://www.uploadify.com

Плагин очень простой, без наворотов (что немного конечно печалит), но нужные рычаги имеет.

Качаем нужное тут http://www.uploadify.com/download/


<link href="/css/uploadify.css" type="text/css" rel="stylesheet" />

<script type="text/javascript" src="/js/jquery.uploadify.min.js"></script>

<script type="text/javascript" src="/js/jquery.js"></script>

<script type="text/javascript" src="/js/swfobject.js"></script>

<script type="text/javascript">

$(document).ready(function() {
$('#file_upload').uploadify({
'uploader'    : '/i/uploadify.swf',
'script'     :'upload.php',
'checkscript'  : 'check.php',
'cancelImg'   : '/i/cancel.png',
'queueID'    : 'fileQueue',
'auto'      : true,
'multi'     : true,
'fileDesc'   : 'jpg',
'fileExt'   : '*.jpg',
'onComplete'   : function(event,queueID,fileObj,response,data) {$('#response').append(response);}
});
});
</script>
<div id="response"></div>
<div id="fileQueue"></div>

<input id="file_upload" name="file_upload" type="file" />

check.php


$fileArray = array();
foreach ($_POST as $key => $value) {
if ($key != 'folder') {
if (file_exists([путь к папке, куда закачиваются файлы] . $value)) {
$fileArray[$key] = $value;
}
}
}
echo json_encode($fileArray);

uploade.php


$targetFolder = [путь к папке, куда закачиваются файлы];

if (!empty($_FILES)) {
$tempFile = $_FILES['Filedata']['tmp_name'];
$targetPath = $targetFolder;
$targetFile = $targetPath . $_FILES['Filedata']['name'];

// Validate the file type
$fileTypes = array('jpg','jpeg'); // File extensions
$fileParts = pathinfo($_FILES['Filedata']['name']);

if (in_array($fileParts['extension'],$fileTypes)) {
move_uploaded_file($tempFile,$targetFile);
echo '1';
} else {
echo 'Invalid file type.';
}
}

После этих небольших манипуляций вы получаете загрузчик файлов, но в нем есть одна проблема, он не поддерживает сессию, покопавшись на форуме разработчиков (там как всегда решение есть, но оно у меня естественно не заработало) и применив любимый напильник, я нашел путь решения:

в код яваскрипта добавляем строку ‘scriptData': { ‘session': ‘<?php echo session_id();?>’},

$(document).ready(function() {
$('#file_upload').uploadify({
'uploader'    : '/i/uploadify.swf',
'script'     :'upload.php',

'scriptData': { 'session': '<?php echo session_id();?>'},
'checkscript'  : 'check.php',
'cancelImg'   : '/i/cancel.png',
'queueID'    : 'fileQueue',
'auto'      : true,
'multi'     : true,
'fileDesc'   : 'jpg',
'fileExt'   : '*.jpg',
'onComplete'   : function(event,queueID,fileObj,response,data) {$('#response').append(response);}
});
});

В php файлах обработчиках, если сессия уже была начата добавляем строку session_write_close(); , в ином случае нужно без нее:


if ($_POST['session']) {
session_write_close(); //если сессия уже стартовала ранее
session_id($_POST['session']);
session_start();
}

Вот теперь ваши обработчики будут видить сессию.

Categories: Новости Tags: