powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Нужна критика кода. MySQL+PHP
17 сообщений из 17, страница 1 из 1
Нужна критика кода. MySQL+PHP
    #39956574
gos-yuliya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер. Хотела устроиться стажером. Выслала пример кода PHP+MySQL. Добрый дядечка сказал, что все плохо и посоветовал написать сюда, чтобы покритиковали. Пишу. Очень хочу понять что не так.

<?php
echo "</p>";
} elseif ($status == "Ввод") {

$message = mysqli_real_escape_string($connection, $message);
$query = mysqli_prepare($connection, 'SELECT * FROM my_blog '
. 'WHERE title = ? AND message = ?');
$query->bind_param('ss', $title, $message);
$query->execute();
$row = $query->num_rows;
$query->close();
if (($row) == 0) {
$query = mysqli_prepare($connection, 'INSERT IGNORE '
. 'INTO my_rubric VALUES (NULL,?)');
$query->bind_param('s', $rubric);
$query->execute();
$query = mysqli_prepare($connection, 'INSERT IGNORE '
. 'INTO rubric_small VALUES (NULL,?,(SELECT '
. 'id FROM my_rubric WHERE rubric_name = ?))');
$query->bind_param('ss', $link, $rubric);
$query->execute();
$query = mysqli_prepare($connection, 'INSERT INTO '
. 'my_blog VALUES (NULL, now(),?,?, (SELECT id FROM '
. 'my_rubric WHERE rubric_name = ?), (SELECT '
. 'id FROM rubric_small WHERE rubric_small_name = ?))');
$query->bind_param('ssss', $title, $message,
$rubric, $link);
$query->execute();
$query->close();
$connection->close();
} else {
echo "Данное сообщение уже есть в базе!";
}
$status = "";
$title = "";
$message = "";
$rubric = "";
$link = "";
}
?>
...
Рейтинг: 0 / 0
Нужна критика кода. MySQL+PHP
    #39956580
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gos-yuliya,

Тут подфорум по MySQL, поэтому публикуйте, пожалуйста, код для MySQL. Т.е. DDL таблиц, интересующие Вас запросы, их логику и, собственно, задачу. И для кода есть специальный тег SRC, используйте его, пожалуйста.

В текущем виде, даже если это я перенесу в подформ по PHP, вряд ли там обрадуются.
...
Рейтинг: 0 / 0
Нужна критика кода. MySQL+PHP
    #39956600
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читаемость текста запросов просто ужасна. Не обязательно вытягивать их в одну строчку для мускуля и уж совсем не надо дербанить как попало для кода. Можно просто написать аккуратно в несколько строк, используя отступы для выделения структурных блоков, типа так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
INSERT IGNORE INTO 
    `rubric_small` 
VALUES (
    NULL,
    ?,
    (
        SELECT
            `id`
        FROM 
            `my_rubric`
        WHERE
            `rubric_name` = ?
    )
)



gos-yuliya
$query = mysqli_prepare($connection, 'SELECT * FROM my_blog '
. 'WHERE title = ? AND message = ?');
$query->bind_param('ss', $title, $message);
$query->execute();
$row = $query->num_rows;
$query->close();
Нафига вся эта "*", если она нигде не используется? Написать туда скромненькую единичку - и можно точно так же отличить ноль строк от ненулевого значения. Впрочем, чаще используют COUNT() - тогда в результате будет гарантировано одна строка вместо гипотетически возможных 100500. Но придется поправить еще в другом месте.
Впрочем, если стоить задача проверки уникальности, а $message имеет преимущественно размерчик более нескольких десятков или сотен байт, тогда, возможно, для обеспечения/проверки уникальности проще использовать его хеш с гарантировано небольшой длиной. Вариант с INSERT IGNORE и https://www.php.net/manual/ru/mysqli-stmt.affected-rows.php для такого случая тоже вполне ничего.

gos-yuliya
$query = mysqli_prepare($connection, 'INSERT IGNORE '
. 'INTO my_rubric VALUES (NULL,?)');
$query->bind_param('s', $rubric);
$query->execute();
$query = mysqli_prepare($connection, 'INSERT IGNORE '
. 'INTO rubric_small VALUES (NULL,?,(SELECT '
. 'id FROM my_rubric WHERE rubric_name = ?))');
$query->bind_param('ss', $link, $rubric);
$query->execute();
$query = mysqli_prepare($connection, 'INSERT INTO '
. 'my_blog VALUES (NULL, now(),?,?, (SELECT id FROM '
. 'my_rubric WHERE rubric_name = ?), (SELECT '
. 'id FROM rubric_small WHERE rubric_small_name = ?))');
Слишком часто повторяется выделенный цветом запрос с одним и тем же значением параметра. Можно и один раз спросить. А для случая новой строки можно и совсем не спрашивать, есть https://www.php.net/manual/ru/mysqli-stmt.insert-id.php

miksoft
вряд ли там обрадуются
Ага, такого добра там и так хватает. Последнее время так и вовсе скриншотами выражовываться стали...
...
Рейтинг: 0 / 0
Нужна критика кода. MySQL+PHP
    #39956601
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gos-yuliya,
Раз тут форум по mySQL, поговорим про запросы.
1) SELECT со звездочкой:
Код: sql
1.
SELECT * FROM my_blog WHERE title = ? AND message = ?

Звездочку в SELECT надо использовать чуть менее чем никогда.

2) Я предполагаю, что вы используете в запросе сравнение текстовых полей с текстовыми значениями, чтобы получить ID:
Код: sql
1.
2.
3.
WHERE title = ? AND message = ?
SELECT id FROM my_rubric WHERE rubric_name = ?
SELECT id FROM rubric_small WHERE rubric_small_name = ?

Я не знаю, как там у PHP-шников принято, но вообще ID записи у вас уже должен быть к моменту вставки. То, что вы получаете ID, сравнивая текстовые поля, пусть даже они у вас проиндексированы, плохой стиль. Если вы подобную технику перенесете на что-то более серьезное и масштабное, то рискуете получить отключение вашего сервера БД за превышение отпущенного лимита процессорного времени.
3) То есть исходя из п.2 у вас архитектурная ошибка. Как ваш код отреагирует на то, что названия рубрик и заголовков (или что у вас там? в принципе, неважно) поменяются? Что если их отредактирует пользователь, модератор или админ в момент выполнения кода? Если движком пользуются полтора человека, то вероятность этого низка. А если 1000 и практически одновременно? Кто-то потеряет свои данные? Появятся несогласованные записи? Что-нибудь еще?
...
Рейтинг: 0 / 0
Нужна критика кода. MySQL+PHP
    #39956603
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл добавить:
4) Первым запросом вы определяете количество строк. Для этого достаточно запроса вида
Код: sql
1.
SELECT COUNT(1) FROM my_blog WHERE title = ? AND message = ?

сервер вам вернет это значение сам, не надо тащить на клиента все (!) поля и записи. Кстати, в этом запросе тоже сравнение текстовых значений.

К сожалению, добрый дядечка прав.
...
Рейтинг: 0 / 0
Нужна критика кода. MySQL+PHP
    #39956606
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluck99
но вообще ID записи у вас уже должен быть к моменту вставки.
Если ID из той же таблицы, куда происходит вставка, то не обязательно. Есть же LAST_INSERT_ID().
...
Рейтинг: 0 / 0
Нужна критика кода. MySQL+PHP
    #39956609
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft
Gluck99
но вообще ID записи у вас уже должен быть к моменту вставки.
Если ID из той же таблицы, куда происходит вставка, то не обязательно. Есть же LAST_INSERT_ID().
1) Это очевидно, но до LAST_INSERT_ID мы еще просто не добрались, не на том уровне понимания находимся.
2) У автора вставка в другую таблицу происходит, а не в ту же самую. Там обычное one-to-many. Сообщения (message) входят в рубрику (rubric). Как-то так. По идее, там должен быть еще заголовок (title) в отдельной таблице между ними. А у автора он по ходу просто в текстовом поле сообщения, т.е. повторяется от записи к записи. 8-) Впрочем, не знаю, как там должно быть, может так и правильно, если title - это заголовок конкретного сообщения, а не топика.
...
Рейтинг: 0 / 0
Нужна критика кода. MySQL+PHP
    #39956621
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gos-yuliya,
Мешанина из вёрстки, логики работы и запросов. Самому не надоело копипастить все эти $query = $mysqli_prepare ?
...
Рейтинг: 0 / 0
Нужна критика кода. MySQL+PHP
    #39956652
