Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/56: Рейтинг темы: голосов - 56, средняя оценка - 4.54
5 / 5 / 1
Регистрация: 04.01.2013
Сообщений: 393

Редактирование данных в таблицах из браузера

02.09.2013, 09:53. Показов 10791. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
нужен скрипт редактирования данных в таблицах базы данных.
что бы выходила табличка с данными таблицы базы mysql и прямо в ней можно было редактировать строки.
всё что нашел в гугле каое то корявое и не функциональное.заранее спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.09.2013, 09:53
Ответы с готовыми решениями:

Редактирование данных в связанных таблицах
Подскажите, пожалуйста, как правильно выполнять редактирование данных в связанных таблицах? Есть таблицы tbl1(tbl1ID, Name, Description,...

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

Редактирование свойств браузера
И снова добрый день с: И снова я прошу о помощи, задача следующая: -Снять галочки и очистить поля в выделенных клетках/полях одним...

19
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.09.2013, 10:23
как-то так можно, например, если по-простому
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
header('Content-type: text/html; charset=utf-8');
try
{
    $db = new PDO( 'mysql:host=ВАШ_ХОСТ;dbname=ВАША_ДБ', 'ВАШ_ЛОГИН', 'ВАШ_ПАРОЛЬ', array(PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES "utf8"') );
    $res = $db->query('SELECT * FROM `ВАША_ТАБЛИЦА`'); ?>
    <form method="post">
        <?php while($rows = $res->fetch(PDO::FETCH_ASSOC))
        {
            if(empty($fields))
                $fields = array_keys($rows);
            foreach($rows as $k=>$v) : ?>
                <input type="text" name="values[<?php echo htmlspecialchars($k); ?>]" value="<?php echo htmlspecialchars($v); ?>"><br>
            <?php endforeach;
        } ?>
    <input type="submit" value="Сохранить"><br>
    </form>
    <?php
 
    if( isset($_POST['values']) && is_array($_POST['values']) )
    {
        $values = array();
        foreach($_POST['values'] as $k=>$v)
        {
            $field = is_scalar($k) ? $k : NULL;
            $value = is_scalar($v) ? $v : NULL;
            $values[] = $db->quote( in_array($field, $fields) ? $value : '' );
        }
        $res = $db->exec('INSERT INTO `ВАША_ТАБЛИЦА` (`' . join('`, `', $fields) . '`) VALUES(' . join(', ', $values) . ')';
        echo !empty($res) ? 'Данные успешно обновлены' : 'Произошла ошибка при обновлении данных';
    }
}
catch(PDOException $e) {
    echo $e->getMessage();
}
Добавлено через 6 минут
а, нет, ошибся, вам же изменить надо данные, а не записать
0
33 / 33 / 9
Регистрация: 26.07.2013
Сообщений: 148
02.09.2013, 17:55
В каждую ячейку бд добавить <input type="text" value="значение из бд"> В конце столбец с кнопкой и скрытым полем, в котором будет ид записи в базе, каждую строку обернуть в форму и при нажатии кнопки сохранять выбранную строку. Такой вариант не подходит?
0
Заблокирован
02.09.2013, 19:19
ТС По-простому не получится. Ищите по слову datagrid.

Без заморочек с полями ввода есть способ сделать ячейки хтмл-таблицы редактируемыми и сохранять весь выданный диапазон как есть. Саму таблицу придется построить так, чтобы можно было собрать данные ява-скриптом, или забить массив ява-скрипту так, чтобы он построил таблицу и собрал с нее все правильно.

Правильно это значит столбцы в строке 0 придется идентифицировать именами полей, то есть добавить атрибут id=table[field_name] или типа того. В процессинге как минимум надо найти хотя бы одно ключевое поле для условия WHERE, следовательно придется ковырять флаги, которые можно ковырять только в результате запроса, следовательно надо либо и запрос передавать, ну тупо SELECT * FROM mytable в процессинг, чтобы он еще раз там спросил и расковырял, либо доставать флаги в скрипте рисующем таблицу, находить поле(я) для условия, как-то их сохранять и отгружать. Кроме того чтобы все было нормально придется проверять типы, значит и типы надо доставать и сохранять, отгружать. Ну и главный геморрой это как самый легкий случай поля типа enum, set, bit, datatime, decimal - которые будучи отображены просто текстом заколебут любого оператора ровно за одну сессию. А как самый тяжелый случай это редактирование связанных таблиц. Кроме того в простую хтмл-таблицу заедут все служебные поля - автоинкременты и куча связанных, которые вообще редактировать вручную чревато.

Короче ищите datagrid или юзайте phpMyAdmin или типа того.

KOPOJI, а где собственно там таблица рисуется?

Добавлено через 6 минут
Цитата Сообщение от HWOARANG Посмотреть сообщение
В конце столбец с кнопкой и скрытым полем, в котором будет ид записи в базе
Это самая косточка. Как вы найдете "ид записи в базе" не зная заранее имя этого самого ид?
0
33 / 33 / 9
Регистрация: 26.07.2013
Сообщений: 148
03.09.2013, 10:45
Цитата Сообщение от sqlnub Посмотреть сообщение
Это самая косточка. Как вы найдете "ид записи в базе" не зная заранее имя этого самого ид?
Каким тогда образом заполняется таблица из базы? Логично, что посылается запрос в базу вида "SELECT * FROM table", из результата не составит труда достать ид. Почему вы решили, что ид не известен?
0
Заблокирован
03.09.2013, 17:17
Потому что в запросе вида

SQL
1
"SELECT * FROM table"
никакого ид не фигурирует. Таблица построится как два пальца по результату. Я тут где-то цитировал код в 3 строки не считая 2 на коннект который это сделает с любым результатом.

Но как вы узнаете где в этой таблице то поле, которое можно поставить в условие WHERE?

Имеется ввиду что заранее неизвестно имя такого поля. Которое по вашему совету можно воткнуть в имя кнопки submit.

Вот вы лично как бы достали это самое имя из результата? Ваш ответ и будет иллюстрацией насколько просто сделать datagrid на php
0
33 / 33 / 9
Регистрация: 26.07.2013
Сообщений: 148
03.09.2013, 19:32
Цитата Сообщение от sqlnub Посмотреть сообщение
никакого ид не фигурирует.
Ок. чтоб было понятно, почему в результате запроса будет ид, поменяем немного запрос
MySQL
1
SELECT id, login, password FROM table
Здесь мы просто указали какие поля вытягивать, а в предыдущем запросе вытягивались все поля.
Я бы строил таблицу следующим образом:
PHP
1
2
$sql = "SELECT * FROM table";
$result = mysql_query($sql);
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<table>
<?php while ($row = mysql_fetch_assoc($result)) {
<tr>
<form>
<td>
login
</td>
<td>
password
</td>
<td>
<input type="hidden" value=$row['id']>
<input type='submit' value='change'>
</td>
</form>
</tr>
}?>
</table>
0
Заблокирован
04.09.2013, 08:27
Цитата Сообщение от HWOARANG Посмотреть сообщение
<input type="hidden" value=$row['id']>
Это вы знаете что есть в вашей таблице поле id по которому можно задать условие и рассказываете это скрипту. Следовательно если скрипт откроет таблицу где это поле будет называться по-другому, например iden, cat_id, country_id, login, password - попытка что-то обновить как минимум вызовет сообщение об ошибке, как максимум обновятся все поля выбранной таблицы потому что запрос не найдет условия.

Ваш код в цитате поэтому не имеет смысла. На каждую таблицу придется писать свое приложение и составлять список для выбора приложений для открытия таблиц.

Кроме того, что будет с такой формой если в таблице 10000 записей?

Добавлено через 2 минуты
Цитата Сообщение от HWOARANG Посмотреть сообщение
Ок. чтоб было понятно, почему в результате запроса будет ид, поменяем немного запрос
Чтобы было понятно почему вы не можете прописать какое-то поле в качестве условия обновления, то повторю вопрос:

как приложение узнает какое поле ключевое если вы сами этого не знаете?

Добавлено через 1 час 59 минут
Тема вообще каноничная. Как обычно поступает программист? Слева у него окно с кодом, справа окно со структурой таблицы (ddl). Он пишет input type="text" name = "что_то_придумал[что_то_выдумал]", смотрит в ddl и пишет: value="$поле_из_таблицы". Дойдя до ключевого поля поглядывая в ddl пишет: input type="hidden" остальное по шаблону выше.

Затем левое окно становится справа, а слева появляется окно с кодом процессинга. Процесс повторяется. Теперь программист переписывает все отношения из одного php, в другой php.

Таким способом скрипт становится неотъемлемой частью БД со всеми вытекающими прелестями. Захотел добавить поле в таблицу - упомни об этом факте _во всех_ скриптах. Захотел удалить - обязан упомнить об этом факте _во всех_ скриптах.
0
33 / 33 / 9
Регистрация: 26.07.2013
Сообщений: 148
04.09.2013, 12:38
Цитата Сообщение от sqlnub Посмотреть сообщение
Кроме того, что будет с такой формой если в таблице 10000 записей?
Сделать пагинацию. Разве до этого сложно догадаться?
Цитата Сообщение от sqlnub Посмотреть сообщение
как приложение узнает какое поле ключевое если вы сами этого не знаете?
А что мне мешает его узнать? Зная название таблицы, можно узнать список и свойства всех столбцов в этой таблице.
Можно даже зная только название бд узнать список всех таблиц, а потом уже из каждой таблицы вытащить столбцы и их свойства.
0
Заблокирован
04.09.2013, 22:50
Ну вот, это и есть ответ насколько просто сделать datagrid на пхп.

Узнать свойства легко через fetch_field, однако их надо не только узнать, но и использовать. И не только в скрипте который читает данные, но и в скрипте который их записывает. Следовательно их как-то надо туда передать, чтобы второй раз не разбираться с тем же самым.

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

Чтобы отредактировать пачку строк потребуется собрать все отредактированое или как-то выделенное юзером. Пачку упаковать яваскриптом со всем барахлом и отгрузить. В результате вроде бы простая задача превращается в голимый геморрой.

И это только для одной таблицы. Чтобы редактировать связанные таблицы это геморрой в кубе.

Добавлено через 1 минуту
Кстати пагинация тянет за собой поиск, если вы забыли.

Добавлено через 6 минут
Самое смешное что в API mysqli вообще нет понятия курсора поскольку нет никакой постоянной связи между клиентом, который агент и бд, которая на сервере. В сессии ресурсы не сохраняются. Что пагинация, что шмагинация по одной записи вперед и назад идет через запросы которые хитромудро вычисляют то место в таблице, которое юзер захотел.
0
33 / 33 / 9
Регистрация: 26.07.2013
Сообщений: 148
05.09.2013, 15:18
Цитата Сообщение от sqlnub Посмотреть сообщение
Ну вот, это и есть ответ насколько просто сделать datagrid на пхп.
Видимо это ответ лишь для тебя. У меня такого вопроса не стояло, я уже сталкивался с подобной таблицей и ничего сложного не увидел. Единственное, я заранее знал уникальное поле и не вытягивал из базы. Хотя и в шапке сообщения я не увидел, что столбец не известен, но коль тебе так захотелось то и эту задачу можно легко решить.
Цитата Сообщение от sqlnub Посмотреть сообщение
Следовательно их как-то надо туда передать
тебе еще нужно объяснить как их передавать?
Цитата Сообщение от sqlnub Посмотреть сообщение
Однако в вашем проекте редактируется ровно 1 строка в любой момент времени
таких строк можно наделать на странице сколько угодно. Как это сделать тоже нужно объяснить?
Цитата Сообщение от sqlnub Посмотреть сообщение
Кстати пагинация тянет за собой поиск, если вы забыли.
Какой поиск? Поиск по базе? Ну тут уж выбирай или все записи на одной странице или выборка данных для нужной страницы. Хотя можно использовать временные таблицы.
Цитата Сообщение от sqlnub Посмотреть сообщение
Чтобы отредактировать пачку строк
Такой функции не будет. Особой нужды в этом не вижу. Можно конечно заморочиться, но зачем?
0
Заблокирован
06.09.2013, 09:10
Формат datagrid подразумевает что все кроме имени БД и ТБ заранее неизвестно. Типичный случай. У вас список таблиц из списка БД, щелкнули - развернулась. Какие там ключи, какие поля, как это все редактировать - придется разбираться по месту с каждой таблицей.

Если вы посмотрели в DDL и вписали в скрипт имя ключевого поля - это не datagrid.

Объясните, конечно. Как передавать флаги в контрольный скрипт?

Таких строк с кнопками можно наделать сколько угодно, но отредактировать можно будет только одну за одно нажатие кнопки submit.

Поиск по развернутой таблице. Если она вся влезла в браузер, искать можно браузером. Если не вся - придется делать поиск. Кроме того столбцы еще надо сделать ссылками на сортировку.

Что значит зачем редактировать пачкой? Потому что заколебешься редактировать десяток записей по-одной. Я понимаю вы написали - кто-то мучается. Если вы напишите что называется как для себя - сразу увидите в этом всю нужду.
0
33 / 33 / 9
Регистрация: 26.07.2013
Сообщений: 148
06.09.2013, 11:33
Цитата Сообщение от sqlnub Посмотреть сообщение
Если вы посмотрели в DDL и вписали в скрипт имя ключевого поля - это не datagrid.
автоматизировать данный процесс не составляет труда.
Цитата Сообщение от sqlnub Посмотреть сообщение
но отредактировать можно будет только одну за одно нажатие кнопки submit.
все правильно.
Цитата Сообщение от sqlnub Посмотреть сообщение
Если не вся - придется делать поиск.
был у меня и поиск. тоже никаких проблем.
Цитата Сообщение от sqlnub Посмотреть сообщение
Кроме того столбцы еще надо сделать ссылками на сортировку.
такой задачи не стояло и в шапке я такой задачи не вижу.
Цитата Сообщение от sqlnub Посмотреть сообщение
Потому что заколебешься редактировать десяток записей по-одной.
вводить количество символов одинаковое, только на пару нажатий кнопок больше. Это не сложно.
Цитата Сообщение от sqlnub Посмотреть сообщение
это не datagrid.
А где в шапке стоит задача сделать datagrid? Есть слово таблица. Таблица, в которой можно редактировать записи, все остальное лишь твой вымысел.
P.S.
Цитата Сообщение от sqlnub Посмотреть сообщение
Как передавать флаги в контрольный скрипт?
http://php.net/manual/ru/reser... s.post.php
http://www.php.net/manual/ru/r... es.get.php
http://www.php.su/phphttp/?cookies
http://www.php.su/articles/?cat=examples&page=070
0
Заблокирован
06.09.2013, 22:25
Цитата Сообщение от HWOARANG Посмотреть сообщение
автоматизировать данный процесс не составляет труда.
Ну да, на каждую таблицу сгенерить свой шаблон и станет зашибись. Все как обычно.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
07.09.2013, 10:59
Цитата Сообщение от sqlnub Посмотреть сообщение
Таких строк с кнопками можно наделать сколько угодно, но отредактировать можно будет только одну за одно нажатие кнопки submit.
Цитата Сообщение от HWOARANG Посмотреть сообщение
все правильно.
почему только одну?
0
33 / 33 / 9
Регистрация: 26.07.2013
Сообщений: 148
07.09.2013, 11:26
Цитата Сообщение от KOPOJI Посмотреть сообщение
почему только одну?
потому что каждая строка завернута в форму и если сабмитить строку то засабмитится только одна. Ну вообще можно изменить сколько угодно, но сабмитить по одной придется. То есть изменили данные в одной строке, сохранили, изменили в другой, сохранили. А не так: изменили в первой, во второй и третьей и все вместе сохранили.
Цитата Сообщение от sqlnub Посмотреть сообщение
Ну да, на каждую таблицу сгенерить свой шаблон и станет зашибись.
Не понимаю о чем ты.
0
Заблокирован
07.09.2013, 19:02
Об автоматизации переноса данных из DDL в скрипты.

На самом деле не все так просто, но и не так сложно чтобы не написать себе datagrid за несколько дней. Может быть даже за один если есть опыт и заготовки. Такие приложения как PMA писались годами коллективом энтузиастов, однако инлайновая правка появилась относительно недавно и работает совершенно уродски.

Основа datagrid конечно таблица. Редактировать ее саму можно, но к этому процессу как выяснилось никакие события не привязаны. Проще заиметь поля ввода связанные с каждым столбцом в количестве равном показанным столбцам. Поля в форме которая по умолчанию display:none. Юзер каким-то образом выражает желание изменить запись - форма появляется и все ее элементы, то есть поля ввода - тоже. Остается только перенести размер и координаты ячеек на эти поля чтобы они оказались ровно там, где юзер желает редактировать данные. Закончил - форма исчезает, с ней все барахло, данные из полей переносятся в таблицу и тут можно отметить что было изменено чтобы юзер видел свои следы. Например поменять цвет текста на красный в тех ячейках, где данные изменены. Так можно менять строку за строкой в любом месте таблицы. В финале юзер давит кнопку сохранить, яваскрипт собирает данные с подвергнутых правке строк, валит в поля и жмет submit форме.

Добавлено через 9 минут
имена таблиц, полей, флаги, типы передаются просто через имя инпута. Пользуясь особенностью php компилить изображение массива в массив все становится легко и просто. Например

PHP
1
name="mytable[tablefield][4097][254]"
В контрольном скрипте получится массив где все таблицы сгруппированы. Ну да, это если у вас больше чем 1 таблица задействована. Вполне понятно что если даже такое прилетит текстом - где-то вне php - превратить текст в массив даже проще чем разбирать готовый.

А вы четыре ссылки накидали в ответ на вопрос как передать флаг поля в обработку.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
07.09.2013, 21:33
Цитата Сообщение от HWOARANG Посмотреть сообщение
Ну вообще можно изменить сколько угодно, но сабмитить по одной придется. То есть изменили данные в одной строке, сохранили, изменили в другой, сохранили. А не так: изменили в первой, во второй и третьей и все вместе сохранили.
А кто мешает не выводить 100500 форм, а вывести все в одной?
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<form method="post">
....
<?php ....
while (....) : ?>
<input type="text" name="form[name][]">
..........
<?php endwhile; ?>
<input type="submit">
</form>
...........
<?php
if(isset($_POST['form']) && is_array($_POST['form'])) {
.........
}
0
Заблокирован
08.09.2013, 11:17
Если вывести все в одной форме будет 100500 полей. Из которых только может быть 1 использовано, а обновить придется все. Самое смешное что UPDATE не обновляет совпадающие значения, но поскольку обработчик не знает что не совпадает, ему придется посылать все.
0
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 11
20.06.2016, 23:35
Я нашел более простую и лучшую реализацию календаря на JS. Cамое главное в код внедрить пустяк.

Исходный код этого примера:
HTML5
1
2
3
4
5
6
7
<script src="calendar_ru.js" type="text/javascript"></script>
<form action="">
<p><big>Кликните на поле ввода даты для вызова календаря:</big><br> с <input type="text" value="dd-mm-yy" onfocus="this.select();lcs(this)"
    onclick="event.cancelBubble=true;this.select();lcs(this)"> по <input type="text" value="dd-mm-yy" onfocus="this.select();lcs(this)"
    onclick="event.cancelBubble=true;this.select();lcs(this)">
</p>
</form>
Содержимое файла calendar_ru.js
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
/* --- Swazz Javascript Calendar ---
/* --- v 1.0 3rd November 2006
By Oliver Bryant
[url]http://calendar.swazz.org[/url]
 
Update:
Gene Bechtold
[url]http://www.bechtold.biz[/url]
12/11/2011
 
C помощью разных добрых людей:
tullin
 */
 
function getObj(objID)
{
    if (document.getElementById) {return document.getElementById(objID);}
    else if (document.all) {return document.all[objID];}
    else if (document.layers) {return document.layers[objID];}
}
 
function checkClick(e) {
    e?evt=e:evt=event;
    CSE=evt.target?evt.target:evt.srcElement;
    if (CSE.tagName!='SPAN')
    if (getObj('fc'))
        if (!isChild(CSE,getObj('fc')))
            getObj('fc').style.display='none';
}
 
function isChild(s,d) {
    while(s) {
        if (s==d)
            return true;
        s=s.parentNode;
    }
    return false;
}
 
function Left(obj)
{
    var curleft = 0;
    if (obj.offsetParent)
    {
        while (obj.offsetParent)
        {
            curleft += obj.offsetLeft
            obj = obj.offsetParent;
        }
    }
    else if (obj.x)
        curleft += obj.x;
    return curleft;
}
 
function Top(obj)
{
    var curtop = 0;
    if (obj.offsetParent)
    {
        while (obj.offsetParent)
        {
            curtop += obj.offsetTop
            obj = obj.offsetParent;
        }
    }
    else if (obj.y)
        curtop += obj.y;
    return curtop;
}
 
// Calendar script
var now = new Date;
var sccd=now.getDate();
var sccm=now.getMonth();
var sccy=now.getFullYear();
var ccm=now.getMonth();
var ccy=now.getFullYear();
 
// For current selected date
var selectedd, selectedm, selectedy;
 
document.write('<table id="fc" style="position:absolute;border-collapse:collapse;background:#FFFFFF;border:1px solid #FFD088;display:none;-moz-user-select:none;-khtml-user-select:none;user-select:none;" cellpadding="2">');
document.write('<tr style="font:bold 13px Arial" onselectstart="return false"><td style="cursor:pointer;font-size:15px" onclick="upmonth(-1)">&laquo;</td><td colspan="5" id="mns" align="center"></td><td align="right" style="cursor:pointer;font-size:15px" onclick="upmonth(1)">&raquo;</td></tr>');
document.write('<tr style="background:#FF9900;font:12px Arial;color:#FFFFFF"><td align=center>П</td><td align=center>В</td><td align=center>С</td><td align=center>Ч</td><td align=center>П</td><td align=center>С</td><td align=center>В</td></tr>');
for(var kk=1;kk<=6;kk++) {
    document.write('<tr>');
    for(var tt=1;tt<=7;tt++) {
        num=7 * (kk-1) - (-tt);
        document.write('<td id="cv' + num + '" style="width:18px;height:18px">&nbsp;</td>');
    }
    document.write('</tr>');
}
document.write('<tr><td colspan="7" align="center" style="cursor:pointer;font:13px Arial;background:#FFC266" onclick="today()">Сегодня: '+addnull(sccd,sccm+1,sccy)+'</td></tr>');
document.write('</table>');
 
document.all?document.attachEvent('onclick',checkClick):document.addEventListener('click',checkClick,false);
 
 
 
 
var updobj;
function lcs(ielem) {
    updobj=ielem;
    getObj('fc').style.left=Left(ielem)+'px';
    getObj('fc').style.top=Top(ielem)+ielem.offsetHeight+'px';
    getObj('fc').style.display='';
 
    // First check date is valid
    curdt=ielem.value;
    curdtarr=curdt.split('-');
    isdt=true;
    for(var k=0;k<curdtarr.length;k++) {
        if (isNaN(curdtarr[k]))
            isdt=false;
    }
    if (isdt&(curdtarr.length==3)) {
        ccm=curdtarr[1]-1;
        ccy=curdtarr[2];
 
        selectedd=parseInt ( curdtarr[0], 10 );
        selectedm=parseInt ( curdtarr[1]-1, 10 );
        selectedy=parseInt ( curdtarr[2], 10 );
 
        prepcalendar(curdtarr[0],curdtarr[1]-1,curdtarr[2]);
    }
 
}
 
function evtTgt(e){
    var el;
    if(e.target)el=e.target;
    else if(e.srcElement)el=e.srcElement;
    if(el.nodeType==3)el=el.parentNode; // defeat Safari bug
    return el;
}
function EvtObj(e){if(!e)e=window.event;return e;}
function cs_over(e) {
    evtTgt(EvtObj(e)).style.background='#FFEBCC';
}
function cs_out(e) {
    evtTgt(EvtObj(e)).style.background='#FFFFFF';
}
function cs_click(e) {
    updobj.value=calvalarr[evtTgt(EvtObj(e)).id.substring(2,evtTgt(EvtObj(e)).id.length)];
    getObj('fc').style.display='none';
}
 
var mn=new Array('Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентрябрь','Октябрь','Ноябрь','Декабрь');
var mnn=new Array('31','28','31','30','31','30','31','31','30','31','30','31');
var mnl=new Array('31','29','31','30','31','30','31','31','30','31','30','31');
var calvalarr=new Array(42);
 
function f_cps(obj) {
    obj.style.background='#FFFFFF';
    obj.style.font='10px Arial';
    obj.style.color='#333333';
    obj.style.textAlign='center';
    obj.style.textDecoration='none';
    obj.style.border='1px solid #FFD088';//'1px solid #606060';
    obj.style.cursor='pointer';
}
 
function f_cpps(obj) {
    obj.style.background='#C4D3EA';
    obj.style.font='10px Arial';
    obj.style.color='#FF9900';
    obj.style.textAlign='center';
    obj.style.textDecoration='line-through';
    obj.style.border='1px solid #6487AE';
    obj.style.cursor='default';
}
 
function f_hds(obj) {
    obj.style.background='#FFF799';
    obj.style.font='bold 10px Arial';
    obj.style.color='#333333';
    obj.style.textAlign='center';
    obj.style.border='1px solid #6487AE';
    obj.style.cursor='pointer';
}
 
// day selected
function prepcalendar(hd,cm,cy) {
    now=new Date();
    sd=now.getDate();
    td=new Date();
    td.setDate(1);
    td.setFullYear(cy);
    td.setMonth(cm);
    cd=td.getDay();
    if (cd==0)cd=6; else cd--;
    getObj('mns').innerHTML=mn[cm]+'&nbsp;<span style="cursor:pointer" onclick="upmonth(-12)">&lt;</span>'+cy+'<span style="cursor:pointer" onclick="upmonth(12)">&gt;</span>';
    marr=((cy%4)==0)?mnl:mnn;
    for(var d=1;d<=42;d++) {
        cv=getObj('cv'+parseInt(d));
        f_cps(cv);
        if ((d >= (cd -(-1)))&&(d<=cd-(-marr[cm]))) {
            dip=((d-cd < sd)&&(cm==sccm)&&(cy==sccy));
            htd=((hd!='')&&(d-cd==hd));
 
            cv.onmouseover=cs_over;
            cv.onmouseout=cs_out;
            cv.onclick=cs_click;
 
            // if today
            if (sccm == cm && sccd == (d-cd) && sccy == cy)
                cv.style.color='#FF9900';
 
            // if selected date
            if (cm == selectedm && cy == selectedy && selectedd == (d-cd) )
            {
                cv.style.background='#FFEBCC';
                //cv.style.color='#e0d0c0';
                //cv.style.fontSize='1.1em';
                //cv.style.fontStyle='italic';
                //cv.style.fontWeight='bold';
 
                // when use style.background
                cv.onmouseout=null;
            }
 
            cv.innerHTML=d-cd;
 
            calvalarr[d]=addnull(d-cd,cm-(-1),cy);
        }
        else {
            cv.innerHTML='&nbsp;';
            cv.onmouseover=null;
            cv.onmouseout=null;
            cv.onclick=null;
            cv.style.cursor='default';
            }
    }
}
 
prepcalendar('',ccm,ccy);
 
function upmonth(s)
{
    marr=((ccy%4)==0)?mnl:mnn;
 
    ccm+=s;
    if (ccm>=12)
    {
        ccm-=12;
        ccy++;
    }
    else if(ccm<0)
    {
        ccm+=12;
        ccy--;
    }
    prepcalendar('',ccm,ccy);
}
 
function today() {
    updobj.value=addnull(now.getDate(),now.getMonth()+1,now.getFullYear());
    getObj('fc').style.display='none';
    prepcalendar('',sccm,sccy);
}
 
function addnull(d,m,y)
{
    var d0='',m0='';
    if (d<10)d0='0';
    if (m<10)m0='0';
 
    return ''+d0+d+'-'+m0+m+'-'+y;
}

Если подробнее, то там:https://htmlweb.ru/java/example/calendar.php
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.06.2016, 23:35
Помогаю со студенческими работами здесь

Изменение данных в таблицах базы данных
Здравствуйте! Есть база данных. Сформированы ограничения целостности. База подключена к QT. За исключением одной детали, всё работает так,...

Связь данных в таблицах
5 таблиц:Преподаватель,дисциплина,занятие,аудитория,группа.Но нас интересуют только первые три.Таблица препод связана с таблицей...

Замена данных в таблицах
Добрый день. Возникла следующая проблема: Есть работающая БД (Access 2010). В нее вносятся данные о посетителях, их заказах и пр....

Сравнение данных в таблицах
Есть два DataSet, как можно сравнить равны они или нет? Или как сравнить DataGrid данные?

Поиск данных в таблицах!
ПОМОГИТЕ ПОЖАЛУСТА! Дано справочник, записи которого содержат такую ​​информациюЖкод книги, автор, название книги, издательство, год...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru