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

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    foreach (array_slice($divan['divan'], 0, 3, true) as $key => $value) {


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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    update table2 
    join table1 using(user_id)
     set table2.unicnumber = table1.unicnumber 
    where table1.accept = 1

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

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

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    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
    DBA для вашего PostgreSQL?
    Во-первых, переезжайте на нормальный VPS. Зачем вам хостер, который не предоставляет вам обещанных ресурсов?
    VPS хостер должен предоставлять все ресурсы, которые пообещал.

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

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

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

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

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    На примере 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.
    Ответ написан
    Комментировать
  • Как обернуть функцию mysqli_stmt_bind_param?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Вот за это я и не люблю mysqli. Довольно неудобное для использования API. PDO удобнее.

    Читайте исходную доку и коментарии к ней: php.net/manual/en/mysqli-stmt.bind-param.php
    Note that mysqli_stmt_bind_param() requires parameters to be passed by reference, whereas call_user_func_array() can accept as a parameter a list of variables that can represent references or values.

    А в комментариях как минимум несколько способов, как это обойти.
    Ответ написан
    Комментировать
  • Как установить php-gd на Debian 6, после апгрейда c php 5.3 до 5.6.7-1?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Обновите целиком систему до jessie или хотя бы wheezy. Squeeze даже из LTS уже через пару месяцев выйдет.
    Попытка делать кучу из разных систем редко приводит к чему-то хорошего в конечном итоге.

    dotdeb'овский php5-gd собранный для wheezy, видимо, по зависимостям требует пакеты, которые ваш squeeze предложить уже не может. Поэтому предлагает сделать какую-нибудь логичную на его взгляд глупость. Ну или просто не той версии пакет пытается поставить.
    Посмотрите в apt-cache policy php5-gd что доступно и что хочет ставить, а так же попробуйте apt-get install php5-gd=5.6.13-1~dotdeb+7.1 (сегодня на dotdeb такая версия пакета)
    Ответ написан