• Как реализовать редактирование уже существующих записей (программа есть но не работает)?

    @aleksmir
    Системный администратор, программист
    Тут две ошибки, первая - это при определении $note_id, должно быть так:
    $node_id = isset($_POST['id']) ? $_POST['id'] : $_GET['note'];

    Вторая, это нужно подставлять значения $_POST после перерисовки и вычисленную $node_id:
    <form method="POST">
    <p>Заголовок заметки: <input type="text" name="title"  value = "<?php echo isset($_POST['title']) ? $_POST['title'] : $edit_note['title']; ?>"/></p>
    <p>Текст заметки: <textarea name="article"><?php echo isset($_POST['article']) ? $_POST['article'] : $edit_note['article']; ?></textarea></p> 
    <input type="hidden" name = "note" value="<?php echo $node_id; ?>"/>
    <input type="submit" name= "submit" value="Изменить"/>
    </form>

    Тут тоже ошибка, она на сохранение не влияет, но вызывает ошибку выполнения, которая у вас не отображалась скорее всего потому, что вывод ошибок отключен. Можно подправить так:
    if (isset($_POST)) {
    $title = $_POST['title'];
    $article = $_POST['article'];
    $update_query = "UPDATE notes SET title = '$title', article = '$article' WHERE id = $note_id";
    $update_result = mysqli_query ($link, $update_query);
    }
    Ответ написан
    Комментировать
  • Как правильно получать дополнительные данные из соседних таблиц на странице списка?

    @aleksmir
    Системный администратор, программист
    Можно одним запросом все достать:
    SELECT `country`.`id`, `country`.`name`, `table2`.`field1`, `table2`.`field2`
    FROM `country` LEFT JOIN `table2` ON `country`.`id`=`table`.`country_id`
    ORDER BY `country`.`id`, `table2`.`field`;
    Ответ написан
    Комментировать
  • Как структурировать базу данных MySQL для онлайн записи?

    @aleksmir
    Системный администратор, программист
    Задача хитрая в том плане, что будет первое время ускользать из рук. Т.е. вам несколько раз придется улучшать логику приложения, пока придете к нужному результату. Но не бойтесь, начните с малого. Базе данных очень важно знать - какие данные вы будете хранить и в каком виде от нее получать. Остальное она все сделает сама.

    Поэтому начнем с самого простого - таблицы для хранения самой записи. Таблицу назовем `reg` от слова `registration` (Регистрация). Поле `id` - ключевое. Поле `datetime` - хранит дату и время записи. Поле `info` - произвольная текстовая информация, не длиннее 255 символов.
    CREATE TABLE `reg` (
    	`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id записи',
    	`datetime` DATETIME NULL DEFAULT NULL COMMENT 'Дата и время записи',
    	`info` VARCHAR(255) NOT NULL DEFAULT '' COMMENT 'Текстовая информация о записи' COLLATE 'utf8mb4_unicode_ci',
    	PRIMARY KEY (`id`),
    	INDEX `datetime` (`datetime`)
    )
    COMMENT='Регистрация'
    COLLATE='utf8mb4_unicode_ci'
    ENGINE=InnoDB;


    Попробовать повводить данные в таблицу можете здесь, например через программу HeidiSQL:
    - сервер: habr.atou.ru
    - порт: 3311
    - пользователь: habr_95659
    - пароль: 9D4z3R4b
    - база данных: habr_952563

    Если захотите продолжить. Помогу создать следующие таблицы.
    Ответ написан
    Комментировать
  • Возможно ли уменьшить время запроса?

    @aleksmir
    Системный администратор, программист
    Приведите пожалуйста код создания структуры таблицы pictures, тогда будет более предметный разговор. Сколько записей в таблице pictures?
    Из общих рекомендаций:
    1) `result`='WAITING' - поле должно быть проиндексировано, иначе запись ищется полным перебором всех записей;
    2) условие DATE(`date`) точно правильно написано?
    3) если ищете по дате, то поле `date` тоже должно быть проиндексировано;
    4) лучше вместо отдельных индексов использовать составной индекс INDEX `result_date` (`result`, `date`);
    5) проверьте свои запросы SELECT и UPDATE с помощью команды EXPLAIN, по ней можно будет посмотреть - где происходят тормоза;
    6) у вас в этом коде PHP происходит до 11 обращений к БД; операция UPDATE наиболее медленная, вполне вероятно, что она и выполняется в течение нескольких секунд 10 раз; но если будет индекс, то проблем не должно быть;
    7) если не поможет, то несколько запросов UPDATE можно заменить одним запросом с помощью функций обновления через условие;
    8) кстати для поля `hash` также нужен индекс, раз по нему выполняется поиск;
    9) ещё бы я рекомендовал ключ сделать числовым, т.е. `hash` заменить на поле `id` типа UNSIGNED INT AUTOINCREMENT и сделать его ключом PRIMARY KEY;
    10) поле `result` тоже нужно сделать числовым и записывать в него, например число 0, если 'WAITING' и 1, если 'PROCESS'.

    Уверен, что после выполнения рекомендаций все будет "летать".
    Ответ написан
    Комментировать
  • Как составить запрос на удаление нужных значении?

    @aleksmir
    Системный администратор, программист
    "Мне нужен запрос который удалит все ячейки..."
    Если вы имели ввиду удалит записи (а не ячейки), то вот:

    DELETE FROM HES WHERE (itemno >=40000) AND (itemno <= 40500);
    Ответ написан
    1 комментарий
  • Почему возникает ошибка при создании столбцов?

    @aleksmir
    Системный администратор, программист
    PHP не виноват. Тут больше вопрос к СУБД. При создании-удалении процедуры происходит какой-то сбой на стороне БД.

    Можете попробовать убрать создание процедуры, оставить только создание столбцов:

    <?php
    
    public function createQuery($array, $table)
    	{
    		$query = 'use database_name; ';
    		foreach($array as $key => $value){
    			$query.= "
    				IF NOT EXISTS (
    				SELECT *
    				FROM information_schema.COLUMNS
    				WHERE COLUMN_NAME = '".$key."'
    				AND TABLE_NAME = '".$table."'
    				AND TABLE_SCHEMA = DATABASE()
    				) THEN
    				ALTER TABLE `".$table."`
    				ADD COLUMN `" .$key."` TEXT NULL DEFAULT null;
    				END IF;";
    			}
    		return $query;
    	}
    
    ?>


    Но результат будет зависеть от возможностей вашей СУБД.
    Ответ написан
    Комментировать
  • Как отобразить определённый шаблон в зависимости от состояния пользователя?

    @aleksmir
    Системный администратор, программист
    Как-то так (это конечно часть кода, отвечает на заданный вопрос):

    <?php
    
    // Файл testpass.php - проверка пароля
    // 	$_POST['login'] - логин из формы HTML
    //	$_POST['pass']	- пароль из формы HTML
    
    // проверка логина и пароля
    	// ...
    	$is_login = true; // присваивается, если проверка прошла успешно
    	
    // вывод страницы index.html
    	// ...
    	// вывод кнопок "Войти", "Зарегистрироваться"
    		if (!$is_login) {
    			echo('<button>Войти</button>');
    			echo('<button>Зарегистрироваться</button>');
    		}
    
    ?>


    Чтобы ответить более точно, надо как минимум понимание - как вы выводите страницу index.html.
    Ответ написан
  • Преобразование строки?

    @aleksmir
    Системный администратор, программист
    Вот так можно:

    <?php
    
    $str = 'https://anvis.iaai.com:443/resizer?imageKeys=29697105~SID~B607~S0~I1~RW2592~H1944~TH0&amp;width=161&amp;height=120';
    $mas = explode('&', $str);
    $mas[1] = 'amp;width=845';
    $mas[2] = 'amp;height=633';
    $str = implode('&', $mas);
    echo($str);
    
    ?>


    А вообще причина была в том, что у вас точка с запятой лишняя в конце:

    '&amp;width=161&amp;height=120;'

    Поэтому str_replace() тоже будет работать:

    <?php
    
    $str = 'https://anvis.iaai.com:443/resizer?imageKeys=29697105~SID~B607~S0~I1~RW2592~H1944~TH0&amp;width=161&amp;height=120';
    $find = '&amp;width=161&amp;height=120';
    $replace = '&width=845&height=633';
    $res = str_replace($find, $replace, $str);
    echo($res);
    
    ?>
    Ответ написан
    Комментировать
  • Почему идет долгий запрос в mysql?

    @aleksmir
    Системный администратор, программист
    Судя по структуре запроса тормоза скорее всего из-за поиска в тексте.
    1) попробуйте использовать индекс FULLTEXT
    2) проверьте на всякий случай наличие индексов на числовых полях; для анализа запроса можно использовать EXPLAIN
    3) возможно стоит, как вы и писали, нормализовать структуру таблиц, чтобы текстовый поиск поменять на поиск по ID; это был бы самый надежный способ; как например вы сделали здесь (это удачное решение):
    and class_ads.category_id in (239,241,242,243,245,246,248,249,201)

    4) в крайнем случае, когда от текстового поиска совсем не уйти, можно применить функцию CRC32(), которая подсчитывает контрольную сумму по строке и эту контрольную сумму сохранить в числовом поле `crc`, по полю построить индекс:
    CREATE TABLE `table` (
    `crc` INT UNSIGNED NOT NULL DEFAULT '0',
    `word` VARCHAR(30) NOT NULL DEFAULT '' COLLATE 'utf8mb4_unicode_ci',
    INDEX (`crc`);

    Потом в запросе искать так:
    SELECT * FROM `table` WHERE (`crc`=CRC32(`слово')) AND (`word`='слово');


    Но п.4 скорее всего не ваш случай. Я думаю п.3 (создание справочников и выполнение поиска по id) был бы лучшим решением.
    Ответ написан
    Комментировать
  • Как вставить значение в LINESTRING?

    @aleksmir
    Системный администратор, программист
    В MySQL строки объединяются функцией CONCAT()

    SET @g1 = 100;
    SET @g2 = CONCAT('SELECT LINESTRING(0 ', @g1, ', 100000 100)');
    SELECT @g2;
    Ответ написан
    Комментировать
  • Как лучше всего хранить такой набор данных?

    @aleksmir
    Системный администратор, программист
    Пишите на MySQL. Самое верное дело. Там потерь не бывает. Движок InnoDB.
    По структуре таблиц зависит от исходных данных.
    Напишите сколько у вас примерно файлов сейчас. И какой прирост - т.е. в каком количестве они добавляются ежедневно. Тогда можно будет прикинуть структуру.
    Второй вопрос - как нужно делать выборку этих строк? По текстовому поиску или ещё как-то? По заголовкам имен файлов или по всему тексту?
    Ответ написан