Discussion:
wfido
(слишком старое сообщение для ответа)
Sergey Anohin
2019-01-03 16:20:12 UTC
Permalink
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
2019-01-04 07:08:48 UTC
Permalink
Доброе (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
2019-01-04 12:07:36 UTC
Permalink
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;
}
}


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

С наилучшими пожеланиями, Sergey Anohin.
Anton Poletayev
2019-01-05 04:04:30 UTC
Permalink
Зд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
Sergey Anohin
2019-01-05 10:39:39 UTC
Permalink
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 все перепилить, пока не знаю что
лучше

С наилучшими пожеланиями, Sergey Anohin.
Anton Poletayev
2019-01-05 17:26:38 UTC
Permalink
Зд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
2019-01-06 15:30:34 UTC
Permalink
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.
Anton Poletayev
2019-01-08 16:24:48 UTC
Permalink
Зд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
2019-01-08 16:53:52 UTC
Permalink
Hello, Anton!

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

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

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

Best Regards, Nil
Anton Poletayev
2019-01-09 03:48:04 UTC
Permalink
Зд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
2019-01-09 10:11:39 UTC
Permalink
Hello, Nil!

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

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

С наилучшими пожеланиями, Sergey Anohin.
Anton Poletayev
2019-01-11 12:07:06 UTC
Permalink
Здpавствуй, Sergey!

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

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

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

С уважением - Anton
Oleg Redut
2019-01-10 20:33:24 UTC
Permalink
Доброе (current) время суток, Nil!

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

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

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

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

... AKA oleg(&)redut.info AKA ICQ 28852595
Sergey Anohin
2019-01-08 19:09:57 UTC
Permalink
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 по коду написано
:)

С наилучшими пожеланиями, Sergey Anohin.
Anton Poletayev
2019-01-11 16:32:06 UTC
Permalink
Зд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
2019-01-11 19:35:24 UTC
Permalink
Hello, Anton!

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

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

С наилучшими пожеланиями, Sergey Anohin.
Anton Poletayev
2019-01-12 06:22:40 UTC
Permalink
Зд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

Oleg Redut
2019-01-05 11:51:18 UTC
Permalink
Доброе (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;


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

... AKA oleg(&)redut.info AKA ICQ 28852595
Sergey Anohin
2019-01-05 11:24:07 UTC
Permalink
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.
Loading...