Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: базы данных
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
feodor
15 / 15 / 5
Регистрация: 26.05.2017
Сообщений: 151
1

Сохранение изменений в БД

28.09.2018, 22:25. Просмотров 585. Ответов 34
Метки нет (Все метки)

Идея: создать таблицу библиотечного фонда с возможностью изменения.
Что есть:
PHPHTML
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
<?php
header('Content-Type: text/html; charset= utf-8');
print '<body bgcolor="#008000">';
$link = mysqli_connect('localhost', "root", '', 'ldb');
if ( !$link ) die("Error");
mysqli_query($link, "SET NAMES 'utf8'");
 
 
// Select 1 from table_name will return false if the table does not exist.
$val = mysql_query('select 1 from `books` LIMIT 1');
 
if($val !== FALSE)
{
   //DO SOMETHING! IT EXISTS!
}
else
{
    //I can't find it...
    $query = 'CREATE TABLE books(
    id       VARCHAR(20),
    name    VARCHAR(120),
    avtor    VARCHAR(120),
    normal_place    VARCHAR(220), 
    who_get    VARCHAR(120)
)';
    if (mysqli_query($link, $query)) echo "Создаю новую таблицу...";
}
 
//$query = 'DROP TABLE books';
//    if (mysqli_query($link, $query)) echo "Успешно удалено";
 
 
 
//$query = "INSERT INTO books (id, name,avtor, normal_place, who_get) VALUE ('id', 'name', 'avtor', 'normal_place', 'who_get')";
//mysqli_query($link, $query);
 
 
 
$query   =  "SELECT * FROM books";
$result  =  mysqli_query( $link,  $query );
 
echo '<table border="1", align="center", bgcolor="#808000">';
echo '<thead>';
echo '<td>'."Инвентаризационный номер".'</td>';
echo '<td>'."Имя Книги".'</td>';
echo '<td>'."Автор".'</td>';
echo '<td>'."Где должна лежать".'</td>';
echo '<td>'."У кого на руках".'</td>';
echo '</thead>';
do{
    echo '<tr>';
    echo '<td>'.$myrow['id'].'</td>';
    echo '<td>'.$myrow['name'].'</td>';
    echo '<td>'.$myrow['avtor'].'</td>';
    echo '<td>'.$myrow['normal_place'].'</td>';
    echo '<td>'.$myrow['who_get'].'</td>';
    echo '</tr>';
}while ($myrow = mysqli_fetch_array($result));
echo '</table>';
 
 
    
    mysqli_close($link);
?>
Тут все легко... Дальше перепишем do-while как-то так
PHPHTML
1
2
3
...
echo '<td>'.'<input type="text" name="name" value='.$myrow['id'].' size="20" maxlength="20" style="background-color: #808000"/>'.'</td>';
...
Но как сохранять изменения в MySQL? POST-PHP выглядит не очень: а вдруг ограничение по длине подхватим, да и криво как-то.

Можно ли значения input-ов как-то по-другому схватить?

Если нет, то как удобнее будет отправить и получить таблицу через POST?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2018, 22:25
Ответы с готовыми решениями:

Сохранение изменений в таблице
У меня есть таблица, которая генерируется выборкой из бд. Собственно вот она. Как мне сделать...

Сохранение и вывод в админ панель изменений таблицы
Всем привет! Делаю свой сайт, задался вопросом. Есть таблица users, есть строчки id, name,...

Несколько изменений БД
Здравствуйте. У меня такой вопрос. Допустим у меня выполнились какие-то условия и мне нужно сделать...

Внесение пользователем изменений
Есть таблица, надо чтоб каждый пользователь мог изменить информацию ячейки( ТЕКСТ, ИЗОБРАЖЕНИЕ) , и...

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

34
Phantom-84
269 / 224 / 62
Регистрация: 15.09.2017
Сообщений: 1,065
29.09.2018, 11:46 2
Зачем тут пытаться создавать таблицу. Вынесите это в установочный скрипт.

Форму редактирования лучше вынести на отдельную страницу (или в модальное окно). Если предполагается, что это будет просматривать кто-то еще, то для редактирования нужно предусмотреть механизм авторизации.

Цитата Сообщение от feodor Посмотреть сообщение
do-while
Просто while.

Цитата Сообщение от feodor Посмотреть сообщение
Но как сохранять изменения в MySQL? POST-PHP выглядит не очень: а вдруг ограничение по длине подхватим, да и криво как-то.
При поэлементном сохранении нужно сильно постараться, чтобы подхватить. Сделайте так:
GET /books/1 - форма редактирования книги 1;
POST /books/1 - сохранение данных книги 1, быть может кроме самого id и не изменившихся полей.

Сам список выводите по
GET /books

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

Добавлено через 2 минуты
Цитата Сообщение от feodor Посмотреть сообщение
value='.$myrow['id'].'
Как выше написал, это поле можно полностью исключить из формы. Я Обычно делаю отдельные функции для редактирования/сохранения основных данных и для редактирования/сохранения идентификаторов.

Добавлено через 1 минуту
Думаю, для книг можно использовать числовые автоинкрементальные идентификаторы.
1
feodor
15 / 15 / 5
Регистрация: 26.05.2017
Сообщений: 151
29.09.2018, 12:27  [ТС] 3
Phantom-84, я вообще собираюсь сделать страницу без авторизации, где нельзя ничего править, и страницу для редактирования. Это выглядит здраво:
Цитата Сообщение от Phantom-84 Посмотреть сообщение
Для авторизованного пользователя с правом редактирования сюда же можно добавить формы создания и удаления, а также ссылки для редактирования. Либо использовать разные представления, например на главной странице выводить публичный список, а раздел /books сделать полностью закрытым.
Цитата Сообщение от Phantom-84 Посмотреть сообщение
Как выше написал, это поле можно полностью исключить из формы. Я Обычно делаю отдельные функции для редактирования/сохранения основных данных и для редактирования/сохранения идентификаторов.
- это поле для инвентаризационного номера(книги в библиотеке), а он меняется чаще, чем автор книги... Может не стоит?
Цитата Сообщение от Phantom-84 Посмотреть сообщение
Зачем тут пытаться создавать таблицу. Вынесите это в установочный скрипт. Форму редактирования лучше вынести на отдельную страницу (или в модальное окно)
- ИМХО удобнее будет редактировать не одно окно, а всю таблицу, но чтобы случайно не нажать, вынести действительно стоит.

Как мне поэтапно передать всю таблицу(или то, что изменилось)?

Добавлено через 8 минут
Может отправить форму js-у, а он уже разобьет на части и отправит post-ом?
0
Phantom-84
269 / 224 / 62
Регистрация: 15.09.2017
Сообщений: 1,065
29.09.2018, 12:45 4
Цитата Сообщение от feodor Посмотреть сообщение
это поле для инвентаризационного номера(книги в библиотеке), а он меняется чаще, чем автор книги... Может не стоит?
Сделайте для инвентаризационного номера отдельное поле и задайте для него уникальный индекс.

Цитата Сообщение от feodor Посмотреть сообщение
но чтобы случайно не нажать, вынести действительно стоит
Вот именно. Это основы проектирования интерфейсов.

Цитата Сообщение от feodor Посмотреть сообщение
Как мне поэтапно передать всю таблицу(или то, что изменилось)?
Не поэтапно. А только данные одной книги. На странице редактирования создаете форму для одной книги. Кнопкой "Сохранить" передаете все данные методом POST, быть может кроме идентификатора, для которого не нужно создавать поле формы, даже скрытое, - используйте адрес для передачи id. В обработчике по переданному id первоначально считываете соответствующую запись, чтобы проверить ее существование, получить список (названий) полей, и далее сопоставляете полученные от клиента и из базы данных поля и их значения. "Недействительные" поля и не изменившиеся по сравнению с текущими значения полей "отбрасываете". Все остальное записываете в базу данных.

Добавлено через 2 минуты
Цитата Сообщение от feodor Посмотреть сообщение
Может отправить форму js-у, а он уже разобьет на части и отправит post-ом?
Может. Только не нужно ничего разбивать. Отправляйте данные также отдельными записями. Или даже полями.
1
feodor
15 / 15 / 5
Регистрация: 26.05.2017
Сообщений: 151
29.09.2018, 21:31  [ТС] 5
PHPHTML
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
<?php
header('Content-Type: text/html; charset= utf-8');
print '<body bgcolor="#008000">';
$link = mysqli_connect('localhost', "root", '', 'ldb');
if ( !$link ) die("Error");
mysqli_query($link, "SET NAMES 'utf8'");
 
 
// Select 1 from table_name will return false if the table does not exist.
$val = mysql_query('select 1 from `books` LIMIT 1');
 
if($val !== FALSE)
{
   //DO SOMETHING! IT EXISTS!
}
else
{
    //I can't find it...
    $query = 'CREATE TABLE books(
    id       VARCHAR(20),
    name    VARCHAR(120),
    avtor    VARCHAR(120),
    normal_place    VARCHAR(220), 
    who_get    VARCHAR(120)
)';
    if (mysqli_query($link, $query)) echo "Создаю новую таблицу...";
}
 
//$query = 'DROP TABLE books';
//    if (mysqli_query($link, $query)) echo "Успешно удалено";
 
 
 
//$query = "INSERT INTO books (id, name,avtor, normal_place, who_get) VALUE ('id', 'name', 'avtor', 'normal_place', 'who_get')";
//mysqli_query($link, $query);
 
if (isset($_POST))
{
    
 
 
}
 
$query   =  "SELECT * FROM books";
$result  =  mysqli_query( $link,  $query );
 
echo '<script type="text/javascript" src="jquery-3.3.1.js">';
echo 'function send(data){';
echo '  $.ajax({';
echo '      type: "POST",';
echo '      url: \'update.php\',';
echo '      data: {c:data}';
echo '  });';
echo '{';
echo '</script>';
echo '<form action=send()>';
echo ' <p align="center"><input type="submit" value="Сохранить"/></p>';
echo '<table border="1", align="center", bgcolor="#808000">';
echo '<thead>';
echo '<td>'."Инвентаризационный номер".'</td>';
echo '<td>'."Имя Книги".'</td>';
echo '<td>'."Автор".'</td>';
echo '<td>'."Где должна лежать".'</td>';
echo '<td>'."У кого на руках".'</td>';
echo '</thead>';
while ($myrow = mysqli_fetch_array($result)){
    echo '<tr>';
    echo '<td>'.'<input type="text" name="name" value="'.$myrow['id'].'" size="30" maxlength="100" style="background-color: #808000"/>'.'</td>';
    echo '<td>'.'<input type="text" name="name" value="'.$myrow['name'].'" size="30" maxlength="100" style="background-color: #808000"/>'.'</td>';
    echo '<td>'.'<input type="text" name="name" value="'.$myrow['avtor'].'" size="30" maxlength="100" style="background-color: #808000"/>'.'</td>';
    echo '<td>'.'<input type="text" name="name" value="'.$myrow['normal_place'].'" size="30" maxlength="100" style="background-color: #808000"/>'.'</td>';
    echo '<td>'.'<input type="text" name="name" value="'.$myrow['who_get'].'" size="30" maxlength="100" style="background-color: #808000"/>'.'</td>';
    echo '</tr>';
}
echo '</table>';
echo ' <p align="center"><input type="submit" value="Сохранить"/></p></form>';
 
    
    mysqli_close($link);
?>
Надо в send как-то передать данные с полей.

Добавлено через 7 часов 46 минут
PHPHTML
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
<?php
header('Content-Type: text/html; charset= utf-8');
print '<body bgcolor="#008000">';
$link = mysqli_connect('localhost', "root", '', 'ldb');
if ( !$link ) die("Error");
mysqli_query($link, "SET NAMES 'utf8'");
 
 
// Select 1 from table_name will return false if the table does not exist.
$val = mysql_query('select 1 from `books` LIMIT 1');
 
if($val !== FALSE)
{
   //DO SOMETHING! IT EXISTS!
}
else
{
    //I can't find it...
    $query = 'CREATE TABLE books(
    id       VARCHAR(20),
    name    VARCHAR(120),
    avtor    VARCHAR(120),
    normal_place    VARCHAR(220), 
    who_get    VARCHAR(120)
)';
    if (mysqli_query($link, $query)) echo "Создаю новую таблицу...";
}
 
//$query = 'DROP TABLE books';
//    if (mysqli_query($link, $query)) echo "Успешно удалено";
 
 
 
//$query = "INSERT INTO books (id, name,avtor, normal_place, who_get) VALUE ('id', 'name', 'avtor', 'normal_place', 'who_get')";
//mysqli_query($link, $query);
 
if (isset($_POST))
{
    
 
 
}
 
$query   =  "SELECT * FROM books";
$result  =  mysqli_query( $link,  $query );
 
echo '<script type="text/javascript" src="jquery-3.3.1.js"></script>';
echo '<script type="text/javascript" language="javascript">
    function call() {
      var msg   = $(\'#formx\').serialize();
        $.ajax({
          type: \'POST\',
          url: \'update.php\',
          data: msg,
          success: function(data) {
            alert("Данные обновлены!");/* #! */
            $(\'#results\').html(data);
          },
          error:  function(xhr, str){
        alert(\'Возникла ошибка: \' + xhr.responseCode);
          }
        });
 
    }
</script>';    
echo '</script>';
echo '<form method="POST" id="formx" action="javascript:void(null);" onsubmit="call()">';
echo ' <p align="center"><input type="submit" value="Сохранить"/></p>';
echo '<table border="1", align="center", bgcolor="#808000">';
echo '<thead>';
echo '<td>'."Инвентаризационный номер".'</td>';
echo '<td>'."Имя Книги".'</td>';
echo '<td>'."Автор".'</td>';
echo '<td>'."Где должна лежать".'</td>';
echo '<td>'."У кого на руках".'</td>';
echo '</thead>';
$n=0;
while ($myrow = mysqli_fetch_array($result)){
    $n+=$n;
    echo '<tr>';
    echo '<td>'.'<input type="text" name="id'.$n.'" value="'.$myrow['id'].'" size="30" maxlength="100" style="background-color: #808000"/>'.'</td>';
    echo '<td>'.'<input type="text" name="name'.$n.'" value="'.$myrow['name'].'" size="30" maxlength="100" style="background-color: #808000"/>'.'</td>';
    echo '<td>'.'<input type="text" name="avtor'.$n.'" value="'.$myrow['avtor'].'" size="30" maxlength="100" style="background-color: #808000"/>'.'</td>';
    echo '<td>'.'<input type="text" name="normal_place'.$n.'" value="'.$myrow['normal_place'].'" size="30" maxlength="100" style="background-color: #808000"/>'.'</td>';
    echo '<td>'.'<input type="text" name="who_get'.$n.'" value="'.$myrow['who_get'].'" size="30" maxlength="100" style="background-color: #808000"/>'.'</td>';
    echo '</tr>';
}
echo '</table>';
echo ' <p align="center"><input type="submit" value="Сохранить"/></p></form>';
 
echo '<div id="results">вывод</div>'; #!  
    mysqli_close($link);
?>
Данные отправляются, теперь их надо нормально принять.

Добавлено через 8 минут
PHPHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
header('Content-Type: text/html; charset= utf-8');
$link = mysqli_connect( 'localhost',  "root",  '',  'ldb' );
if (  !$link  )  die( "Error" );
 
$query = "INSERT INTO books (id, name,avtor, normal_place, who_get) VALUE ($_POST)";
 
if (  mysqli_query($link, $query)  ) echo "Данные обновлены.";
else echo "Ошибка: "  .  mysqli_error();
 
#echo htmlspecialchars($_POST);
#
echo "<pre>";
    print_r($_POST);
echo "</pre>";
#
mysqli_close( $link );
?>
Надо переделать $query = "INSERT INTO books (id, name,avtor, normal_place, who_get) VALUE ($_POST)";

Добавлено через 33 минуты
PHPHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
header('Content-Type: text/html; charset= utf-8');
$link = mysqli_connect( 'localhost',  "root",  '',  'ldb' );
if (  !$link  )  die( "Error" );
 
$n=-1;
while (1){
    $n+=1;
    if (!isset($_POST[id$n])) break;
    $query = "INSERT INTO books (id, name, avtor, normal_place, who_get) VALUE ( '$_POST[id$n]', '$_POST[name$n]', '$_POST[avtor$n]', '$_POST[normal_place$n]', '$_POST[who_get$n]')";
if (  mysqli_query($link, $query)  ) echo "Данные обновлены.";
else echo "Ошибка: "  .  mysqli_error($link);
}
 
#echo htmlspecialchars($_POST);
#
echo "<pre>";
    print_r($_POST);
    echo $_POST[id0];
echo "</pre>";
#
mysqli_close( $link );
?>
Parse error: syntax error, unexpected T_VARIABLE, expecting ']' in update.php on line 10
0
Пифагор
Модератор
1215 / 1007 / 527
Регистрация: 10.01.2015
Сообщений: 3,391
29.09.2018, 21:32 6
Цитата Сообщение от feodor Посмотреть сообщение
Надо переделать $query = "INSERT INTO books (id, name,avtor, normal_place, who_get) VALUE ($_POST)";
Вы передаете значение кнопки submit. Что Вы этим хотите добиться? В каждое поле таблицы надо передавать какое-либо значение. 5 полей - 5 значений.
Создайте переменные со значениями из текстовых полей:
PHP
1
2
3
4
$id = $myrow['id'];
//и т. д.
 
$query = "INSERT INTO books (id, name,avtor, normal_place, who_get) VALUE ($id, $name, $avtor, $normal_place, $who_get)";
Добавлено через 52 секунды
Цитата Сообщение от feodor Посмотреть сообщение
Parse error: syntax error, unexpected T_VARIABLE, expecting ']' in update.php on line 10
id$n Это что???
Плюс Вы переменные в кавычки взяли. Это не верно.
1
feodor
15 / 15 / 5
Регистрация: 26.05.2017
Сообщений: 151
29.09.2018, 22:19  [ТС] 7
А в bat прокатывало... На что мне заменить это гениальное (нет) решение?
Кстати, он и с кавычками работал, но без id$n.
0
Phantom-84
269 / 224 / 62
Регистрация: 15.09.2017
Сообщений: 1,065
29.09.2018, 23:13 8
Цитата Сообщение от feodor Посмотреть сообщение
На что мне заменить это гениальное (нет) решение?
Я вам написал, но вас, видимо, это не особо заинтересовало.

Между использованием AJAX и неиспользованием нет особой разницы. Более того, обычно AJAX дублируется обычным способом.

И изменение - это UPDATE, а не INSERT. А создание можно реализовать через "изменение" одной кнопкой, если использовать автоинкрементальные идентификаторы, а не задавать их вручную. Здесь бы был полезен какой-нибудь REST-каркас, который выполнял часть черновой работы самостоятельно. Могу предложить что-нибудь совсем простое. Чтобы вы даже ответвления для POST-обработчиков делали самостоятельно. Или можно сформировать индекс (номер) функции для полного набора функций, а потом вызывать их по этому номеру, например сформировать такое API:
0 GET /books - вывод списока;
1 POST /books - создание и удаление записей;
2 GET /books/1 - уже писал (эта же функция будет использоваться при создании);
3 POST /books/1 - уже писал.

Понятно, как сформировать индекс функции. В обработчике коллекции books нужно сделать примерно следующее:
PHP
1
2
$index=$_SERVER['REQUEST_METHOD']=[=]='POST'?1:0;
if (isset($object)) $index|=2;
0
feodor
15 / 15 / 5
Регистрация: 26.05.2017
Сообщений: 151
02.10.2018, 17:20  [ТС] 9
В общем, сделал по-своему:
index.php
PHPHTML
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
<?php
header('Content-Type: text/html; charset= utf-8');
print '<body bgcolor="#008000">';
$link = mysqli_connect('localhost', "root", '', 'ldb');
if ( !$link ) die("Error");
mysqli_query($link, "SET NAMES 'utf8'");
 
 
// Select 1 from table_name will return false if the table does not exist.
$val = mysql_query('select 1 from `books` LIMIT 1');
 
if($val !== FALSE)
{
   //DO SOMETHING! IT EXISTS!
}
else
{
    //I can't find it...
    $query = 'CREATE TABLE books(
    sisid SMALLINT,
    id       VARCHAR(20),
    name    VARCHAR(120),
    avtor    VARCHAR(120),
    normal_place    VARCHAR(220), 
    who_get    VARCHAR(120)
)';
    if (mysqli_query($link, $query)) echo "Создаю новую таблицу...";
}
 
/* $query = 'DROP TABLE books';
if (mysqli_query($link, $query)) echo "Успешно удалено"; */
 
 
/* if ($sisid = mysqli_query($link, "SELECT COUNT(1) FROM books")) {
    $sisid = mysqli_fetch_array( $sisid );
    $sisid=$sisid[0]+1;
}
else {
    $sisid=0;
}
$query = 'INSERT INTO books (sisid, id, name, avtor, normal_place, who_get) VALUE (\''.$sisid.'\', \'id\', \'name\', \'avtor\', \'normal_place\', \'who_get\')';
//echo $query;
mysqli_query($link, $query); */
 
 
 
$query   =  "SELECT * FROM books";
$result  =  mysqli_query( $link,  $query );
 
echo '<script type="text/javascript" src="jquery-3.3.1.js"></script>';
//Обновить
echo '<script type="text/javascript" language="javascript">
    function update() {
      var msg   = $(\'#formx\').serialize();
        $.ajax({
          type: \'POST\',
          url: \'update.php\',
          data: msg,
          success: function(data) {
            alert("Данные обновлены!");/* #! */
            $(\'#results\').html(data);
          },
          error:  function(xhr, str){
        alert(\'Возникла ошибка: \' + xhr.responseCode);
          }
        });
 
    }
</script>';
//Добавить
echo '<script type="text/javascript" language="javascript">
    function add() {
    $.ajax({
        type: "POST",
        url: \'add.php\',
    });
}
</script>'; 
//Удалить   
echo '<script type="text/javascript" language="javascript">
    function deleten(number){
    document.getElementById(\'tr\'+number).hidden = true;
    $.ajax({
        type: "POST",
        url: \'delete.php\',
        data: {n:number},
    });
}
</script>';  
echo '<form method="POST" id="formx" action="javascript:void(null);" onsubmit="update()">';
echo ' <p align="center"><input type="submit" value="Сохранить"/></p>';
echo '<table border="1", align="center", bgcolor="#808000">';
echo '<thead>';
echo '<td>'."Инвентаризационный номер".'</td>';
echo '<td>'."Имя Книги".'</td>';
echo '<td>'."Автор".'</td>';
echo '<td>'."Где должна лежать".'</td>';
echo '<td>'."У кого на руках".'</td>';
echo '</thead>';
$n=-1;
while ($myrow = mysqli_fetch_array($result)){
    $n+=1;
    $n2=$n+1;
    echo '<tr id="tr'.$n2.'">';
    echo '<td>'.'<input type="text" name="id'.$n.'" value="'.$myrow['id'].' " size="30" maxlength="100" style="background-color: #808000"/>'.'</td>';
    echo '<td>'.'<input type="text" name="name'.$n.'" value="'.$myrow['name'].' " size="30" maxlength="100" style="background-color: #808000"/>'.'</td>';
    echo '<td>'.'<input type="text" name="avtor'.$n.'" value="'.$myrow['avtor'].' " size="30" maxlength="100" style="background-color: #808000"/>'.'</td>';
    echo '<td>'.'<input type="text" name="normal_place'.$n.'" value="'.$myrow['normal_place'].' " size="30" maxlength="100" style="background-color: #808000"/>'.'</td>';
    echo '<td>'.'<input type="text" name="who_get'.$n.'" value="'.$myrow['who_get'].' " size="30" maxlength="100" style="background-color: #808000"/>'.'</td>';
    echo '<td>'.'<input type="button" name="button" value="Удалить" style="background-color: #808000" onclick="deleten('.$n2.')"/></td>';
    echo '</tr>';
}
echo '</table>';
echo ' <p align="center"><input type="submit" value="Сохранить"/></p></form>';
echo ' <p align="center"><input type="button" value="Добавить" onclick="add()"/></p></form>';
 
echo '<div id="results">вывод</div>'; #!  
    mysqli_close($link);
?>
delete.php
PHPHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
header('Content-Type: text/html; charset= utf-8');
print_r($_POST);
$link = mysqli_connect('localhost', "root", '', 'ldb');
if ( !$link ) die("Error");
mysqli_query($link, "SET NAMES 'utf8'");
$query = 'DELETE FROM books WHERE sisid = \''.$_POST["n"].'\'';
echo $query;
mysqli_query($link, $query);
 
$query   =  "SELECT * FROM books";
$result  =  mysqli_query( $link,  $query );
$n=0;
while ($myrow = mysqli_fetch_array($result)){
    $n=$n+1;
    $n2=$n+1;
    if (!($n<$_POST["n"])) {
        $query = 'UPDATE books set sisid=\''.$n.'\' WHERE sisid=\''.$n2.'\'';
        mysqli_query($link, $query);
    }
 
}
mysqli_close($link);
?>
update.php
PHPHTML
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
<?php
header('Content-Type: text/html; charset= utf-8');
$link = mysqli_connect( 'localhost',  "root",  '',  'ldb' );
if (  !$link  )  die( "Error" );
 
$n=-1;
while (1){
    $n+=1;
    $idn='id'.$n;
    $namen='name'.$n;
    $avtorn='avtor'.$n;
    $normal_placen='normal_place'.$n;
    $who_getn='who_get'.$n;
    $sisidn=$n+1;
    if (!isset($_POST[$idn])) break;
    #$query = 'INSERT INTO books (id, name, avtor, normal_place, who_get) VALUE ( '.$_POST[$idn].', '.$_POST[$namen].', '.$_POST[$avtorn].', '.$_POST[$normal_placen].', '.$_POST[$who_getn].')';
    $query = 'UPDATE books set id=\''.$_POST[$idn].'\', name=\''.$_POST[$namen].'\', avtor=\''.$_POST[$avtorn].'\', normal_place=\''.$_POST[$normal_placen].'\', who_get=\''.$_POST[$who_getn].'\' WHERE sisid=\''.$sisidn.'\'';
if (  mysqli_query($link, $query)  ) echo "Данные обновлены.";
else echo "Ошибка: "  .  mysqli_error($link);
}
 
#echo htmlspecialchars($_POST);
#
echo "<pre>";
    print_r($_POST);
    echo $idn;
    echo $_POST[$idn];
echo "</pre>";
#
mysqli_close( $link );
?>
add.php
PHPHTML
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
<?php
header('Content-Type: text/html; charset= utf-8');
$link = mysqli_connect('localhost', "root", '', 'ldb');
if ( !$link ) die("Error");
mysqli_query($link, "SET NAMES 'utf8'");
 
 
// Select 1 from table_name will return false if the table does not exist.
$val = mysql_query('select 1 from `books` LIMIT 1');
 
if($val !== FALSE)
{
   //DO SOMETHING! IT EXISTS!
}
else
{
    //I can't find it...
    $query = 'CREATE TABLE books(
    sisid SMALLINT,
    id       VARCHAR(20),
    name    VARCHAR(120),
    avtor    VARCHAR(120),
    normal_place    VARCHAR(220), 
    who_get    VARCHAR(120)
)';
    if (mysqli_query($link, $query)) echo "Создаю новую таблицу...";
}
 
 
if ($sisid = mysqli_query($link, "SELECT COUNT(1) FROM books")) {
    $sisid = mysqli_fetch_array( $sisid );
    $sisid=$sisid[0]+1;
}
else {
    $sisid=0;
}
$query = 'INSERT INTO books (sisid, id, name, avtor, normal_place, who_get) VALUE (\''.$sisid.'\', \'\', \'\', \'\', \'\', \'\')';
//echo $query;
mysqli_query($link, $query);
 
 
 
 
 
 
 
 
mysqli_close($link);
?>
Добавлено через 3 минуты
Вот только загрузка index.php долгая из-за mysql. Поэтому надо с помощью js реализовать вот что:
1)При удалении строчка скрывается(уже сделано), и уже не отправляется при сохранении
2)При добавлении строчка сразу появляется(без перезагрузки страницы)

Добавлено через 2 минуты
Phantom-84, нормальные герои всегда идут в обход.
0
feodor
15 / 15 / 5
Регистрация: 26.05.2017
Сообщений: 151
02.10.2018, 17:23  [ТС] 10
Вот интерфейс
0
Миниатюры
Сохранение изменений в БД  
feodor
15 / 15 / 5
Регистрация: 26.05.2017
Сообщений: 151
03.10.2018, 10:48  [ТС] 11
Javascript
1
$(\'#tr\'+number).remove();
Добавлено через 2 часа 49 минут
Для 2) попробуем jquery .html

Добавлено через 10 часов 15 минут
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
<script type="text/javascript" language="javascript">
    function deleten(number){
    /* document.getElementById('tr'+number).hidden = true; */
    $('#tr'+number).hide( 300, function() {
        $(this).remove();
        });
    $.ajax({
        type: "POST",
        url: 'delete.php',
        data: {n:number},
    });
}
</script>
Добавлено через 37 минут
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<script type="text/javascript" language="javascript">
    function update() {
      var msg   = $('#formx').serialize();
        $.ajax({
          type: 'POST',
          url: 'update.php',
          data: msg,
          success: function(data) {
            alert("Данные обновлены!");/* #! */
            $('#results').html(data);
          },
          error:  function(xhr, str){
        alert('Возникла ошибка: ' + xhr.responseCode);
          }
        });
 
    }
</script>
update.php видит это так:
Кликните здесь для просмотра всего текста
[id0] =>
[name0] =>
[avtor0] =>
[normal_place0] =>
[who_get0] =>
[id1] =>
[name1] =>
[avtor1] =>
[normal_place1] => 9
[who_get1] =>
[id2] =>
[name2] => 1
[avtor2] =>
[normal_place2] =>
[who_get2] =>
[id3] =>
[name3] =>
[avtor3] => 2
[normal_place3] =>
[who_get3] => 8
[id4] =>
[name4] =>
[avtor4] =>
[normal_place4] =>
[who_get4] =>
[id5] =>
[name5] =>
[avtor5] =>
[normal_place5] =>
[who_get5] =>
[id6] =>
[name6] =>
[avtor6] =>
[normal_place6] => 4
[who_get6] =>
[id7] =>
[name7] => 6
[avtor7] =>
[normal_place7] =>
[who_get7] =>
[id8] =>
[name8] =>
[avtor8] =>
[normal_place8] =>
[who_get8] =>
etc.

Разумеется, имена input-ов должны быть уникальными, идти по-порядку без пропусков в цифрах(так не надо: id3 ... id5).
Можно переписать update так, чтобы мы получали на входе белиберду с одинаковыми именами, а отправляли все как надо?
0
Phantom-84
269 / 224 / 62
Регистрация: 15.09.2017
Сообщений: 1,065
03.10.2018, 11:52 12
Цитата Сообщение от feodor Посмотреть сообщение
'UPDATE books set sisid=\''.$n.'\' WHERE sisid=\''.$n2.'\''
Зачем? С идентификаторами такое проделывают раз в сто лет. А нумерацию формируют прямо в представлении. Хранения данных это не касается. Лучше бы явно объявили первичный ключ. Для идентификации записей нужно использовать именно идентификаторы, а не номера.

Цитата Сообщение от feodor Посмотреть сообщение
Можно переписать update так, чтобы мы получали на входе белиберду с одинаковыми именами, а отправляли все как надо?
Можно надеяться на текущий порядок, но лучше делать хотя бы так:
JSON
1
{1:{name:"",...},...}
Или так:
JSON
1
{1:["",...],...}
Но от основной вашей ошибки это все, конечно, не спасает. Добавьте хотя бы какую-то порционность при изменении данных, например разбейте список на страницы и сохраняйте "отдельными страницами".
0
feodor
15 / 15 / 5
Регистрация: 26.05.2017
Сообщений: 151
03.10.2018, 11:52  [ТС] 13
Посмотрим...
0
Phantom-84
269 / 224 / 62
Регистрация: 15.09.2017
Сообщений: 1,065
03.10.2018, 11:59 14
В общем-то бинарные данные тоже хороши. Тем, что они требуют минимум обработки. Можно передавать по одной записи в каждом параметре, отделяя значения полей символом, который точно не должен встретиться в обычных условиях, например нулевым (обнуленным) байтом.
0
feodor
15 / 15 / 5
Регистрация: 26.05.2017
Сообщений: 151
03.10.2018, 12:04  [ТС] 15
Цитата Сообщение от Phantom-84 Посмотреть сообщение
Для идентификации записей нужно использовать именно идентификаторы, а не номера.
- просто у меня update.php проходиться по номерам.(строчки 14, 17) Альтернатива?
Цитата Сообщение от Phantom-84 Посмотреть сообщение
Добавьте хотя бы какую-то порционность при изменении данных, например разбейте список на страницы и сохраняйте "отдельными страницами".
- Это дополнительные проблемы, но все же действительно стоит...
С json как-то не очень понятно.(Возможно потому что я впервые слышу это слово) Это он:
Javascript
1
data: {n:number},
?
Что должно быть на месте ... ? Я сейчас и сам погуглю, но можете немного конкретизировать и объяснить, пожалуйста.
0
Phantom-84
269 / 224 / 62
Регистрация: 15.09.2017
Сообщений: 1,065
03.10.2018, 12:19 16
Цитата Сообщение от feodor Посмотреть сообщение
просто у меня update.php проходиться по номерам.(строчки 14, 17) Альтернатива?
Альтернатива - использовать идентификаторы. И забыть про "смежность" их значений, о которой вы так печетесь. Множественное обновление работает на тех же принципах, о которых я писал ранее. Предварительно считываете из базы данных идентификаторы всех записей, которые потенциально могут быть обновлены, и проверяете. Либо не считываете и не проверяете, а просто выполняете полную валидацию поступающих идентификаторов, пытаетесь по ним делать запись в базу данных и потом детально анализируете ответ от нее.

Цитата Сообщение от feodor Посмотреть сообщение
Что должно быть на месте ... ?
Другие поля этой же записи и другие записи. Второй вариант (с безымянными полями) предпочтительнее, т.к. позволяет существенно сократить объем передаваемых данных.

Добавлено через 2 минуты
Там я немного поторопился. Ключи тоже нужно заключать в кавычки (и 1, и name и т.п.).
1
feodor
15 / 15 / 5
Регистрация: 26.05.2017
Сообщений: 151
03.10.2018, 12:26  [ТС] 17
Цитата Сообщение от Phantom-84 Посмотреть сообщение
И забыть про "смежность" их значений, о которой вы так печетесь.
Хорошо, как мне переписать update.php? У меня был WHERE sisid=\''.$sisidn.'\''; а что теперь?

Добавлено через 4 минуты
В смысле, я знал $sisidn, потому что это номер.
0
Phantom-84
269 / 224 / 62
Регистрация: 15.09.2017
Сообщений: 1,065
03.10.2018, 12:41 18
Передавайте идентификаторы, как номера. Проверяйте их. И по ним пытайтесь записывать. Потом анализируйте результат (для каждой записи; можно накапливать идентификаторы или количество записей, которые не удалось обновить, чтобы потом сообщить об этом пользователю).

Добавлено через 1 минуту
Цитата Сообщение от Phantom-84 Посмотреть сообщение
Проверяйте их.
Хотя бы по формату.

Добавлено через 2 минуты
Данные тоже нужно тщательно проверять, либо экранировать. Либо использовать подготовленные запросы. Почитайте про SQL-инъекции.

Добавлено через 4 минуты
MySQL для обрамления значений поддерживает двойные кавычки, т.е. можно не делать так: \\', тем более что в форме вы тоже используете двойные кавычки, что в общем-то правильно. Неправильно то, что вы не кодируете значения при выводе в форму. Или при сохранении в базе данных, чтобы текущий вывод можно было считать относительно безопасным.
1
feodor
15 / 15 / 5
Регистрация: 26.05.2017
Сообщений: 151
03.10.2018, 15:38  [ТС] 19
Цитата Сообщение от Phantom-84 Посмотреть сообщение
Данные тоже нужно тщательно проверять, либо экранировать. Либо использовать подготовленные запросы. Почитайте про SQL-инъекции.
- Про безопасность буду думать, когда хотя бы что-то будет работать. Так-то и авторизации еще нет.
Цитата Сообщение от Phantom-84 Посмотреть сообщение
Передавайте идентификаторы, как номера.
- В смысле? $_POST[$sisidn] - Опять упираемся в "смежность".
0
Phantom-84
269 / 224 / 62
Регистрация: 15.09.2017
Сообщений: 1,065
03.10.2018, 15:49 20
Цитата Сообщение от feodor Посмотреть сообщение
Опять упираемся в "смежность".
Нет, если вы будете различать номера и идентификаторы. И передавать в обработчик именно идентификаторы.

Добавлено через 5 минут
Раз у $sisidn есть прототип в базе данных, то это скорее идентификатор. Просто не нужно перенумеровывать идентификаторы при "обновлении". В лучшем случае это вызывает улыбку. В худшем - желание "отхлестать по попе"
0
03.10.2018, 15:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.10.2018, 15:49

Внесение изменений в таблицу MySql
Здравствуйте, прошу помочь в следующем вопросе. Есть таблица в MySql INSERT INTO `orders` (`id`,...

Поиск совпадений и внесение изменений в MySQL
Имеется две таблицы! Нужно взять название продукта с таблицы 2(столбец product), и найти его в...

Записать в БД тенденцию изменений поступающих из API
Здравствуйте пользователи. Я новичок и у меня проблемы. буду благодарен если дадите совет. Есть...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru