Задать вопрос
Ответы пользователя по тегу PHP
  • Как можно оптимизировать мой код php+mysql?

    nowm
    @nowm
    Можно не только сократить количество запросов, но и сделать код немного аккуратнее и безопаснее.

    <?php
    // Эта строчка — где-то в другом файле — где в данный момент инициализируется соединение с БД
    $db = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'username', 'password');
    
    $sth = $db->prepare("
        SELECT 
            t.`id`, 
            DATE_FORMAT(rt.`data`, '%d.%m.%Y') remont_date,
            ma.`name` marka,
            mo.`name` model,
            t.`serial`,
            rt.`work_id`,
            rt.`sum`
        FROM `tech` t 
        LEFT JOIN `remont_tech` rt ON rt.`tech_id` = t.`id` AND rt.`status` <> 'delete'
        LEFT JOIN `marka` ma ON ma.`marka` = t.`marka`
        LEFT JOIN `model` mo ON mo.`id` = t.`model`
        WHERE 
            t.`user` = ? AND
            TIMESTAMPDIFF(DAY, rt.`data`, NOW()) BETWEEN 0 AND 30
        ORDER BY rt.`data` DESC
    ");
    $sth->execute(array($myrow['id']));
    $result = $sth->fetchAll();
    ?>
    <table>
        <tr>
            <th>№</th>
            <th>Дата</th>
            <th>Оборудование</th>
            <th>Проделанная работа</th>
            <th>Сумма</th>
        </tr>
        <?php if (!count($result)) : ?> 
            <tr>
                <td>0</td>
                <td colspan="4">Ничего не найдено.</td>
            </tr>
        <?php else : ?> 
            <?php $summ = 0; ?>
            <?php foreach ($result as $key => $row) : ?> 
                <tr>
                    <td><?= $key+1 ?></td>
                    <td><?= $row['remont_date'] ?></td>
                    <td><?= sprintf('%s %s(%s)', $row['marka'], $row['model'], $row['serial']) ?></td>
                    <td><?= $row['work_id'] ?></td>
                    <td><?= number_format($row['sum'], 0, ',', ' ') ?> руб.</td>
                </tr>
                <?php $summ += $row['sum']; ?>
            <?php endforeach; ?> 
            <tr>
                <td colspan="3"></td>
                <td><b>ИТОГО:</b></td>
                <td><b><?= number_format($summ, 0, ',', ' ') ?> руб.</b></td>
            </tr>
        <?php endif; ?> 
    </table>


    А всякие: рамки таблицы, ширины ячеек и прочее — лучше в файле со стилями прописывать, а не инлайном. Их там гораздо проще обслуживать.
    Ответ написан
    Комментировать
  • Доступ к изображению только для конкретных сайтов (белый список)

    nowm
    @nowm
    Если у вас Apache в качестве веб-сервера, можно не нагружать PHP выяснением того, кто откуда пытается загрузить картинку. Ведь в случае PHP вам все-все картинки придётся отдавать PHP-скриптом — это какая-то лишняя нагрузка.

    С помощью .htaccess можно сделать примерно такой вариант (файл .htaccess в корне сайта files.domain.com):

    RewriteEngine On
    RewriteBase /
    
    RewriteCond %{HTTP_REFERER} !domain\.com$ [NC]
    RewriteRule .* - [R=404,L]


    Я могу ошибаться немного в регулярных выражениях, но суть, я думаю, понятна: проверяем, чтобы строка %{HTTP_REFERER} заканчивалась на «domain.com» (сюда попадут и «domain.com» и «www.domain.com» и «image.domain.com» и «любойподдомен.domain.com»). Если реферер не подходит под это определение, редиректим на страницу 404.

    %{HTTP_REFERER} — это содержимое HTTP-заголовка Referer.

    С другой стороны, Referer можно легко подделывать с помощью PHP, и злоумышленник может написать на PHP простой прокси, который будет по своим адресам отдавать ваши картинки, отправляя вам легитимное значение поля Referer.
    Ответ написан
    1 комментарий
  • Как реализовать JOIN для таблиц в двух БД?

    nowm
    @nowm
    но, по моему, это будет слишком тяжело для баз

    Чтобы для баз было легче, просто сделайте индексы на тех полях, по которым происходит объединение. Один джоин это ещё не «слишком тяжело». Но если вы думаете, что, после запроса с одним джоином, SQL-сервер выйдет из строя на полгода раньше, надорвётся и начнёт глючить, или во время этого запроса будет потреблять электроэнергию, как 100 сварочных аппаратов, то, конечно, можно сделать два запроса, на которые потратится время, а потом потратить время ещё и на цикл в PHP.

    Вообще, лучший способ: замерьте время, которое вам понадобится на то, чтобы получить данные запросом с джоинами, а так же время, которое понадобится для того, чтобы получить данные двумя запросами и с помощью циклов в PHP их объединить. Для чистоты эксперимента, можно вычислять среднее время на 1000 или больше повторений.

    Если у вас базы данных находятся на разных серверах, как вы написали, то самый простой способ — выбрать из каждой таблицы данные отдельно, и уже в PHP сделать объединение. Либо можно использовать FEDERATED таблицы.
    Ответ написан
    Комментировать
  • Почему не удается выполнить вставку посредством mysqli::query?

    nowm
    @nowm
    Дамп запроса выводит «INSERN INTO...». INSERN — это не правильное слово. Правильное слово заканчивается на «T», а не на «N» — «INSERT»
    Ответ написан
    Комментировать
  • Чем лучше перенести большую базу данных на виртуальный сервер хостинга?

    nowm
    @nowm
    Насчёт по кускам — не могу сказать, но большой дамп БД можно импортировать из командной строки. Например, если сохранить/закачать дамп в /home/username/mysqldump.sql, то импортировать можно так:

    mysql -u user -p database < /home/username/mysqldump.sql


    Здесь user после ключа -u — пользователь БД, который имеет право импортировать, database — название БД, в которую будут импортироваться данные; -p — ключ, который указывает, что нужно спросить пароль перед импортом. Если хочется ввести пароль сразу в командной строке, он задаётся после знака равенства в ключе p, вот так: -p=P455w0rd — без пробелов.

    Эта команда, если не ошибаюсь, после запуска спросит у вас пароль для пользователя user, а после ввода пароля выполнит файл /home/username/mysqldump.sql (ну или тот, который вы ей укажете) для заданной базы данных.

    Так импортировать гораздо проще, чем оперировать кусками файлов.
    Ответ написан
    3 комментария