Задать вопрос
  • Как вывести второе поле если первое пустое?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    или покороче,
    'name' => $result['short_name'] ?: $result['name'],
    Ответ написан
    1 комментарий
  • Не могу выполнить sql INSERT yii2 mssql, как правильно составить INSERT?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Селект внутри values может возвращать только одно значение. Не несколько колонок, не несколько строк, а значение одной колонки одной строки.

    В целом запрос настолько бессмысленный, что из него даже непонятно, что вы вообще хотели сделать.
    Попробуйте написать это словами.
    Ответ написан
  • Как составить логику бд и запроса?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Надо хотя бы что-то делать самому.
    Обычный inner join выберет только те продукты, который относятся к выбранной стране, и только те подкатегории, которые относятся к этим продуктам (при условии, что подкатегории как-то связаны с продукатми). Ничего "сложного" или каких-то хитрых запросов здесь не нужно.
    Вывести родительские категории чуть сложнее, но тоже надо сначала самому попытаться, а не просить чтобы написали целиком запрос.
    Ответ написан
  • Как решить проблему с созданием куки и возможные ошибки с авторизацией?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    "В F12" надо смотреть не Cookie, а вкладку Network. Все куки, которые ставит сервер, пишутся в ответе сервера на запрос.
    Именно там надо смотреть, что за куки приходят.
    И там же, в запросах браузера, смотреть - какие куки он отправляет.

    В целом код какой-то странный, в части проверок под длинным комментарием.
    получается, что при первом логине, когда $result['hash'] пустой, он должен стирать все куки.
    при этом код удаления ставит куку id, а код проверки использует куку ID

    Для начала я бы проверил работу кук без всякой авторизации, просто выставлял и проверял наличие. А потом постепенно добавлял бы код. В общем, обычная отладка.
    Ответ написан
  • Как взять все из таблицы, но с уникальным условием?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Для того, чтобы взять всё из таблицы, но с уникальным условием, надо сначала подумать.
    Над тем, от какого конкретно title мы хотим получить id
    Если исходить из того, что может быть несколько записей с одним и тем же title, у них будут разные id.
    И по этой причине надо задаться вопросом - какой именно id из этих нескольких мы хотим получить. И зачем.

    И после этого либо изменить вопрос, либо структуру базы данных.
    Ответ написан
    Комментировать
  • Что в WordPress Может блокировать отправку POST запроса?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    503 - это не блокировка, а ошибка. Надо смотреть в логах - какая именно, и исправлять
    Ответ написан
  • В чем разница object и array в json_decode()?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Массив - это массив, объект - это объект. Объект, в отличие от массива, может содержать не только данные, но и методы для работы с ними.
    Если использовать функцию json_decode(), то никаких методов не будет, только данные. То есть разницы никакой, чисто эстетическая.
    Ответ написан
    Комментировать
  • Как решит вопрос с учеткой?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Решение очевидное - выдавать каждому клиенту свой токен.
    Ответ написан
    Комментировать
  • TypeError: can only concatenate list (not "str") to list?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Скажите, что, по вашему, означают вот эти скобочки - [ и ]? Они здесь просто для красоты?
    Ответ написан
  • Какой движок с компактным билдом можно найти?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Я думаю, вопрос закроют за спам тегами, но в качестве одного из решений могу порекомендовать ассемблер. Не совсем движок, но тут уж не до жиру. Надо выбирать - или удобство, или размер дистрибутива.
    Ответ написан
    Комментировать
  • Как исправить проблему с созданием регистрации пользователей?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это всё просто ужасно. Начиная прямо с первой строчки, class Register extends Database
    Делать отдельный класс для регистрации глупо. Если уж делать класс, то для манипуляции юзером в целом, а не одной только регистрации. Плюс, регистрация пользователя - это не база данных. И не должна наследовать классу Database.
    По сути, вы хотите натянуть ООП на обычное процедурное программирование. Не надо этого делать, получится самолёт из соломы. Сделайте простую функцию.

    Но это ещё цветочки. Остальных проблем тут выше крыши:
    1. Никогда не используйте сокращённый синтаксис INSERT. Всегда надо явно перечислять поля. Это, скорее всего, и является причиной ошибки. Но даже если нет, то проблемы всё равно вылезут в будущем
    2. Собственно сообщение об ошибке нам и надо получить от базы данных, чтобы понять в чем проблема. для этого к коду соединения с БД надо добавить строчку
      mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
      и после этого смотреть сообщение об ошибке
    3. Самое главное - SQL инъекция. Какой смысл делать регистрацию вообще, если любой дурак узнает пароли всех остальных пользователей или сможет авторизоваться вообще без пароля? Запросы надо выполнять только через подготовленные выражения
    4. И по поводу паролей. Пароли надо хранить в фаршированном виде, обработанными функцией password_hash()
    Ответ написан
    Комментировать
  • Будет ли использоваться индекс в запросе вида WHERE `field1` LIKE '_aa_a_'?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Нет разницы, один или 10.
    Для простоты индекс можно рассматривать как отсортированный список.
    Если список учеников в классном журнале отсортирован по алфавиту, то вы довольно быстро найдёте нужного.
    А теперь представьте, что вы по тому же самому списку ищете фамилию, на зная первой буквы. И тут уже без разницы, сколько букв мы не знаем. И одной достаточно, чтобы полностью поломать поиск.

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

    Полнотекстовый индекс также не является чем-то особенным в этом плане. Он устроен по совершенно тупому принципу: грубо говоря, БД берёт текст из колонки, и разбивает его на слова. И строит по этим словам снова точно такой же отсортированный список, с указанием, в каких строках это слово используется. То есть когда мы делаем запрос с match, то mysql находит искомое слово в индексе, и возвращает из него все строки.

    И точно так же полнотекстовый индекс не работает, если поставить звёздочку спереди. Мануал так и говорит:
    Words match if they begin with the word preceding the * operator

    То есть звездочка работает только если поставить её в конце слова.
    match against ('класс*') найдёт слово "классный", а '*accный' его уже не найдёт.
    То есть БД тебе сразу говорит, что для такого поиска полнотекстовый индекс будет бесполезен.
    Ответ написан
    Комментировать
  • Где я могу получить код-ревью?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ответ написан
    Комментировать
  • Насколько допустимо с точки зрения стилистики вызывать Exception в конструкции if/else?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вопрос не очень понятен, особенно в части "обрабатывать" можно как через try/catch".

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

    В этом случае первый вариант однозначно предпочтительнее.
    При ловле исключения будет более сложная логика - его надо не только поймать, но и определить что это именно то, которое мы ждём. И если это какое-то другое, то перевыбросить без изменений.
    Кроме того, исключения в основном используются в исключительных, непредвиденных ситуациях. А здесь случай вполне предвиденный.

    Я бы только инвертировал условие, чтобы во-первых, сделать логику более стройной (проверили - вывалились), а во-вторых, чтобы избавиться от else и убрать лишний отступ.
    if not (isinstance(data_set, list) or isinstance(data_set, tuple)): 
        raise TypeError('argument must be list or tuple')
    return sum(data_set) / len(data_set)


    Но в целом я бы использовал другой подход.
    Если мы хотим свой собственный текст ошибки, то это явно намекает на валидацию данных с последующим информированием пользователя об ошибке.
    А чтобы сделать валидацию, исключения не нужны. Мы просто проверяем полученные данные и выдаём ошибку.

    То есть в реальном коде я бы убрал проверку из функции вообще, а проверял данные при их получении (и выводил ошибку).
    А на случай, если вдруг функция всё равно будет вызвана с неверным типом аргумента, есть системное исключение, 'type' object is not iterable
    Ответ написан
    Комментировать
  • Как в PHP быстрее и с меньшей нагрузкой на сервер вывести случайное значение сроки с 500000 шт?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Способ с инклюде - это ад кромешный. Память процесса РНР- она как бы не бесплатная. И даже если в моменте ничего не упадёт, то может потом не хватить на какую-то другую операцию. Но главное - это просто варварство, каждый раз тягать в память пол-ляма строк ради того чтобы вывести одну.
    Способ с файлами в принципе эффективен, но многие ос начинают тупить при большом количестве файлов в каталоге, придется разбивать по 500 подкаталогам. В целом гемор.
    spoiler
    И непонятно, зачем так сложно писать
    echo file_get_contents("/str/" . mt_rand (1,500000) . ".txt");

    Самый простой способ - это действительно сделать таблицу в БД, где будет два поля, число по возрастанию (первичный индекс) и собственно значение строки.
    и выбирать по первому полю через то же mt_rand (1,500000)

    Сразу отвечу на вопрос про разницу с гениальным решением через инклюде: индекс в БД будет во-первых занимать память только под первую колонку, а во-вторых, этот индекс будет храниться ровно в одном экземпляре. А не занимать память в каждом процессе РНР.
    Ответ написан
    4 комментария
  • Как подсчитать количество элементов в списке с помощью nunique()?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    подсчитать количество элементов в списке без len, и вывести через print уведомление.

    Этот вопрос звучит настолько по-дурацки, что его вполне можно понять буквально
    count = 0
    for tmp in friends:
        count += 1
    Ответ написан
    Комментировать
  • Как узнать баланс юзера?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    5 июня вы уже задавали этот вопрос.
    Если за три месяца вы так и не освоили базовые приёмы работы с БД в РНР, то может ну его совсем?
    Тем более что при таких-то дырищах всё равно это будет не баланс, а решето.
    Ответ написан
    Комментировать
  • Как исправить ошибку Implicit conversion from float (int) to int loses precision?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Этот код какой-то эстет писал.
    Для получения количества полных дней вместо битовых выкрутасов надо просто использовать floor()
    Хотя в данном случае надо использовать ceil, ну или round. Потому что эти 5 сотых дня происходят явно от прехода на летнее время. И с конверсией в int теряется 1 день.
    Ответ написан
    Комментировать
  • Как по очереди проверять и по очереди убирать лишнее?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    А зачем if-ы вкладывать друг в друга?
    Как $tegi[1] может быть одновременно равен $id['TIP_TOVARA'] и $id['AFFILIATION']?
    Ответ написан