Задать вопрос
Ответы пользователя по тегу PHP
  • Как сделать PDO + IN?

    kimono
    @kimono
    Web developer
    Честно, не проверял, но по вашей логике примерно следующее:
    $values = [1, 2, 3];
    $in_query = implode(',', array_fill(0, count($values), '?'));
    $query = $DB->prepare(sprintf("UPDATE `Ttopic` SET `main`= ?, `main_id`= ?, `type`='".$f['type']."' WHERE `id` IN (%s) LIMIT 10", $in_query));
    if($query->execute(array_merge([$main, $theme], $values)) echo 'ok';

    Ну и конечно же `type`='".$f['type']."' в запросе это зло.
    Ответ написан
  • Подсчет количества элементов в категориях и подкатегориях (SQL)?

    kimono
    @kimono
    Web developer
    Копайте в сторону nested sets для таблицы категорий. Тогда все будет значительно проще.
    Ответ написан
    Комментировать
  • Как осуществлять занесения контента в базу данных, который добавил сам пользователь на сайте?

    kimono
    @kimono
    Web developer
    Порядок такой:
    На странице размещаешь HTML форму с полями типа название, текст, дата и прочее для своих нужд. В экшен формы указываешь скрипт, который будет эту форму обрабатывать. В скрипте делаешь всяческие проверки того, что ввел пользователь, и если тебя все устраивает делаешь запрос в базу на добавление записи.
    Ответ написан
  • Как скрыть запятую?

    kimono
    @kimono
    Web developer
    Ловите:
    $a = ['a', 'b', 'c'];
    $b = array_map(function($i){return '<span class="addon">'.$i.'</span>';}, $a);
    echo implode(', ', $b);

    <span id="words">a</span>, <span id="words">b</span>, <span id="words">c</span>
    Ответ написан
  • Как грамотно и безопасно использовать сессии в связке с cookies?

    kimono
    @kimono
    Web developer
    Я на клиенте храню ID сессии. При запуске любого скрипта по этому ID в базе сессий ищется информация и сверяется с user-agent-ом пользователя (можно и ip сверять дополнительно, но если ip поменялся, значит и сессия будет считаться закрытой, а это не всегда удобно).
    Дальше определяется под какой учетной записью залогинился пользователь этой сессии (дополнительный столбец в базе сессий). Сессионные данные парсятся из базы, а инфа о пользователе берется из мемкеша.
    На клиенте можно хранить список избранных материалов например, или данные от голосовалок, чтобы лишний раз не бегать на сервер за этой информацией (на сервере тоже нужно проверять, естественно).
    При завершении скрипта все собранные сессионные данные вновь добавляются в базу.
    Ответ написан
    Комментировать
  • Нормальна ли скорость загрузки страницы 500мс?

    kimono
    @kimono
    Web developer
    А можно просто запустить debug и все встанет на свои места. У меня связка phpstorm + xdebug + wincachegrind отлавливает проблемные места. Много чего интересного можно узнать ;)
    Ответ написан
    2 комментария
  • Как ввести адресную инфу?

    kimono
    @kimono
    Web developer
    В общем случае структура базы такая:
    CREATE TABLE `points` (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
      `parent` int(11) DEFAULT NULL COMMENT 'Родитель',
      `name` varchar(128) NOT NULL COMMENT 'Название',
      PRIMARY KEY (`id`),
      KEY `parent` (`parent`)
    ) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
    
    INSERT INTO `points` (`parent` ,`name`) VALUES (NULL, 'Россия');
    -- 'Россия': ID = 1
    INSERT INTO `points` (`parent` ,`name`) VALUES (1, 'Хабаровский край');
    -- 'Хабаровский край': ID = 1234
    INSERT INTO `points` (`parent` ,`name`) VALUES (1234, 'Хабаровск');


    Но для лучшего взаимодействия используйте Nested sets. Структура базы такая:
    CREATE TABLE `points` (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
      `left_key` int(11) DEFAULT '0' COMMENT 'Левый ключ',
      `right_key` int(11) DEFAULT '0' COMMENT 'Правый ключ',
      `parent` int(11) DEFAULT NULL COMMENT 'Родитель',
      `level` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'Уровень вложенности',
      `name` varchar(128) NOT NULL COMMENT 'Название',
      PRIMARY KEY (`id`),
      KEY `left_key` (`left_key`),
      KEY `right_key` (`right_key`),
      KEY `parent` (`parent`)
    ) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;


    Nested sets обеспечивает более быструю выборку и удобство. Единственно после любого изменения в базе вам нужно будет запускать процедуру раздачи ключей. Когда писал свой велосипед наткнулся на zabolotnev.com/mysql-nested-sets, оттуда и подчерпнул инфу.
    Ответ написан
    Комментировать
  • Как сгруппировать массив по его значениям?

    kimono
    @kimono
    Web developer
    $week = [
      'Понедельник' => [0 => '9:00', 1 => '19:00'],
      'Вторник'     => [0 => '9:00', 1 => '19:00'],
      'Среда'       => [0 => '9:00', 1 => '19:00'],
      'Четверг'     => [0 => '10:00', 1 => '14:00'],
      'Пятница'     => [0 => '9:00', 1 => '19:00'],
      'Суббота'     => [0 => '9:00', 1 => '19:00'],
      'Воскресенье' => [0 => '10:00', 1 => '16:00']
    ];
    
    $data = [];
    $current = '';
    $i = 0;
    
    foreach ($week as $day => $schedule) {
      if ($current !== $schedule) {
        $current    = $schedule;
        $data[$i++] = ['start' => $day, 'end' => $day, 'time' => implode(' - ', $schedule)];
      }
      $data[$i - 1]['end'] = $day;
    }
    foreach ($data as $id => $row) {
      $data[$id] = [implode(' - ', array_unique([$row['start'], $row['end']])) => $row['time']];
    }
    var_dump($data);

    на выходе:
    'Понедельник - Среда' => '9:00 - 19:00'
    'Четверг' => '10:00 - 14:00'
    'Пятница - Суббота' => '9:00 - 19:00'
    'Воскресенье' =>  '10:00 - 16:00'
    Ответ написан
    Комментировать