Перенос скриптов с PHP 5.х на PHP 7.x

Чаще всего, основная проблема при переносе заключается в отсутствии в PHP 7.x модуля mysql, вместо него предлагается использовать mysqli. Однако если код достаточно обьемный, то перелопатить его чтобы адаптировать к новой версии PHP достаточно сложно и не всегда возможно. Однако есть выход: можно «эмулировать» устаревший код. Например эмуляция модуля mysql возможна следующим скриптом (достаточно его в код в виде include_once ‘mysql.php’) :

<?php
function mysql_connect($server,$username,$password,$new_link,$client_flags) {
  $GLOBALS['mysql_oldstyle_link']=mysqli_connect($server,$username,$password);
  return $GLOBALS['mysql_oldstyle_link'];
}

function mysql_query($sql) {
  return mysqli_query($GLOBALS['mysql_oldstyle_link'],$sql);
}

function mysql_fetch_row($res) {
  return mysqli_fetch_row($res);
}

function mysql_fetch_assoc($res) {
  return mysqli_fetch_assoc($res);
}

function mysql_fetch_array($res) {
  return mysqli_fetch_array($res);
}

function mysql_fetch_object($res) {
  return mysqli_fetch_object($res);
}

function mysql_affected_rows($link=NULL) {
  if ($link===NULL) $link=$GLOBALS['mysql_oldstyle_link'];
  return mysqli_affected_rows($link);
}

function mysql_insert_id($link=NULL) {
  if ($link===NULL) $link=$GLOBALS['mysql_oldstyle_link'];
  return mysqli_insert_id ($link);
}

function mysql_select_db($database_name) {
  return mysqli_select_db($GLOBALS['mysql_oldstyle_link'],$database_name);
}

function mysql_errno($link=NULL) {
  if ($link===NULL) $link=$GLOBALS['mysql_oldstyle_link'];
  return mysqli_errno($link);
}

function mysql_error($link=NULL) {
  if ($link===NULL) $link=$GLOBALS['mysql_oldstyle_link'];
  return mysqli_error($link);
}

function mysql_num_rows($res) {
  return mysqli_num_rows($res);
}

function mysql_free_result($res) {
  return mysqli_free_result($res);
}

function mysql_close($link) {
  return mysqli_close($link);
}

function mysql_real_escape_string($sql,$link=NULL) {
  if ($link===NULL) $link=$GLOBALS['mysql_oldstyle_link'];
  return mysqli_real_escape_string($link,$sql);
}

function mysql_get_server_info($link=NULL) {
  if ($link===NULL) $link=$GLOBALS['mysql_oldstyle_link'];
  return mysqli_get_server_info($link);
}

Чтиво за последнее время

Взрослое:

Сергей Вишневский. «Две редиски на ракете: WTF». Их трое: русский, украинец и Белорус. Заморожены. Попали в будущее. Строят новую жизнь. Интересно, с юмором. (+)

Михаил Усачев: «Сокрытый легион» 1-3 (Сейчас пишется книга 4, не забуду так потом прочитаю тоже). Жанр: РПГ. В принципе сюжет почти классический: некая сверхцивилизация вовлекает человеческую рассу в игру.  (+)

Дан Лебэл: «Репродукты Хаоса»,»Класс Сталкер». Жанр РПГ. Некая сверхцивилизация вовлекает человеческую рассу в игру..бла..бла..бла. Но в целом интересно (+)

Александр Владимирович Цепицин: «Подлунный мир». Вологжанин! попадает в другое измерение. Где русалки, драконы и прочие твари. Конечно всех побеждает, женится на всех в подряд и т.д. (+/-)

Владимир Генадиевич Поселягин: «Зург 1-7». Валентин после крушения самолета очнулся в теле мальчика в будущем. И понеслось. Прокачка, нейросети, цель стать императором. (+)

Детское:

Галина Смирнова: «Максимка, Толик и каляки-маляки». Много рассказов в одной книге для детей 1-3 класса. Некоторые веселые. Некоторые грустные. Эти рассказы заставят задуматься ребенка. (+)

Павел Шрут: «Носкоеды». Не задавались вопросом куда деваются носки? А вот куда — рядом с нами живут разумные носкоеды. (+)

Аслан Аскарович Черубаев: «Приключения Олжиа и Вовки». Несколько приключений из жизни закадычных друзей. (+)

 

Передать сообщение другому пользователю в консоль

Век живи — век учись (с) Не я конечно знал, что что-то такое должно быть, но просто не пользовался — не нужно было. Так вот, для того чтобы отправить сообщение другому пользователю зашедшему в консоль, достаточно выполнить что-то вроде:

write petya pts/3

А, потом нажать Enter и начать вводить текст. Его сразу же будет видеть пользователь petya у себя в консоли. Номер терминала можно увидеть по команде w

 

