Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

wfido

0 views
Skip to first unread message

Sergey Anohin

unread,
Jan 3, 2019, 11:39:59 AM1/3/19
to
Hello!

Помогите плз переделать сабж на mysqli? Я не великий мастер в эхотаге :(
Пытаюсь все переделать из mysql_ на mysqli.
Это:

https://github.com/kosfango/wfido/blob/master/htdocs/lib/lib.php#L3-L7

на

function connect_to_sql($sql_host,$sql_base,$sql_user,$sql_pass){
$link = mysqli_connect($sql_host, $sql_user, $sql_pass, $sql_base) or
die();
$query = mysqli_query($link, "set names koi8r;");

}

и вот это
https://github.com/kosfango/wfido/blob/master/htdocs/lib/lib.php#L162-L166

на это

function check_password($point, $password) {
global $res;
global $row;
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
if ($point and $password) {
$res = mysqli_query($link, "SELECT * from `users` WHERE point='$point' and
password='$password' and active='1';");
$row = mysqli_num_rows($res);
return;
}
}

Везде где было mysql_ переименовал на mysqli, mysql_connect на
mysqli_connect($link, <запрос>)

В итоге на тестовой версии пробую:

Warning: mysqli_query() expects parameter 1 to be mysqli, null given in
/usr/local/www/wfido-x/lib/lib.php on line 168
Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, null given
in /usr/local/www/wfido-x/lib/lib.php on line 169


Видимо из базы не может достать что нужно, не прокатил фикс по-быстрому :(




С наилучшими пожеланиями, Sergey Anohin.

Oleg Redut

unread,
Jan 3, 2019, 10:14:58 PM1/3/19
to
Доброе (current) время суток, Sergey!

SA> function connect_to_sql($sql_host,$sql_base,$sql_user,$sql_pass){
SA> $link = mysqli_connect($sql_host, $sql_user, $sql_pass,
SA> $sql_base) or die();
SA> $query = mysqli_query($link, "set names koi8r;");

SA> }

SA> и вот это
SA> https://github.com/kosfango/wfido/blob/master/htdocs/lib/lib.php#L162-
SA> L166

SA> на это

SA> function check_password($point, $password) {
SA> global $res;
SA> global $row;

[...]

SA> Видимо из базы не может достать что нужно, не прокатил фикс
SA> по-быстрому :(

Может $link тоже сделать global?

Что я могу еще сказать?..
Oleg

... AKA oleg(&)redut.info AKA ICQ 28852595

Sergey Anohin

unread,
Jan 4, 2019, 7:19:59 AM1/4/19
to
Hello, Oleg!


SA>> Видимо из базы не может достать что нужно, не прокатил фикс
SA>> по-быстрому :(
OR> Может $link тоже сделать global?

function connect_to_sql($sql_host,$sql_base,$sql_user,$sql_pass){
global $link;
$link = mysqli_connect($sql_host, $sql_user, $sql_pass, $sql_base) or
die();
$query = mysqli_query($link, "set names koi8r;");
return $link;
}

Попробовал так, без результата :(
Почему-то мне думается, что оно вообще не пытается из базы достать:

function check_password($point, $password) {
global $res;
global $row;
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
if ($point and $password) {
$res = mysqli_query($link, "SELECT * from `users` WHERE point='$point' and
password='$password' and active='1';");
$row = mysqli_num_rows($res);
echo '<p>MySQL Query result='.$res.' </p>';
return;
}
}


Эхо пустоту выводит. Буду копать дальше, надо выводить на экран
переменные...Пока не знаю что еще придумать

Anton Poletayev

unread,
Jan 9, 2019, 3:25:05 AM1/9/19
to
Здpавствуй, Sergey!

Пятница 04 Января 2019 15:07, ты писал(а) Oleg Redut, в сообщении по ссылке
area://ru.php?msgid=2:5034/10.1+99d9014b:

SA>>> Видимо из базы не может достать что нужно, не прокатил фикс
SA>>> по-быстрому :(
OR>> Может $link тоже сделать global?

Да

SA> function connect_to_sql($sql_host,$sql_base,$sql_user,$sql_pass){
SA> global $link;
SA> $link = mysqli_connect($sql_host, $sql_user, $sql_pass,
SA> $sql_base) or die();
SA> $query = mysqli_query($link, "set names koi8r;");
SA> return $link;
SA> }

SA> Попробовал так, без результата :(
SA> Почему-то мне думается, что оно вообще не пытается из базы достать:

1. Используйте объектно-ориентированный стиль
Example #1 mysqli::query() example
(Object oriented style)
http://php.net/manual/en/mysqli.query.php

Им гораздо проще работать, чем процедурно.

2. Для рефакторинга пахучего ядреного легаси я использую небольшую обертку,
содержащую класс-враппер Query и функции-хелперы, query() и database().
(могу поделиться, но это несложно и самому написать)

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

В итоге, такой рефакторинг будет выглядеть примерно так:

function check_password($point, $password)
{
// ...

$users = query("SELECT * FROM `users` WHERE point='$point' AND
password='$password' AND active='1'");

echo 'Found: ' . $users->num_rows();

// ...
}

SA> Эхо пустоту выводит. Буду копать дальше, надо выводить на экран
SA> переменные...Пока не знаю что еще придумать


С уважением - Anton

Oleg Redut

unread,
Jan 9, 2019, 3:25:07 AM1/9/19
to
Доброе (current) время суток, Sergey!

OR>> Может $link тоже сделать global?

SA> function connect_to_sql($sql_host,$sql_base,$sql_user,$sql_pass){
SA> global $link;
SA> $link = mysqli_connect($sql_host, $sql_user, $sql_pass,
SA> $sql_base) or die();
SA> $query = mysqli_query($link, "set names koi8r;");
SA> return $link;
SA> }

SA> Попробовал так, без результата :(
SA> Почему-то мне думается, что оно вообще не пытается из базы достать:

Гхм.

SA> function check_password($point, $password) {
SA> global $res;
SA> global $row;

global $link;

SA> mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
SA> if ($point and $password) {
SA> $res = mysqli_query($link, "SELECT * from `users` WHERE
SA> point='$point' and password='$password' and active='1';");
SA> $row = mysqli_num_rows($res);
SA> echo '<p>MySQL Query result='.$res.' </p>';
SA> return;
SA> }
SA> }


SA> Эхо пустоту выводит. Буду копать дальше, надо выводить на экран
SA> переменные...

var_dump($link);

SA> Пока не знаю что еще придумать

Кстати, зачем global $res;
И почему не
$row = function check_password($point, $password);
и
$row = mysqli_num_rows($res);
echo '<p>MySQL Query result='.$res.' </p>';
return $row;

Sergey Anohin

unread,
Jan 9, 2019, 3:25:09 AM1/9/19
to
Hello, Anton!

AP> 1. Используйте объектно-ориентированный стиль
AP> Example #1 mysqli::query() example
AP> (Object oriented style)
AP> http://php.net/manual/en/mysqli.query.php
AP> Им гораздо проще работать, чем процедурно.
AP> 2. Для рефакторинга пахучего ядреного легаси я использую небольшую
AP> обертку,
AP> содержащую класс-враппер Query и функции-хелперы, query() и database().
AP> (могу поделиться, но это несложно и самому написать)

ну типа все текущие mysqli_ разбросанные по коду, заменить на функции, и
описать их где-то, типа так проще в эксплуатации,
если я так понимаю?

AP> Это позволяет не таскать за собой соединение без нужды
AP> и достаточно просто переписать все вызовы
AP> (если повезет, мы делаем это регекспами сразу по всему коду
AP> и потом просто просматриваем его на предмет доработки напильником)

я sed-ом по старинке переименовывал

AP> В итоге, такой рефакторинг будет выглядеть примерно так:
AP> function check_password($point, $password)
AP> {
AP> // ...
AP> $users = query("SELECT * FROM `users` WHERE point='$point' AND
AP> password='$password' AND active='1'");
AP> echo 'Found: ' . $users->num_rows();
AP> // ...
AP> }

надо пробовать, вообще есть вариант в PDO все перепилить, пока не знаю что
лучше

Oleg Redut

unread,
Jan 9, 2019, 3:25:11 AM1/9/19
to
Доброе (current) время суток, Sergey!

SA> То есть тут заработало! Но дальше никак, подозреваю возможно везде
SA> надо пилить global $link, но это плохой способ, надо реально
SA> заворачивать все mysqli_ в промежуточные функции как-то...

По сути, если у тебя все вызовы в функциях, то во все функции надо
вставлять global. Если ты всё эти функции будешь во что-то оборачивать, то всё
равно придётся в них получать global.
Или переписывать все функции, передавая в них $link. Может это и проще.
заменить глобально все
function blabla($pass, $user) {
на
function blabla($pass, $user, $link) {
тогда оно автоматом будет внутрь попадать.

Anton Poletayev

unread,
Jan 9, 2019, 3:25:12 AM1/9/19
to
Здpавствуй, Sergey!

Суббота 05 Января 2019 13:39, ты писал(а) мне, в сообщении по ссылке
area://ru.php?msgid=2:5034/10.1+99e576e8:

SA> ну типа все текущие mysqli_ разбросанные по коду, заменить на функции,
SA> и описать их где-то, типа так проще в эксплуатации, если я так
SA> понимаю?

Да,
1. хелпер "прокалывает" видимость - он изначально живет в глобальной области.
2. оверхед сводится к минимуму, что упрощает обслуживание.
3. если завтра разрабам придет в голову заменить mysqli на какой-нибудь
koshersql,
всё что надо будет сделать - сменить адаптер у обертки.

SA> я sed-ом по старинке переименовывал

Hу или так, просто у нас правила по автоперекодированию проекта могут несколько
страниц занимать :)

AP>> В итоге, такой рефакторинг будет выглядеть примерно так:
AP>> $users = query("SELECT * FROM `users` WHERE point='$point' AND
AP>> password='$password' AND active='1'");
AP>> echo 'Found: ' . $users->num_rows();

SA> надо пробовать, вообще есть вариант в PDO все перепилить, пока не знаю
SA> что лучше

Под капотом обертки может быть и mysqli и pdo. Hо mysqli мощнее функционально.
Заменив адаптер, можно вообще с mysql на postgresql переехать, при желании.

С уважением - Anton

Sergey Anohin

unread,
Jan 9, 2019, 3:25:13 AM1/9/19
to
Hello, Oleg!

OR> var_dump($link);
SA>> Пока не знаю что еще придумать
OR> Кстати, зачем global $res;
OR> И почему не
OR> $row = function check_password($point, $password);
OR> и
OR> $row = mysqli_num_rows($res);
OR> echo '<p>MySQL Query result='.$res.' </p>';
OR> return $row;

Спасибо, прокатило, навалял такого

function check_password($point, $password) {
global $link;
echo '<p>Link next: </p>';
var_dump($link);.
echo '<p>Point='.$point.' </p>';
if ($point and $password) {
$res = mysqli_query($link, "SELECT * from `users` WHERE point='$point' and
password='$password' and active='1';");
$row = mysqli_num_rows($res);
echo '<p>res next: </p>';
var_dump($res);
echo '<p>row next: </p>';
var_dump($row);
return;
}
}


в выводе

Link next:

object(mysqli)#1 (19) { ["affected_rows"]=> int(0) ["client_info"]=> string(79)
"mysqlnd 5.0.11-dev - 20120503 - $Id: 76b08b24596e12d4553bd41fc93cccd5bac2fe7a
$" ["client_version"]=> int(50011) ["connect_errno"]=> int(0)
["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) ""
["error_list"]=> array(0) { } ["field_count"]=> int(0) ["host_info"]=>
string(25) "Localhost via UNIX socket" ["info"]=> NULL ["insert_id"]=> int(0)
["server_info"]=> string(21) "5.5.5-10.1.23-MariaDB" ["server_version"]=>
int(50505) ["stat"]=> string(148) "Uptime: 4625716 Threads: 2 Questions:
2215229 Slow queries: 15464 Opens: 2487 Flush tables: 117 Open tables: 15
Queries per second avg: 0.478" ["sqlstate"]=> string(5) "00000"
["protocol_version"]=> int(10) ["thread_id"]=> int(208791) ["warning_count"]=>
int(0) }

Point=1

res next:

object(mysqli_result)#2 (5) { ["current_field"]=> int(0) ["field_count"]=>
int(16) ["lengths"]=> NULL ["num_rows"]=> int(1) ["type"]=> int(0) }

row next:

int(1)

То есть тут заработало! Но дальше никак, подозреваю возможно везде надо пилить
global $link, но это плохой способ, надо реально заворачивать
все mysqli_ в промежуточные функции как-то...

Sergey Anohin

unread,
Jan 9, 2019, 3:30:13 AM1/9/19
to
Hello, Oleg!

SA>> То есть тут заработало! Но дальше никак, подозреваю возможно везде
SA>> надо пилить global $link, но это плохой способ, надо реально
SA>> заворачивать все mysqli_ в промежуточные функции как-то...
OR> По сути, если у тебя все вызовы в функциях, то во все функции надо
OR> вставлять global. Если ты всё эти функции будешь во что-то оборачивать, то
OR> всё равно придётся в них получать global.

не все, там по коду разбросано просто так вагон mysql_
а так все функции в основном тут:
https://github.com/kosfango/wfido/blob/master/htdocs/lib/lib.php

OR> Или переписывать все функции, передавая в них $link. Может это и проще.
OR> заменить глобально все
OR> function blabla($pass, $user) {
OR> function blabla($pass, $user, $link) {
OR> тогда оно автоматом будет внутрь попадать.

Да в этом плане напихать global $link во все функции не сложно.
Вот я и думаю все голые mysql_ завернуть в функции, там их не так и много, в
основном query, fetch_object, num_rows да,
может еще что по мелочи.

Oleg Redut

unread,
Jan 9, 2019, 3:30:14 AM1/9/19
to
Доброе (current) время суток, Sergey!

SA> Да в этом плане напихать global $link во все функции не сложно.
SA> Вот я и думаю все голые mysql_ завернуть в функции, там их не так и
SA> много, в основном query, fetch_object, num_rows да, может еще что по
SA> мелочи.

У меня в настоящий момент сделано так. Во всех скриптах, где нужна работа с
мускулам, инклюдаются конфиги.

$base_dir=$_SERVER['DOCUMENT_ROOT'];
require("$base_dir/common/config.inc");
require("$base_dir/common/opendbi.inc");
include_once './fun_mysql.php';

=== Вырезка из филе .config ===
<?php
// Database configuration
$server="localhost"; //server name
$user="tuder"; //username of your database
$pass="pass"; //password of your database
$dbname="tuder"; //database name
?>
=== Кончилась врезка ===

=== Вырезка из филе opendbi.inc ===
<?php
// Подключиться к mysql
$dbi=mysqli_connect ($server, $user, $pass, $dbiname) or die ('I cannot
connect to the database because: ' . mysqli_error($dbi));

mysqli_query($dbi, 'SET NAMES utf8');
mysqli_query($dbi, 'SET CHARACTER SET utf8');
mysqli_query($dbi, 'SET COLLATION_CONNECTION="utf8_general_ci"');
?>
=== Кончилась врезка ===

А далее примерно так в теле скрипта

=== Вырезка из филе Windows Clipboard ===
$query="SELECT `info`, CURRENT_TIMESTAMP-`time` FROM `whois` WHERE
`nick`='".$who."' LIMIT 1";
// echo $query;
$result=mysqli_query($dbi, $query); // находим нестарую информацию по юзеру
в базе
if (mysqli_num_rows($result) > 0) {
list($info, $d_time)=mysqli_fetch_row($result); // если есть - извлекаем
}
if (mysqli_num_rows($result) > 0 && $d_time <=172800*4 ) { // 8 суток
$info=unserialize($info); // если не старая - используем
} else {
=== Кончилась врезка ===

Почему не пишу тело запроса сразу в mysqli_query - должно быть понятно. :-)
Если операция мускулом не выполняется. А при этом никаких ошибок не сообщается,
то я могу вывести на экран такой составной $query, скопировать и заюить в
пхпмиадмин напрямую, отладить и снова в ставить в код.

А вот в fun_mysql.php собраны функции требующие обработки результатов
запросов и там в каждой стоит глобал.

=== Вырезка из филе Windows Clipboard ===
function getWhoisList($t_id) {
global $dbi;
$query="SELECT whois FROM `info` WHERE t_id=".$t_id." ORDER BY whois";
$result=mysqli_query($dbi, $query);

while (list($whois)=@mysqli_fetch_row($result)) {
$whoislist[]=$whois;
}
return $whoislist; // массив
}
=== Кончилась врезка ===

Менял в своё время "mysql_" на "mysqli_" и потом "mysqli_query(" на
"mysqli_query($dbi, ". Так захватывалось практически всё.

Правда, у меня DOS Navigator.

Sergey Anohin

unread,
Jan 9, 2019, 3:30:14 AM1/9/19
to
Hello, Anton!

SA>> ну типа все текущие mysqli_ разбросанные по коду, заменить на функции,
SA>> и описать их где-то, типа так проще в эксплуатации, если я так
SA>> понимаю?
AP> Да,
AP> 1. хелпер "прокалывает" видимость - он изначально живет в глобальной
AP> области.
AP> 2. оверхед сводится к минимуму, что упрощает обслуживание.
AP> 3. если завтра разрабам придет в голову заменить mysqli на какой-нибудь
AP> koshersql,
AP> всё что надо будет сделать - сменить адаптер у обертки.

а класс зачем надо для этого пилить? чисто для удобства? можно ведь и без
класса.
ну можно конечно и класс, там вроде три стандартные функции обернуть
fetch_object, num_rows, query вроде...

AP> Под капотом обертки может быть и mysqli и pdo. Hо mysqli мощнее
AP> функционально.
AP> Заменив адаптер, можно вообще с mysql на postgresql переехать, при
AP> желании.

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

Sergey Anohin

unread,
Jan 9, 2019, 3:30:38 AM1/9/19
to
Hello, Oleg!

Попал в тупик, вот тут вызов функции:

https://github.com/kosfango/wfido/blob/master/htdocs/index.php#L35

вот она:

https://github.com/kosfango/wfido/blob/master/htdocs/lib/lib.php#L83-L122

если на выходе написать exit(Exit_done); то я вижу это в браузере, но если я
после этой
линии

https://github.com/kosfango/wfido/blob/master/htdocs/index.php#L35

поставлю эхо или var_dump то пустота, как будто вышло и застряло на выходе, но
как-то странно.
на экране пустота:

Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will
be removed in a future version. To avoid this warning set
'always_populate_raw_post_data' to '-1' in php.ini and use the php://input
stream instead. in Unknown on line 0

Warning: Cannot modify header information - headers already sent in Unknown on
line 0

Warning: Cannot modify header information - headers already sent in
/usr/local/www/wfido-x/index.php on line 1

Notice: Undefined index: mode in /usr/local/www/wfido-x/index.php on line 10

Notice: Undefined index: subject in /usr/local/www/wfido-x/index.php on line 12

Notice: Undefined index: reply in /usr/local/www/wfido-x/index.php on line 13

Notice: Undefined index: toaddr in /usr/local/www/wfido-x/index.php on line 14

Notice: Undefined index: toname in /usr/local/www/wfido-x/index.php on line 15

Notice: Undefined index: text in /usr/local/www/wfido-x/index.php on line 17

Notice: Undefined index: logout in /usr/local/www/wfido-x/index.php on line 26

Notice: Undefined index: remember in /usr/local/www/wfido-x/index.php on line
31

Warning: session_start() [function.session-start0]: Cannot send session cookie
- headers already sent in /usr/local/www/wfido-x/lib/lib.php on line 92

Warning: session_start() [function.session-start0]: Cannot send session cache
limiter - headers already sent in /usr/local/www/wfido-x/lib/lib.php on line 92

Notice: Undefined index: SESSION in /usr/local/www/wfido-x/lib/lib.php on line
93

Warning: Cannot modify header information - headers already sent in
/usr/local/www/wfido-x/lib/lib.php on line 103

Warning: Cannot modify header information - headers already sent in
/usr/local/www/wfido-x/lib/lib.php on line 122

Notice: Use of undefined constant Exit_done - assumed 'Exit_done' in
/usr/local/www/wfido-x/lib/lib.php on line 123
Exit_done

Где откопать почему пустота на экране?

Sergey Anohin

unread,
Jan 9, 2019, 3:30:41 AM1/9/19
to
Hello, Sergey!

SA> Попал в тупик, вот тут вызов функции:

сам себе отвечу, убрал это и завелось

#php_flag display_startup_errors on
#php_flag display_errors on
#php_flag html_errors on
#php_flag log_errors on
#php_flag ignore_repeated_errors off
#php_flag ignore_repeated_source off
#php_flag report_memleaks on
#php_flag track_errors on
#php_value docref_root 0
#php_value docref_ext 0
#php_value error_log /var/log/PHP_errors.log
#php_value error_reporting -1
#php_value log_errors_max_len 0

Anton Poletayev

unread,
Jan 9, 2019, 3:30:42 AM1/9/19
to
Здpавствуй, Sergey!

Воскресенье 06 Января 2019 18:30, ты писал(а) мне, в сообщении по ссылке
area://ru.php?msgid=2:5034/10.1+99f539cb:

SA> а класс зачем надо для этого пилить? чисто для удобства? можно ведь и
SA> без класса.

Можно и без классов программировать, и гвозди руками забивать. Hо, это довольно
долгий и болезненный процесс.
Для облегчения его придумали молоток.

SA> ну можно конечно и класс, там вроде три стандартные
SA> функции обернуть fetch_object, num_rows, query вроде...

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

SA> да это жестоко, синтаксис sql запросов везде свой и по коду оно
SA> напихано полно. Один фиг если базу менять, дофига переписывать все
SA> запросы

Именно поэтому люди придумали ORM (Eloquent, Doctrine, Propel, etc.)

С уважением - Anton

Nil Alexandrov

unread,
Jan 9, 2019, 3:30:43 AM1/9/19
to
Hello, Anton!

Tuesday January 08 2019 19:24, from Anton Poletayev -> Sergey Anohin:

AP> Именно поэтому люди придумали ORM (Eloquent, Doctrine, Propel, etc.)

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

Best Regards, Nil

Sergey Anohin

unread,
Jan 9, 2019, 3:30:44 AM1/9/19
to
Hello, Anton!

SA>> ну можно конечно и класс, там вроде три стандартные
SA>> функции обернуть fetch_object, num_rows, query вроде...
AP> При рефакторинге пахучего легаси можно встретить еще fetch_array,
AP> affected_rows, inserted_id.

проверил в wfido такого нет

SA>> да это жестоко, синтаксис sql запросов везде свой и по коду оно
SA>> напихано полно. Один фиг если базу менять, дофига переписывать все
SA>> запросы
AP> Именно поэтому люди придумали ORM (Eloquent, Doctrine, Propel, etc.)

там бы локализацию хоть сделать...а то русскими буквами koi8-r по коду написано
:)

Anton Poletayev

unread,
Jan 9, 2019, 3:30:48 AM1/9/19
to
Здpавствуй, Nil!

Вторник 08 Января 2019 19:53, ты писал(а) мне, в сообщении по ссылке
area://ru.php?msgid=2:5015/46+5c34d674:

AP>> Именно поэтому люди придумали ORM (Eloquent, Doctrine, Propel,
AP>> etc.)

NA> Абстракции поверх обстракций и прочего рода метапрограммирование. Вот
NA> почему мы постоянно покупаем всё новые и новые стопицот-корные
NA> мега-гигагерцовые процы с террабайтовыми памятями (уже скоро).. и всё
NA> это выполняет ровно туже функцию, что и раньше - взять
NA> переменную/строчку из одного места и засунуть её в другое :-)

Это поверхностный взгляд.

Если взять тот же Eloquent, то на деле получаем достаточно большой выигрыш по
скорости, как работы приложения, так и программирования.
ORM берёт на себя Lazy Loading и кучу рутины, плюс фреймворк и его компоненты
дают мощные средства профилирования и отладки.

В итоге количество запросов уменьшается, а качественно они не менее хорошо
сделаны, чем если писать их руками.
Для патологических случаев никто не отбирает возможность писать RAW запросы, но
в 90% случаев это не нужно.

С уважением - Anton

Sergey Anohin

unread,
Jan 9, 2019, 5:29:59 AM1/9/19
to
Hello, Nil!

NA> Абстракции поверх обстракций и прочего рода метапрограммирование. Вот
NA> почему
NA> мы постоянно покупаем всё новые и новые стопицот-корные мега-гигагерцовые
NA> процы с террабайтовыми памятями (уже скоро).. и всё это выполняет ровно
NA> туже
NA> функцию, что и раньше - взять переменную/строчку из одного места и
NA> засунуть
NA> её в другое :-)

все из-за того что гугл законодатель моды, и поэтому стало модно сбрасывать на
голову юзеров
километровые js которые проц на 100% нагружают :)

Oleg Redut

unread,
Jan 10, 2019, 9:19:58 PM1/10/19
to
Доброе (current) время суток, Nil!

AP>> Именно поэтому люди придумали ORM (Eloquent, Doctrine, Propel,
AP>> etc.)

NA> Абстракции поверх обстракций и прочего рода метапрограммирование. Вот
NA> почему мы постоянно покупаем всё новые и новые стопицот-корные
NA> мега-гигагерцовые процы с террабайтовыми памятями (уже скоро).. и всё
NA> это выполняет ровно туже функцию, что и раньше - взять
NA> переменную/строчку из одного места и засунуть её в другое :-)

Почему в фидо лайкнуть нельзя?-)
+100500

Anton Poletayev

unread,
Jan 11, 2019, 7:09:59 AM1/11/19
to
Здpавствуй, Sergey!

Среда 09 Января 2019 13:11, ты писал(а) Nil Alexandrov, в сообщении по ссылке
area://ru.php?msgid=2:5034/10.1+9a19db7b:

SA> все из-за того что гугл законодатель моды, и поэтому стало модно
SA> сбрасывать на голову юзеров километровые js которые проц на 100%
SA> нагружают :)

Это не из-за абстракций, а рукожопия и лени при компоновке пакетов.

С уважением - Anton

Anton Poletayev

unread,
Jan 11, 2019, 11:39:59 AM1/11/19
to
Здpавствуй, Sergey!

Вторник 08 Января 2019 22:09, ты писал(а) мне, в сообщении по ссылке
area://ru.php?msgid=2:5034/10.1+9a1199c1:

SA> там бы локализацию хоть сделать...а то русскими буквами koi8-r по коду
SA> написано :)

composer require illuminate/translation

И для его более простого использования позаимствуй из laravel хелперы trans и
trans_choice

С уважением - Anton

Sergey Anohin

unread,
Jan 11, 2019, 2:44:58 PM1/11/19
to
Hello, Anton!

SA>> там бы локализацию хоть сделать...а то русскими буквами koi8-r по коду
SA>> написано :)
AP> composer require illuminate/translation
AP> И для его более простого использования позаимствуй из laravel хелперы
AP> trans и trans_choice

Я думал для этого надо весь текст засунуть в переменные и из базы брать и в
зависимости от того что у юзера там за язык в базе
выставлен, такой и отображать?

Anton Poletayev

unread,
Jan 12, 2019, 1:24:59 AM1/12/19
to
Здpавствуй, Sergey!

Пятница 11 Января 2019 22:35, ты писал(а) мне, в сообщении по ссылке
area://ru.php?msgid=2:5034/10.1+9a396528:

SA>>> там бы локализацию хоть сделать...а то русскими буквами koi8-r
SA>>> по коду написано :)
AP>> composer require illuminate/translation
AP>> И для его более простого использования позаимствуй из laravel
AP>> хелперы trans и trans_choice

SA> Я думал для этого надо весь текст засунуть в переменные и из базы
SA> брать и в зависимости от того что у юзера там за язык в
SA> базе выставлен, такой и отображать?

Так и есть. Стандартно в Laravel локализация разложена по языкам и файлам с
массивами
/resources/lang/en/*
- auth.php
- pagination.php
- validation.php
и т.п.

Вот пример auth.php
<?php

return [
'failed' => 'These credentials do not match our records.',
'throttle' => 'Too many login attempts. Please try again in :seconds
'throttle' => seconds.',
];

Используется как @lang('auth.throttle') в шаблонах Blade или
trans('auth.throttle') в коде php.
Язык приложения по-умолчанию задается в конфиге, для конкретного пользователя
его можно перекрывать.

Также переменные локализации можно хранить в json и базе.

Преимущества и недостатки способов хранения:
1. массивы php
Отражается в git.
Удобен если правится только разработчиками, реализовать правку в интерфейсе
проблематично.
Скорость выборки самая высокая.

2. файлы json
В git отражается, но менее удобно из-за лишних запятых.
Можно править через интерфейс (давать переводчикам).
Скорость выборки ниже чем массивы.

3. в базе
В git ничего не едет.
Можно править через интерфейс.
Скорость выборки сомнительна (серверу БД и так работы хватает по прикладным
задачам, а тут ему еще интерфейсные запросы приезжать будут).

По личному опыту, в базе хранить локализацию я бы не стал. JSON тоже лучше, в
итоге, конвертировать в массивы.
В своей собственной CMS хранил, но это увеличивает нагрузку, данные меняются
только при разработке, а выбираются всегда.
Основную нагрузку на сервер хостинга, дает, как правило, не php, а mysql.

С уважением - Anton
0 new messages