gos-yuliya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, поняла, спасибо.
...
Рейтинг: 0 / 0
Нужна критика кода. MySQL+PHP
    #39956654
gos-yuliya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
INSERT IGNORE INTO
`rubric_small`
VALUES (
NULL,
?,
(
SELECT
`id`
FROM
`my_rubric`
WHERE
`rubric_name` = ?

Спасибо. Так действительно удобнее)
...
Рейтинг: 0 / 0
Нужна критика кода. MySQL+PHP
    #39956658
gos-yuliya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gluck99, спасибо. Что-то про
Код: plsql
1.
COUNT

я и забыла.

Понимаю, что добрый дядечка прав, поэтому и добрый, поэтому и, следуя его совету, прошу критики кода здесь.
...
Рейтинг: 0 / 0
Нужна критика кода. MySQL+PHP
    #39956659
gos-yuliya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster, это не копипаст. Я изучаю теорию по книгам, если что-то не понятно, что читаю мануалы и ищу ответы на форумах и в блогах. Но, к сожалению информации так много и она настолько неструктурирована и разнообразна, что достойно изучать языки не получается. Я не оправдываюсь, а констатирую факт. Никогда не участвовала в такого рода форумах, но сейчас понимаю, что пришла к тому, что не понимаю. КАК? Как достойно писать код? Где брать информацию, которая не запутает, а поможет разобраться? Хотела даже попробовать позаниматься на Яндекс.Практикум, но, честно говоря, дорого, да и где гарантия, что там все будет ясно-понятно? Думала, что выходом будет устроиться стажером и посмотреть, как пишут код программисты со стажем, но и для этого нужен опыт))
...
Рейтинг: 0 / 0
Нужна критика кода. MySQL+PHP
    #39956661
gos-yuliya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle, не поняла, как можно спросить один раз. Это данные, которые внесены в поле ввода. Или надо спросить один раз вначале, присвоить переменной, а потом переменную вставлять в запрос?
...
Рейтинг: 0 / 0
Нужна критика кода. MySQL+PHP
    #39956683
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gos-yuliya,

Надо интерполировать то, как код будет выглядеть в перспективе. Достаточно просто представить, что в вашем примере не 36 строк, а 36000 и вам надо что-то там СЕЙЧАС, БЫСТРО найти и поправить. С опытом это, конечно, приходит, но лучше не иметь такой опыт. Женщины в работе обычно более пунктуальны и трудолюбивы, но тут надо научиться быть ленивым. Лень набирать лишний код - оформил его в функцию. Лень писать запросы прицепил орм (если уместно) или сделал конструктор запросов. Лень писать 10 раз одно и тоже, присобачил рефлексию.

А сейчас научу плохому.
Код: php
1.
2.
3.
4.
5.
6.
$query = mysqli_prepare($connection, 'SELECT * FROM my_blog '
. 'WHERE title = ? AND message = ?');
$query->bind_param('ss', $title, $message);
$query->execute();
$row = $query->num_rows;
$query->close();



