[PHP] Изменить несколько значений в таблице mysql

[Удален]
4895

Здравствуйте. Столкнулся с такой проблемой.

Вывожу значения из БД в <input> для их редактирования.

$select = mysql_query("SELECT * FROM news");
if(!$select){
return exit("Ошибка выборки");
}
while($row = mysql_fetch_array($select)){
echo "<input type='text' name='title_edit' value='".$row['title']."'>&nbsp;<input type='text' name='text_edit' value='".$row['text']."'><input type='submit' value='Изменить' name='test'><br>";
}

Получается такая форма:

Нужно, чтобы при изменение данных в input и потом нажатии на кнопку "Изменить" эта строка менялась.

Если сделать так, то меняется только последняя запись

if($_POST['test']){
$id = $_POST['id'];
$title_edit = $_POST['title_edit'];
$text_edit = $_POST['text_edit'];
mysql_query("UPDATE news SET title='$title_edit', text='$text_edit' WHERE id='$id'");
}

Подскажите, как можно решить данную проблему.

[umka]
На сайте с 25.05.2008
Offline
456
#1

Делайте каждый input с кнопкой в отдельной <form></form>

Лог в помощь!
speed-core
На сайте с 30.03.2014
Offline
33
#2

umka - зачем?

передавай массив:

name='title_edit[]' ну и обрабатывай по списку. например foreach

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

HOST-PROTECTION (/ru/forum/848747), профессиональный web хостинг, гарантия стабильности, защита от DDoS.
[umka]
На сайте с 25.05.2008
Offline
456
#3
speed-core:
umka - зачем?

Вопрос был о том, как изменять конкретную строку, у которой нажата кнопка.

Мой ответ был именно об этом.

Joker-jar
На сайте с 26.08.2010
Offline
171
#4

Я вообще не вижу, чтобы в форме передавался id. Его нужно формировать для каждой строки, например, в input с type="hidden". И, да, строки в отдельные формы.

siv1987
На сайте с 02.04.2009
Offline
427
#5

Для ТС'а проще именно формами для каждой записи. Массивом он будет всю форму гнать туда сюда, а тогда уже нет смысла ставить для каждой строки отдельный "изменить".

Можно сохранить и по одной записи аяксом, а можно все скопом отправив форму обычным методом.

Имена параметров можно генерировать и по такому принципу

name='title_edit[{$row['id']}]'

name='text_edit[{$row['id']}]'

name='id[]'

И обращаться к ним

foreach($_POST['id'] as $id){

$id = intval($id);

$title = $_POST['title_edit'][$id];

$text = $_POST['text_edit'][$id];

}


<?php

while($row = mysql_fetch_array($select)){
echo "<div class='rows'><input type='text' name='title_edit[]' value='{$row['title']}' >&nbsp;<input type='text' name='text_edit[]' value='{$row['text']}'><input type='hidden' name='id[]' value='{$row[id]}'><input type='submit' value='Изменить' name='test' class='submit'></div>";
}
?>
<script>
$('.submit').click(function(){
var data = '';
$(this).parent().find('input').each(function(){
data += this.name+'='+encodeURIComponent(this.value)+'&';
});
$.post('/edit.php', data, function(res){
alert('Saved');
});

return false;
});
</script>


if(isset($_POST['test'])){
$len = is_array($_POST['id']) ? count($_POST['id']) : 0;

for($i=0; $i<$len; $i++){
$id = intval($_POST['id'][$i]);
$title = $_POST['title_edit'][$i];
$text = $_POST['text_edit'][$i];

mysql_query("UPDATE news SET title='".escape($title)."', text='".escape($text)."' WHERE id='{$id}'");
}
}

function escape($str){
return mysql_real_escape_string($str);
}
[Удален]
#6
'[umka:
;12870333']Делайте каждый input с кнопкой в отдельной <form></form>

Я так делал и все ОК, но мне кажется это как-то не оптимально)

siv1987, получается код будет вида:

<form  method="post" class="form-zakaz" >

<?php

$select = mysql_query("SELECT * FROM news");
if(!$select){
return exit("Ошибка выборки");
}
while($row = mysql_fetch_array($select)){
echo "<div class='rows'><input type='text' name='title_edit[]' value='{$row['title']}' >&nbsp;<input type='text' name='text_edit[]' value='{$row['text']}'><input type='hidden' name='id[]' value='{$row[id]}'><input type='submit' value='Изменить' name='test' class='submit'></div>";
}


?>
</form>

<script>
$('.submit').click(function(){
var data = '';
$(this).parent().find('input').each(function(){
data += this.name+'='+encodeURIComponent(this.value)+'&';
});
$.post('edit.php', data, function(res){
alert('Saved');
});

return false;
});
</script>

И файл edit.php

<?php


if(isset($_POST['test'])){
$len = is_array($_POST['id']) ? count($_POST['id']) : 0;

for($i=0; $i<$len; $i++){
$id = intval($_POST['id'][$i]);
$title = $_POST['title_edit'][$i];
$text = $_POST['text_edit'][$i];

mysql_query("UPDATE news SET title='".escape($title)."', text='".escape($text)."' WHERE id='{$id}'");
}
}

function escape($str){
return mysql_real_escape_string($str);
}

?>

Подскажите, где ошибся

siv1987
На сайте с 02.04.2009
Offline
427
#7

Да, примерно такого вида должен получится код. Не понятно только что там за return exit. Дальше уже зависит в каком контексте работает ваше приложение. Естественно здесь только часть которая относится к сути задачи, остальное уже нужно вам настроить - подключение к бд, подключение js скриптов (jquery) и тп.

[Удален]
#8
siv1987:
Да, примерно такого вида должен получится код. Не понятно только что там за return exit. Дальше уже зависит в каком контексте работает ваше приложение. Естественно здесь только часть которая относится к сути задачи, остальное уже нужно вам настроить - подключение к бд, подключение js скриптов (jquery) и тп.

Уже не раз меня спасаете ;), Спасибо! В скрипте разобрался, всё заработало как надо!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий