Ответы пользователя по тегу PHP
  • Как реализовать обработку результатов foreach в PHP?

    Melkij
    @Melkij
    PostgreSQL DBA
    Используйте preg_replace_callback, проще будет.
    Ответ написан
    Комментировать
  • Кодировка символов в PHP под WIndows?

    Melkij
    @Melkij
    PostgreSQL DBA
    А давайте ещё раз, но вы определитесь, в какой кодировке вы пытаетесь работать.
    В кодировке UTF8 строка из единственного байта \x81 недопустима.
    Ответ написан
  • Как в foreach сделать счетчик?

    Melkij
    @Melkij
    PostgreSQL DBA
    foreach (array_slice($divan['divan'], 0, 3, true) as $key => $value) {


    Это если остальные элементы этой коллекции нужны в других местах и только тут первые три. Если не нужны - то зачем вы их вообще получаете?
    Ответ написан
    1 комментарий
  • Почему не работает код в php?

    Melkij
    @Melkij
    PostgreSQL DBA
    readdir возвращает имя элемента. Имя, а не путь к этому элементу.
    Где вы сказали is_file, что такое имя файла надо искать в директории ../alx2/images, а не в текущей?

    Чтобы не извращаться разными способами в стиле PHP4 - используйте штатный DirectoryIterator. Код будет компактнее и понятнее.
    Ответ написан
    Комментировать
  • Где скачать дистрибутив сервера apache для windows 7?

    Melkij
    @Melkij
    PostgreSQL DBA
    The Apache HTTP Server Project itself does not provide binary releases of software, only source code.

    apache-mirror.rbc.ru/pub/apache//httpd/binaries/win32
    Ответ написан
    2 комментария
  • Правильно SQL запрос для пагинации?

    Melkij
    @Melkij
    PostgreSQL DBA
    Для mysql есть такая штука FOUND_ROWS() dev.mysql.com/doc/refman/5.7/en/information-functi...
    Заявлена именно для подобных целей. При этом не работает оптимизация по лимиту, запрос всегда будет выполняться полностью, но обычно это лучше, чем выполнять отдельный count.

    Возможно, вам подойдёт другой вариант: не выяснять вообще, сколько страниц доступно. Запрашивать не лимит 20, а лимит 21. Если вернулась 21 строка - выводите первые 20 и кнопку "показать ещё". Меньше 21 - только результат, это последняя страница.
    Ответ написан
    1 комментарий
  • Вылетает 500 ошибка?

    Melkij
    @Melkij
    PostgreSQL DBA
    Смотрите в логах конкретику.

    Но конкретно эти запросы имеют одну очевидную проблему: dev.mysql.com/doc/refman/5.6/en/keywords.html
    Ответ написан
    Комментировать
  • Как понять кодировку, при скачивании через wget?

    Melkij
    @Melkij
    PostgreSQL DBA
    Какого-то эфемерного "настоящего" имени файла ни в одном из этих вариантов нет. Файла может вообще не существовать.

    все равно потом имя файла будет изменено

    Ну и нафиг вам вообще это имя сдалось? Сохраняйте сразу с тем именем, по которому сможете файл найти, опция output-document
    А то и сразу курлом из php и загружать.
    Ответ написан
  • Как получить тело POST запроса?

    Melkij
    @Melkij
    PostgreSQL DBA
    В смысле с заголовками?
    Тело POST-запроса - это именно php://input
    Что отправили, то тут и получите.
    Ответ написан
    3 комментария
  • Как решить проблему с кодировками UTF-8 без BOM и просто utf-8?

    Melkij
    @Melkij
    PostgreSQL DBA
    Вот этот странный колхоз - это вы кастрированный iconv в cp1251 сделать пытаетесь? Вроде по поведению похоже.

    Страница вывода ленты у меня в UTF-8.

    И simplexml всегда в UTF8. Что вы тут пытаетесь сделать с бедным юникодом я не очень понимаю.
    Ответ написан
    1 комментарий
  • Как сделать сложный UPDATE запрос к MySQL для частичного слияния данных двух таблиц?

    Melkij
    @Melkij
    PostgreSQL DBA
    update table2 
    join table1 using(user_id)
     set table2.unicnumber = table1.unicnumber 
    where table1.accept = 1

    ?
    Ответ написан
    Комментировать
  • Есть ли решение для пагинации древовидных комментариев?

    Melkij
    @Melkij
    PostgreSQL DBA
    Начните с изучения вопроса, как можно хранить деревья в РСУБД.
    Для ограниченного количества вложенности - материализованной путь отлично подходит. И элементарно выводится limit'ом, можно даже без offset'а обойтись, если озадачиться.
    Ответ написан
    Комментировать
  • Rак правильно организовать списание баланса?

    Melkij
    @Melkij
    PostgreSQL DBA
    InnoDB все запросы выполняет только в транзакции. Если открытой транзакции не было, то этот запрос неявно оборачивается в транзакцию.
    Вот только сами по себе транзакции не помогут, надо ещё правильно ими пользоваться. Тут я бы хотел дополнительно обратить внимание Андрей:
    Попробуйте в двух терминалах написать:
    сначала begin; в обоих
    потом select из таблички. Значения одинаковые, правда?
    потом update этой же таблички, сделайте set fieldname = разные значения в терминалах. Второй терминал запрос принял, но не вернул управление, верно?
    потом commit; в первом терминале. update из второго терминала сразу же ответил OK.
    Теперь сделайте commit во втором терминале и посмотрите, что произошло с данными. Это то, на что вы рассчитывали? Или всё-таки не совсем?

    N пользователей запрашивают услугу одновременно, корректно ли произойдет списание средств?

    Нет, некорректно, если только вы не в одной транзакции и не читаете баланс специально с select .. for update.
    Потому что для выполнения действия $this->balance -= $sum; у вас уже должен быть известен баланс, но это ещё не операция записи.
    В итоге у вас было 1000 рублей.
    Пришёл один клиент, прочитал баланс, хочет списать 200 рублей. Обновил циферку в PHP, никто ему не мешает.
    Пришёл второй клиент, прочитал баланс, хочет списать 100 рублей. Обновил циферку в PHP, никто ему тоже не мешает.
    И на шаге save оба отправили запросы на update: один клиент считает, что на балансе осталось 800 рублей, второй - что 900.
    Сколько запишется на баланс? 800 или 900, как повезёт. Правильно ли это? Сколько должно было быть? 700 ведь.
    Потому что клиенты не мешали друг другу обновлять циферку в PHP.

    Как же заставить клиентов не делать глупости?
    В простом случае:
    update tablename set balance = balance - :amount where balance >= :amount and user_id=:uid
    И на приложении проверять affected_rows. Если строка изменена - у пользователя достаточно денег, платёж прошёл. Если изменённых строк нет - вероятно, у пользователя нет столько денег. СУБД разберётся с очерёдностью исполнения и в результате на балансе будет правильная сумма, сколько бы параллельных запросов ни пришло. И, что не менее важно - приложение ответит на все запросы корректно, кому денег хватило, а кому - уже нет.

    В более сложных случаях - можно самому попросить СУБД взять блокировку на строку, о чём чуть ранее я уже заикался:
    begin;
    select balance from tablename where user_id=:uid for update; -- все параллельные транзакции будут выстраиваться в очередь здесь
    /* произвольные запросы (в mysql кроме вызова хранимок, DDL - они делают неявный коммит). Среди этих запросов - обновляете баланс */
    commit; -- только здесь эта транзакция освобождает блокировку select .. for update и с этой строкой начинает работать следующий запрос

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

    Melkij
    @Melkij
    PostgreSQL DBA
    Во-первых, переезжайте на нормальный VPS. Зачем вам хостер, который не предоставляет вам обещанных ресурсов?
    VPS хостер должен предоставлять все ресурсы, которые пообещал.

    1) посмотрите в cgroup
    2) так тоже можно. Но зачем?
    3) какое-то узкое место есть всегда. Если есть полная утилизация CPU - значит в него и упёрлись. Если CPU утилизируется не полностью - значит упёрлись во что-то другое. В ввод-вывод (диск, сеть), память или ещё во что-нибудь. Распаковка довольно простого zip'а - скорей всего в диск упёрлась.
    Ответ написан
    Комментировать
  • Вопросы по PDO php?

    Melkij
    @Melkij
    PostgreSQL DBA
    1) dev.mysql.com/doc/refman/5.7/en/show-profile.html
    2) between пишется так: dev.mysql.com/doc/refman/5.7/en/comparison-operato...
    Сравните со своим.
    3) php.net/manual/en/pdostatement.bindparam.php , $data_type = PDO::PARAM_STR. Ещё что-то пояснять равзе надо?
    Ответ написан
  • Почему в коде ошибка (код внутри)?

    Melkij
    @Melkij
    PostgreSQL DBA
    Проверьте версию PHP. Вы пользуетесь какой-то слишком музейной, нужна минимум музейная 5.4, лучше использовать актуальную 5.6
    Ответ написан
    Комментировать
  • В чём проблема (file_get_contents)?

    Melkij
    @Melkij
    PostgreSQL DBA
    Здравая мысль от Алексей Уколов продублировать комментарий из обсуждения как полновесный ответ.

    var_dump($info) автору отобразил string(4) "0"
    Здесь особое внимание не на выводимый "0", а на цифру в скобках, которая говорит, что в этой строке 4 байта. Не один, как было бы в большинстве кодировок для строки "0".
    Самое очевидное - в ответе сервера прилетает BOM-метка. Как раз 3 байта BOM, затем байт символа 0, вот и 4 байта в ответе. Но может быть что-то и другое - посмотрите hexdump'ом ответ сервера. (как вариант, запишите ответ в файл и посмотрите этот файл hexdump'ом).
    Ответ написан
    Комментировать
  • Надежна ли функция is_array?

    Melkij
    @Melkij
    PostgreSQL DBA
    На примере PHP5.6.14
    ext/standard/type.c PHP_FUNCTION(is_array) вызывает php_is_type (функция определена там же, чуть выше)
    Та проверяет на равенство Z_TYPE_PP(arg).
    Z_TYPE_PP, соответственно, макрос из Zend/zend_operators.h
    #define Z_TYPE(zval)		(zval).type
    #define Z_TYPE_P(zval_p)	Z_TYPE(*zval_p)
    #define Z_TYPE_PP(zval_pp)	Z_TYPE(**zval_pp)

    Как видим, прямое обращение к полю type базовой для zend'а структуры zval. Ну а уж оно врать не может, это или IS_ARRAY и is_array даст true или что-то другое и результатом будет false.
    Ответ написан
    Комментировать