Числа с фиксированной точкой в базах данных MySQL

Опубликовано: 14.08.2017

видео Числа с фиксированной точкой в базах данных MySQL

Курс по SQL. Естественное или натуральное объединение таблиц в SQL и БД: SELECT NATURAL JOIN

Итак, у вас есть старенький, но уж очень милый сердечку веб-сайт, который вы решаетесь из жалости (либо, может быть, перечитав Хабра) перевести на PHP7. С волнением ждя резкого роста производительности, вы смахиваете пыль с бедного веб-сайта и решительно переключаете в панели управления хостингом версию PHP.



Если веб-сайт уже издавна не молод, то с большой толикой вероятности волшебство не произойдет. В наилучшем случае начнут появляться различного рода ошибки, а в худшем  — вы увидите белоснежный экран, дзен веб-разработки. В этот момент охото по-быстрому переключить все назад и запамятовать о собственной неожиданной беспомощности.


Урок 14. Работа с БД Выборка данных Часть 2

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

Настроим ведение журнальчика ошибок PHP в файл .htaccess (если он не был настроен ранее):

php_value display_errors
php_value log_errors 1
php_value error_log /home/vasya/domains/mysite.ru/logs/error.log


How to use BindingSource and BindingNavigator

Тщательно о ведении журналов мы уже писали в нашем блоге ранее.

Допустим, веб-сайт употребляет базы данных, и вы видите ошибки вроде таковой:

Fatal error: Uncaught Error: Call to undefined function mysql_connect()

Это оттого, что в современных версиях PHP (начиная с PHP 5.5.0) оригинальное расширение MySQL не поддерживается. Разработчики советуют использовать MySQLi либо PDO. Попробуем перейти на MySQLi, это просто:

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

$link = mysql_connect(‘localhost’, $user, $password)
mysql_select_db($dbname, $link)
mysql_query(‘set names cp1251’)

можно поменять на:

$link = mysqli_connect(‘localhost’, $user, $password, $dbname)
mysqli_query($link, ‘set names cp1251’)

для запросов:

$result=mysql_query($query,$cid)

поменять на:

$result=mysqli_query($cid, $query)

Другие пользующиеся популярностью функции просто изменяются на их аналоги с буковкой ‘i’:

mysqli_fetch_array()
mysqli_fetch_row()
mysqli_fetch_assoc()
mysqli_fetch_array()
mysqli_num_rows()
mysqli_insert_id()
mysqli_close()

В итоге этих легких действий данные из БД должны удачно собираться и отчаливать.

Реальный олдскул — это веб-сайт в CP1251 (как минимум). Всё перевоплотился в  ромбики либо остальные козяблики?

Вероятнее всего, довольно будет указать шифровку в .htaccess таким макаром:

php_value default_charset «cp1251»

Также вы сможете следить ошибки последующего рода:

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead

Это значит, что модификатор /e, который позволял передать случайной функции итог постоянного выражения, сейчас не поддерживается. В таких случаях рекомендуется использовать функцию preg_replace_callback

Допустим, у нас есть такое постоянное выражение:

$string=preg_replace(«/:([a-z]{1,10}):/e», «print_smile(‘\\1’)», $string)

с подменой на preg_replace_callback оно должно смотреться вот так:

$string=preg_replace_callback(«/:([a-z]{1,10}):/», create_function(‘$matches’, ‘return print_smile($matches[1])’), $string)

тут все очень просто, постоянное выражение сейчас указывается в качестве первого аргумента (без модификатора /e, очевидно), а в качестве второго аргумента указывается анонимная функция (которая будет выполнена после внедрения постоянного выражения) с 2-мя аргументами: массив $matches, где будут сохранены данные, совпадающие с постоянным выражением и вызов наружной функции с аргументами. В данном примере наружняя функция именуется print_smile и ей передается аргументом 1-ое отысканное вхождение. То, что в preg_replace было \\1 (1-ое отысканное вхождение) станет $matches[1] (если аргументов было больше, то будет $matches[2], $matches[3] и т.д.).

Вот очередной пример, посложнее:

Было так:

$out=preg_replace(«/<[Rr][Mm]( [Mm][Ss][Gg]=[\’\»]{0,1}|)(.*?)([\’\»]{0,1})>(.*?)<\/[Rr][Mm]>/es», «feed_out_sub_rm(‘\\2′,’$base_prefix’,’$nick’,’$id_entry’)», $out)

Стало вот так:

$out=preg_replace_callback(‘/<[Rr][Mm]( [Mm][Ss][Gg]=[\’\»]{0,1}|)(.*?)([\’\»]{0,1})>(.*?)<\/[Rr][Mm]>/s’, create_function(‘$matches’, ‘return feed_out_sub_rm($matches[2], «‘.$base_prefix.'», «‘.$nick.'», «‘.$id_entry.'»)    ‘), $out)

тут просто запутаться в кавычках, будьте внимательны.

Копаясь в постоянных выражениях, можно вспомнить еще про две функции, которые с версии PHP 5.3.0 числятся устаревшими (и не поддерживаются). Симптомы последующие:

Fatal error: Uncaught Error: Call to undefined function ereg_replace()

Если постоянное выражение в ereg_replace обычное, то возможно обойтись просто установкой граничных знаков, как тут:

$str=ereg_replace(«[\r\t\n]»,»»,$str)
$str=preg_replace(«/[\r\t\n]/»,»»,$str)

Аналогичный симптом:

Fatal error: Uncaught Error: Call to undefined function split()

Было:

$var_pair=split(«=»,$tmp[3])

Стало:

$var_pair=explode(«=»,$tmp[3])

Если постоянное выражение посложнее, то пробуем конвертировать к preg_split.

На этом пока все. Успешной отладки.
Много нужных материалов по теме можно отыскать на веб-сайте разработчиков.

Если что-то не выходит, либо ваш случай совершенно не похож на наши примеры — пишите комменты, попробуем разобраться совместно.

Для того, чтоб оставлять комменты к посту, авторизуйтесь, используя собственный акк в соц сетях ВКонтакте/FaceBook, либо акк в Гугл/Yandex. ндекс.

rss