• Правильно ли составлен файл htaccess?

    BuriK666
    @BuriK666
    Компьютерный псих
    RewriteEngine On
    RewriteBase /
    RewriteRule ^.htaccess$ - [F]
    
    RewriteCond %{HTTP_HOST} !^www.site.ru$ [NC]
    RewriteRule ^(.*)$ http://www.site.ru/$1 [L,R=301]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php [L]
    Ответ написан
    1 комментарий
  • Как правильнее сверстать логотип из psd?

    @IceJOKER
    Web/Android developer
    С зажатым CTRL нажимаете мышкой на логотип в psd, далее в списке слоев выбираете нужные слои , нажав на правую кнопку мышки на превью, выбираете пункт ПРЕОБРАЗОВАТЬ В СМАРТ ОБЪЕКТ, далее выделить пиксели CTRL + C или тащите на новую вкладку.
    потом нажимаете на пункт меню ФАЙЛ, СОХРАНИТЬ ДЛЯ WEB ну и все. зачем вам шрифты и т.п., когда лого такое маленько и лучше его картинкой вставлять, а не мучаться с css
    Ответ написан
    4 комментария
  • Как сделать, чтобы меню отображалось на разных страницах по-разному?

    @IceJOKER
    Web/Android developer
    поздравляем ! =)
    Ответ написан
    Комментировать
  • Правильно ли составлена функция php, mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Функция составлена отвратительно.
    Две самых главных проблемы - вывод и работа с БД.

    1) Нужно всегда разделять логику приложения и логику отображения.
    Во-первых, как правильно написал Fesor, никакого вывода в функциях быть не должно.
    Во-вторых, и в остальном коде работа с БД и вывод должны быть всегда разделены. Сначала работает код, который получает данные из базы, и только потом начинается вывод, желательно в отдельном файле-шаблоне.

    2) Несмотря на модную буковку i названиях функций, сам подход остался прежним, и представляет собой классический говнокод из прошлого века.
    Во-первых, любые данные всегда должны подставляться в запрос только через плейсхолдеры. новичкам это традиционно сложно понять, поэтому рекомендуется просто запомнить
    Во-вторых, работать с БД надо не напрямую, а через враппер. Самый примитивный враппер - это PDO. Оно совсем не такое страшное, как написал каментатор выше, и код на самом деле получается короче, чем через mysqli
    function get_banners($limit) {
      global $link;
    
      $sql = "SELECT banner_id,banner_title,banner_text,banner_img FROM banner LIMIT ?";
      $stm = $link->prepare($sql);
      $stm->execute([$limit]);
      return $stm->fetchAll();
    }

    или (с осмысленным враппером):
    function get_banners($limit) {
      $sql = "SELECT banner_id,banner_title,banner_text,banner_img FROM banner LIMIT ?";
      return DB::prepare($sql)->execute([$limit])->fetchAll();
    }


    Вот пример нормального вывода:
    <?
    $banners = get_banners(5);
    ?>
    
    <?php foreach ($banners as $row): ?>
    <div class='last_banner'>
      <div class='banner_item'>
        <img src='<?=$row['banner_img']?>' alt='<?=$row['banner_title']?>'>
        <a href='/click/banner_id<?=$row['banner_id'].?>' target='_blank'><?=$row['banner_title']?>"</a> 
        <?$row['banner_text']?>
      </div>
    </div>
    <?php endforeach ?>


    Впоследствии весь блок с HTML можно будет вынести в отдельный файл

    А вот mysqli_free_result() как раз делать здесь бессмысленно - эта функция будет вызвана автоматически.
    Ответ написан
    2 комментария
  • Почему не работает if - elseif со скобкой?

    mlnkv
    @mlnkv
    JavaScript Developer
    не стесняйтесь ставить фигурные скобки (пока не постигнете дзен :) )

    if (empty($useremail)) {
      echo 'Введите Вашу почту';
    } elseif (!filter_var($useremail,FILTER_VALIDATE_EMAIL)) {
      echo 'Не правильно введен E-mail';
    } elseif (strlen($useremail) > 0) {
      $query = sprintf("SELECT user_email FROM users WHERE user_email = '%s' LIMIT 1",mysqli_real_escape_string($link,$useremail));
      $result = mysqli_query($link, $query);
      if (mysqli_num_rows($result) == 1) {
        echo 'Такой E-mail уже занят. <a href="/?do=lost">Восстановить пароль?</a>';  
      } elseif (empty($username)) {
        echo 'Введите Ваше имя';
      } elseif (strlen($username) < 2 ) {
        echo 'Имя должно быть более 2 букв';
      }
    }
    Ответ написан
    2 комментария
  • Правильно ли сформирован запрос на php, mysql?

    nowm
    @nowm
    1. Точка с запятой необязательна, если выполняется только одна инструкция. В вашем случае её можно не писать, так как выполняется только одна инструкция «INSERT». Если инструкций несколько, то каждая инструкция обязательно должна заканчиваться точкой с запятой (кроме последней инструкции, кажется — там не обязательно).

    2. Да, запрос правильный.

    Тот запрос, который у вас был «как вариант», не будет работать, потому что вы пытаетесь нормальный PHP-шный NULL скопировать в строку. Там не появится слово «NULL» в итоге, так как вместо него подставится пустая строка. Итоговый запрос будет выглядеть примерно так:

    INSERT INTO users (user_id, user_name, user_adddate) VALUES ('', 'user', '1404721764')


    У вас здесь сразу две ошибки. Первая — вы передаёте значение NULL, а нужно передавать строку со словом «NULL». Вторая — вы пытаетесь сгененрировать строку так, что у вас слово «NULL» будет в SQL-запросе стоять в кавычках. В таком случае это для SQL-сервера будет считаться не значением «NULL», а строкой. Будет выдана ошибка, потому что у вас user_id — целочисленное, а вы пытаетесь в него писать строку. Правильнее будет так (разобью на строки для читаемости):

    <?php
    $insert_sql = sprintf("
        INSERT INTO users (user_id, user_name, user_adddate) 
        VALUES (%s, '%s', %d)
    ", 'NULL', $user_name, time());
    ?>


    Со sprintf вы движетесь в правильном направлении. После этого вам будет легко понять принцип работы подготовленных запросов PDO, которые я вам советую использовать вместо mysql_*-функций.

    <?php
    /* 
     * Инициализация. Эту строку нужно писать там, 
     * где вы делаете mysql_connect. А сам вызов mysql_connect 
     * и прочего сопутствующего можно удалить.
     */
    $db = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'dbuser', 'dbpass');
    
    // . . .
    
    /* 
     * Вставляемые переменные заменяются знаками вопроса. Никаких кавычек
     * тут ставить не нужно — PDO сам поставит их в нужном месте.
     */
    $sth = $db->prepare('INSERT INTO `users` (user_id, user_name, user_adddate) VALUES (NULL, ?, ?)');
    
    /* 
     * Передача значений в запрос происходит в виде массива;
     * порядок элементов в массиве имеет значение. 
     * $user_name — первый элемент, значит его значение подставится 
     * на месте первого знака вопроса. time() — второй элемент, значит
     * его результат подставится вместо второго «?»
     */
    
    $sth->execute( array($user_name, time()) );
    ?>


    В запросе выше я добавил NULL прямо в строку, чтобы сильно не загоняться, так как для его добавления нужна дополнительная работа. С дополнительной работой это выглядит примерно так:

    <?php 
    // . . . 
    
    $sth = $db->prepare('INSERT INTO `users` (user_id, user_name, user_adddate) VALUES (?, ?, ?)');
    
    /*
     * Важный момент: нельзя писать
     * $sth->bindParam(1, NULL, PDO::PARAM_NULL);
     * Перед тем, как биндить NULL, его нужно присвоить переменной 
     * и биндить уже эту переменную. Иначе будут выскакивать ошибки.
     */
    $null_value = NULL;
    $sth->bindParam(1, $null_value, PDO::PARAM_NULL);
    
    $sth->bindParam(2, $user_name, PDO::PARAM_STR);
    $sth->bindParam(3, time(), PDO::PARAM_INT);
    
    /*
     * Так как параметры уже переданы с помощью bindParam-ов,
     * в вызов execute не нужно ничего добавлять.
     */
    $sth->execute();
    ?>


    По поводу NOW() или CURDATE(). У вас выскакивает ошибка потому, что это не функции PHP. Это функции MySQL и их нужно писать в запросе как есть — они выполняются не в интерпретаторе PHP.

    Как я понял, вы пытались что-то вроде этого делать:

    <?php
    $insert_sql = sprintf("
        INSERT INTO users (user_id, user_name, user_adddate) 
        VALUES (%s, '%s', %d)
    ", 'NULL', $user_name, NOW());
    ?>


    А нужно так:
    <?php
    $insert_sql = sprintf("
        INSERT INTO users (user_id, user_name, user_adddate) 
        VALUES (NULL, '%s', NOW())
    ", $user_name);
    ?>


    Так же, если вы добавляете user_adddate с помощью NOW() или CURDATE(), лучше для этого столбца изменить тип с bigint(20) на datetime.
    Ответ написан
  • Правильно ли сформирован запрос на php, mysql?

    morozovdenis
    @morozovdenis
    тут ошибка ещё раньше - вы руками составляете insert

    используйте высокоуровневые обёртки

    есть open source framework-и на пхп, посмотрите как они генерят запросы - там есть ответы на ваши вопросы, йоу
    Ответ написан
    Комментировать
  • Правильно ли сформирован запрос на php, mysql?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если Вы только изучаете PHP, то сразу откажитесь от использования функций mysql_*, они уже больше года в статусе deprecated. Используйте mysqli_* или PDO с параметризованными запросами.
    По вопросам:
    1. Точка с запятой не обязательны.
    2. Для поля AUTO_INCREMENT значение указывать не надо, его автоматически генерирует сервер. Дату надо хранить в поле с типом DATE, DATETIME или TIMESTAMP, соответственно присваивать CURDATE() или NOW().
    Ответ написан
    1 комментарий
  • Правильно ли составлена функция php, mysql?

    R0s0maxa
    @R0s0maxa
    junior web-developer
    Сразу приучайте себя правильно именовать переменные.
    kolvo - показатель плохого тона и "поповщины", используйте number, num , amount, amt, quantity, qt, qty
    Ответ написан
    2 комментария
  • Правильно ли составлена функция php, mysql?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Не совсем понял что вы хотите выяснить, просто запустите код. Так что просто пару советов:

    1) global $link; - старайтесь не использовать глобальные состояния. Коль уж пишите процедурный код - пусть он будет по настоящему процедурным:
    function show_banner($kolvo, $link) {

    2) старайтесь не делать вывод в функции которая у вас берет данные из базы - пусть она возвращает только данные (либо ничего в случае ошибки) а за вывод пусть отвечает другая функция.
    $banners = get_banners($count, $link);
    show_banners($banners);
    Ответ написан
    5 комментариев
  • Как на php выполнить сразу несколько SQL запросов?

    nowm
    @nowm
    Первый способ: сохранить запросы в файл и импортировать этот файл через командную строку. mysql -u user database < /home/username/mysqldump.sql

    Второй способ: можно сократить количество запросов немного поменяв логику построения запроса. Вместо

    UPDATE `products` SET `status` = 1 WHERE `product_id` = 1;
    UPDATE `products` SET `status` = 1 WHERE `product_id` = 2;
    -- 
    UPDATE `products` SET `status` = 1 WHERE `product_id` = 1000;


    можно писать так:

    UPDATE `products` SET `status` = 1 WHERE `product_id` IN (1, 2, 3, 4, 5);
    UPDATE `products` SET `status` = 2 WHERE `product_id` IN (6, 7, 8, 9);


    Update: оу... я так медленно пишу. Когда начинал писать, ни одного ответа ещё не было. ))
    Ответ написан
    Комментировать
  • Как можно оптимизировать мой код 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>


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