Вот это, например, можно оформить, как
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
function getQuery($sql, $retfunc, ...$args) {
    //выносим всё сюда.
    $query = mysqli_prepare($connection, $sql);
    $query->bind_param(...$args);
    $query->execute();
    //данные нужны разные, в нашем случае это взятие числа колонок.
    //В пхп функции можно вызывать просто по имени (строке)
    //мы этим и воспользуемся. В $retfunc будет передаваться строка с 
    //названием функции, которая обрабатывает $query и возвращает что надо.
    if ($retfunc) return $retfunc($query);
    //если ничего нет, закрываем запрос.
    $query->close();
}

//Функция, возвращающая число строк 
//Сделал для примера,так делать не надо, надо вбирать count(*) и читать одну строку
//если сильно хочется узнать именно число записей
function numrows($query) {
    $ret = $query->num_rows;
    $query->close();
    return ret;
}


//Обёртка, чтобы не передавать "numrows" везде.
function selectNumRows($sql, ...$args) {
//$args - произвольное число аргументов. Внутри функции доступно в виде массива.
//Можно передавать дальше таким же образом
    return getQuery($sql, "numrows", ...$args);
}

function callSql($sql, ...$args) {
    return getQuery($sql, false, ...$args);
}


//аналог кода из начального поста
$message = mysqli_real_escape_string($connection, $message);
$row = selectNumRows('SELECT * FROM my_blog WHERE title = ? AND message = ?', 'ss', $title, $message);
if ($row == 0) {
    callSql('INSERT IGNORE INTO my_rubric VALUES (NULL,?)', 's', $rubric);
    callSql('INSERT IGNORE INTO rubric_small VALUES (NULL,?,(SELECT id FROM my_rubric WHERE rubric_name = ?))',
                'ss', $link, $rubric);
    callSql('INSERT INTO '
              . 'my_blog VALUES (NULL, now(),?,?, (SELECT id FROM '
              . 'my_rubric WHERE rubric_name = ?), (SELECT '
              . 'id FROM rubric_small WHERE rubric_small_name = ?))',
              'ssss', $title, $message, $rubric, $link); 
     $connection->close();
} else { //... 
}


//...и т.д.


//Как-то так. Потом надо будет избавиться от мешанины, вынести sql в отдельный модуль,
//или присобачить какую-нибудь орм, но это потом. Главное сейчас научиться владеть языком.


//За синтаксическую правильность кода не ручаюсь, на пхп давно не писал.



Ссылки
https://www.php.net/manual/ru/functions.variable-functions.php
https://www.php.net/manual/ru/functions.arguments.php
...
Рейтинг: 0 / 0
Нужна критика кода. MySQL+PHP
    #39956714
gos-yuliya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster, поняла. Спасибо огромное. Мне так и сказал дядечка, что я не слишком ленива для программиста, пишу много кода, спрашивать у него что это значит, я не решилась))). Вы повторили его слова, да еще и разъяснили. Теперь хоть понятно в каком направлении двигаться. Буду исправлять.
...
Рейтинг: 0 / 0
Нужна критика кода. MySQL+PHP
    #39956758
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gos-yuliya,
Вам надо заняться не тем, ЧТО писать, а КАК писать. Т.е. архитектурой. Мелкие ошибки можно исправить, SQL подучить, но если нет понимания принципиальных вещей, вы будете строить непригодные для жилья и работы небоскребы в виде сараев, как в примере выше.

Прочитайте хотя бы это:
Совершенный код , 2-е издание (мастер-класс), 2010
Стив Макконнелл

И желательно "с карандашом". Ну и всё что касается проектирования кода вообще. Начиная от правильного нейминга и заканчивая паттернами.
авторне слишком ленива для программистаЭто даже плюс в каком-то смысле, потому что такой талант можно конвертировать в хорошую производительность в будущем, если научитесь грамотно писать и сможете избежать "выгорания".
...
Рейтинг: 0 / 0
Нужна критика кода. MySQL+PHP
    #39956887
gos-yuliya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gluck99,
огромное спасибо за советы! Обязательно изучу эту книгу, понимания мне как раз таки и не хватает.

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

Спасибо еще раз.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Нужна критика кода. MySQL+PHP
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]