INSERT / UPDATE в MySQL на Python

Ну в принципе и не на Python, важен принцип. Что мне нужно? Если UPDATE завершился ошибкой (данные не обновлены т.к. их нет), тогда INSERT. Вообще в MYSQL есть специальная команда — REPLACE, у которой синтаксис такой-же как у INSERT, за исключением того, что если такая запись уже есть, то она просто измениться. Одно НО. Таблица обязательно должна содержать колонки с UNIQUE. А если их нет, и добавить нельзя? Тогда к сожалению придется «отлавливать» результат выполнения UPDATE — а именно количество изменившихся записей. Если 0 — считаем что такой записи вообще нет, и вставляем. На Python нечто подобное реализовать можно вот так:

sql="update device_status set param_value=0,stamp=now() where param_name='Uptime' and device_id="+str(device_id);   
 func.putlog("---обновляю статус свича в биллинге ")    
 cursor2 = connb2.cursor()
 func.putlog("----SQL:"+sql)    
 try:
  cursor2.execute(sql);
  connb2.commit();
  print (format(cursor2.rowcount))
  if format(cursor2.rowcount)=="0":
    func.putlog("---- новый свич, добавляем данные в таблицу..");
    sql="INSERT into device_status (record_id,device_id,port_id,param_name,param_value,stamp) values (null,"+str(device_id)+",null,'Uptime',UNIX_TIMESTAMP(),now())";
    cursor2.execute(sql);
    connb2.commit();  
    sql="INSERT into device_status (record_id,device_id,port_id,param_name,param_value,stamp) values (null,"+str(device_id)+",null,'State',2,now())";
    cursor2.execute(sql);
    connb2.commit();

1С Дополнительные реквизиты на форме при помощи расширения

В своей работе с 1С стараюсь сделать так, чтобы обновления проходили максимально безболезненно. Для этого нужно сохранять не изменяемость конфигурации. В настоящий момент, при помощи «расширений» конфигурации, многие вещи достаточно легко сделать основную конфигурацию не трогая вообще. Ниже рассмотрю, как я сделал задачу по добавлению значения «Покупка с сайта» в документе «Реализация товаров».

1) Выносим в расширение документ документ «Реализация товаров и добавляем реквизит «ПокупкаССайта» в реквизиты формы. Да! именно в реквизиты формы, а не документа. В настоящий момент платформа 1С не дает добавлять в расширения реквизиты документа (но обещают). Перетаскиваем реквизит в элементы и обязательно ставим галочку на «АктивизироватьПоУмолчанию» — иначе на форме при запуске не отобразится:

2) Следующая задача — сделать сохранение значения данного реквизита с привязкой к документы. Самое удобное — хранить значение в специально предназначенном для этого регистре ДополнительныеРеквизитыИСведения. В нём два измерения: обьект и Свойство. Обьект в нашем случае — это документ Реализации, а свойство нужно задать в ПланеВидовХарактеристик.ДополнительныеРеквизитыИСведения. Например так:

  

И далее создадим обработчики открытия формы и закрытия в которых реализуем чтение из регистра и запись в этот регистр:

&НаСервере
Функция ЗаписатьЗначениеПокупкиССайта(параметр)	
		МенеджерЗаписи = РегистрыСведений.ДополнительныеСведения.СоздатьМенеджерЗаписи();
		МенеджерЗаписи.Объект = объект.Ссылка;
		МенеджерЗаписи.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Продажа с сайта");		
		МенеджерЗаписи.Значение=параметр;
		МенеджерЗаписи.Записать();	
конецфункции

&НаСервере
Функция ПолучитьЗначениеГалочки();
	зн=РегистрыСведений.ДополнительныеСведения.СоздатьНаборЗаписей();
	отбор=зн.Отбор;
	отбор.Объект.Установить(объект.Ссылка);
	отбор.Свойство.Установить(ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Продажа с сайта"));		
	зн.Прочитать();	
	галочка=ложь;
	для каждого стр из зн   цикл
		галочка=стр.Значение;
	конеццикла;
	возврат галочка;
КонецФункции  	
&НаКлиенте
Процедура Расш1_ПровестиИзФормыПосле(Команда)
ЗаписатьЗначениеПокупкиССайта(этаформа.ПокупкаССайта);
КонецПроцедуры

&НаКлиенте
Процедура Расш1_ПровестиИЗакрытьИзФормыПосле(Команда)
	Расш1_ПровестиИзФормыПосле(Команда);
КонецПроцедуры

&НаКлиенте
Процедура Расш1_ПриОткрытииПосле(Отказ)
	этаформа.ПокупкаССайта=ПолучитьЗначениеГалочки();
КонецПроцедуры