Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Незнаю как внести изменения сразу в несколько строк MySql
 
 автор: torxxx   (26.09.2011 в 08:54)   письмо автору
 
 

Есть код ( суть проблемы описал внутри кода - чтобы было понятней)

<?php 

include '../database/db_connect.php';
$result mysql_query ("SELECT * FROM items LIMIT 5"$db);

/* Код - вывода значений из Базы данных в таблицу, и 
выведение этих переменных в поле "input". Планирую так если 
в input, внесены значения то все изминения сохраняются в 
базу */


echo "<form action='' method='post'>";
while (
$myrow mysql_fetch_array ($result))
    {
echo 
"
<table class='admin_table_items' >
  <tr>
    <td class='admin_table_items_td_title'><input name='title' value='
$myrow[title]' type='text' /></td>
    <td class='admin_table_items_td_number'><input name='id' value='
$myrow[id]' type='text' /></td>
    <td class='admin_table_items_td_number'><input name='Scout' value='
$myrow[Scout]' type='text' /></td>
    <td class='admin_table_items_td_number'><input name='Soldier' value='
$myrow[Soldier]' type='text' /></td>
    <td class='admin_table_items_td_number'><input name='Pyro' value='
$myrow[Pyro]' type='text' /></td>
    <td class='admin_table_items_td_number'><input name='Demoman' value='
$myrow[Demoman]' type='text' /></td>
    <td class='admin_table_items_td_number'><input name='Heavy' value='
$myrow[Heavy]' type='text' /></td>
    <td class='admin_table_items_td_number'><input name='Engineer' value='
$myrow[Engineer]' type='text' /></td>
    <td class='admin_table_items_td_number'><input name='Medic' value='
$myrow[Medic]' type='text' /></td>
    <td class='admin_table_items_td_number'><input name='Sniper' value='
$myrow[Sniper]' type='text' /></td>
    <td class='admin_table_items_td_number'><input name='Spy' value='
$myrow[Spy]' type='text' /></td>
    <td class='admin_table_items_td_number'><input name='the_weapons' value='
$myrow[the_weapons]' type='text' /></td>
    <td class='admin_table_items_td_number'><input name='the_hat' value='
$myrow[the_hat]' type='text' /></td>
    <td class='admin_table_items_td_number'><input name='the_other' value='
$myrow[the_other]' type='text' /></td>
    <td class='admin_table_items_td_number'><input name='set' value='
$myrow[set]' type='text' /></td>
    <td><img src='
$myrow[image]'/></td>
    <td class='admin_table_items_td_number'><input name='Slot' value='
$myrow[Slot]' type='text' /></td>
    <td class='admin_table_items_td_number'><input name='counter' value='
$myrow[counter]' type='text' /></td>
  </tr>
</table>"
;    
    }
echo 
"
<input name='submit' class='admin_table_items_submit' type='submit' value='готово' />
<div class='clr'><div>
</form>
"
;

/* Все работает как надо, значения выводятся, я вношу 
нужные значения и перенапрявляю их скрипту - и тут я незнаю 
как сделать так чтобы все новые значения которые я ввел 
соханялись в базе данных */

/* Как внести значения по одному знаю, скрипт ниже, а как в 
несколько строк непонимаю */


$title $_POST['title'];
$description $_POST['id'];
$Scout $_POST['Scout'];
$Soldier $_POST['Soldier'];
$Pyro $_POST['Pyro'];
$Demoman $_POST['Demoman'];
$Heavy $_POST['Heavy'];
$Engineer $_POST['Engineer'];
$Medic $_POST['Medic'];
$Sniper $_POST['Sniper'];
$Spy $_POST['Spy'];
$the_weapons $_POST['the_weapons'];
$the_hat $_POST['the_hat'];
$the_other $_POST['the_other'];
$set $_POST['set'];
$image $_POST['image'];
$Slot $_POST['Slot'];
$counter $_POST['counter'];
$submit $_POST['submit'];

/* Код - обновление параметров предметов */

if (isset($submit))
    {
    
$resultADD mysql_query ("UPDATE items SET title='Неумолимая сила' WHERE id=1"$db); 
    if (
$resultADD) {echo "<br>Готово";} else {echo "<br>Ошибка";}
    }

?>

  Ответить  
 
 автор: cheops   (26.09.2011 в 09:57)   письмо автору
 
   для: torxxx   (26.09.2011 в 08:54)
 

Просто через запятую указывайте значения в поле SET, я приведу обработку параметров и формирование UPDATE-запроса на примере двух параметров
<?php
  
...
  
/* Предотвращаение SQL-инъекции*/
  
$_POST['id'] = intval($_POST['id']);
  if (!
get_magic_quotes_gpc())
  {
    
$_POST['title'] = mysql_escape_string($_POST['title']);
    
$_POST['Soldier'] = mysql_escape_string($_POST['Soldier']);
  }
  
/* Код - обновление параметров предметов */ 

  
if (isset($submit)) 
  { 
    
$query "UPDATE items
              SET
                title = '
{$_POST['title']}',
                Soldier = '
{$_POST['Soldier']}'
              WHERE id = 
{$_POST['id']}";
    
$resultUPDATE mysql_query ($query$db);  
    if (
$resultUPDATE) {echo "<br>Готово";} else {echo "<br>Ошибка";} 
  }
?>

  Ответить  
 
 автор: torxxx   (26.09.2011 в 10:17)   письмо автору
66.1 Кб
 
   для: cheops   (26.09.2011 в 09:57)
 

Спасибо за сообщение.

Но проблема вот в чем, вверху генерируется таблица (в цикле), пока есть строчки в базе данных, тоесть данные выводятся, пока в таблице items есть строки. В рамках одной строки мне понятно как вставить данные. Но у меня выводятся 5 строк (которые соответствуют параметрам выборки).

Дак вот я заполнил (исправил) нужные данные, нажал кнопку. И тут мне надо чтобы все внеслись в базу.

Прикрепил пример таблицы.

  Ответить  
 
 автор: torxxx   (26.09.2011 в 10:25)   письмо автору
 
   для: cheops   (26.09.2011 в 09:57)
 

Я так понимаю надо создать ассоциативный массив и вносить в него данные. Но как я пока не знаю

  Ответить  
 
 автор: Valick   (26.09.2011 в 10:41)   письмо автору
 
   для: torxxx   (26.09.2011 в 10:25)
 

нужно писать не title, а title[]
вот так
<td class='admin_table_items_td_title'><input name='title[]' value='$myrow[title]' type='text' /></td> 

и так далее все имена
в обработчик получите массив
который в простейшем случае можно вставить в базу в цикле foreach
___
хотя может лучше немного изменить логику составления массива
просто надо глубже проанализировать таблицу и связи, а сейчасас мало времени

  Ответить  
 
 автор: torxxx   (26.09.2011 в 10:46)   письмо автору
 
   для: Valick   (26.09.2011 в 10:41)
 

спасибо, сейчас попробую

  Ответить  
 
 автор: Valick   (26.09.2011 в 10:49)   письмо автору
 
   для: torxxx   (26.09.2011 в 10:46)
 

я о том чтобы сформировать массив таким образом (и не много а один массив), чтобы его легче было обрабатывать и не потерять зависимость значений друг от друга
_
просто у вас получается много массивов и связаны они только мнимым порядком, а это достаточно ненадёжная связь (я бы даже сказал крайне ненадежная), такого нельзя позволять и особенно в онлайн игре

  Ответить  
 
 автор: torxxx   (26.09.2011 в 11:08)   письмо автору
 
   для: Valick   (26.09.2011 в 10:49)
 

это не игра, пишу движок (для изучения php)

  Ответить  
 
 автор: Valick   (26.09.2011 в 11:18)   письмо автору
 
   для: torxxx   (26.09.2011 в 11:08)
 

тогда у вас достаточно странные имена полей для "не игры"

  Ответить  
 
 автор: torxxx   (26.09.2011 в 16:41)   письмо автору
 
   для: Valick   (26.09.2011 в 11:18)
 

Есть игра "http://wiki.teamfortress.com/wiki/Heavy/ru"/ В ней предусмотрен обмен предметами между игроками. У меня есть лишние игровые предметы и так-как я начал изучать php, решил написать движок сайта по обмену этими предметами.

  Ответить  
 
 автор: torxxx   (26.09.2011 в 11:12)   письмо автору
 
   для: Valick   (26.09.2011 в 10:49)
 

-

  Ответить  
 
 автор: Valick   (26.09.2011 в 11:07)   письмо автору
 
   для: torxxx   (26.09.2011 в 10:46)
 

id в принципе величина постоянная менять его нельзя (его можно только удалить вместе со всей строкой) и вообще он выступает в роли ключа, что само по себе естественно, вот и нужно формировать вложенный массив родительскими элементами которого будут выступать id

  Ответить  
 
 автор: torxxx   (26.09.2011 в 11:09)   письмо автору
 
   для: Valick   (26.09.2011 в 11:07)
 

я так и планирую, вывел его для наглядности

Непонятна такая логика:

<td class='admin_table_items_td_title'><input name='title[]' value='$myrow[title]' type='text' /></td> 



А если так сделать:


$items = array (
                $id=>array 
                    (
                    "title"=>$title,
                    "Scout"=>$Scout,
                    "Soldier"=>$Soldier,
                    "Pyro"=>$Pyro,
                    "Demoman"=>$Demoman,
                    "Engineer"=>$Engineer,
                    "Medic"=>$Medic,
                    "Sniper"=>$Sniper,
                    "Spy"=>$Spy,
                    "counter"=>$counter,
                                                                   ... .
                    )
                );


Таким образом я создам многомерный массив со всеми значениями, для каждой строчки, вроде верно?

  Ответить  
 
 автор: Valick   (26.09.2011 в 11:24)   письмо автору
 
   для: torxxx   (26.09.2011 в 11:09)
 

уже ответил ниже)

  Ответить  
 
 автор: torxxx   (26.09.2011 в 11:31)   письмо автору
 
   для: Valick   (26.09.2011 в 11:24)
 

-

  Ответить  
 
 автор: Valick   (26.09.2011 в 11:15)   письмо автору
 
   для: torxxx   (26.09.2011 в 10:46)
 

в итоге получим:
    <td class='admin_table_items_td_title'><input name='line[$myrow[id]][title]' value='$myrow[title]' type='text' /></td>

<td class='admin_table_items_td_number'><input name='id' value='$myrow[id]' type='text' /></td> - эту строку можно удалить
    <td class='admin_table_items_td_number'><input name='line[$myrow[id]][Scout]' value='$myrow[Scout]' type='text' /></td> 


в обработчике напишите вывод этого массива и посмотрите на структуру

<?php
echo "<PRE>";
print_r($_POST[line]);
echo 
"</PRE>";

  Ответить  
 
 автор: torxxx   (26.09.2011 в 11:29)   письмо автору
 
   для: Valick   (26.09.2011 в 11:15)
 

Ага, то что надо (буду продумывать код дальше), не знал что так можно сделать, логика понятна.

Благодарю!

  Ответить  
 
 автор: torxxx   (26.09.2011 в 16:58)   письмо автору
134 Кб
 
   для: torxxx   (26.09.2011 в 11:29)
 

Появилась еще одна задача (непонятная для меня)

Есть массив (упростил до 2-ух "веток", на самом деле число меняется):



$_POST['items']  =>

Array
(
    [1] => Array
        (
            [title] => Неумолимая сила
            [Scout] => 1
            [Soldier] => 0
            [Pyro] => 0
            [Demoman] => 0
            [Heavy] => 0
            [Engineer] => 0
            [Medic] => 0
            [Sniper] => 0
            [Spy] => 0
            [the_weapons] => 0
            [the_hat] => 0
            [the_other] => 0
            [set] => нет
        )

    [40] => Array
        (
            [title] => Томислав
            [Scout] => 0
            [Soldier] => 0
            [Pyro] => 0
            [Demoman] => 0
            [Heavy] => 1
            [Engineer] => 0
            [Medic] => 0
            [Sniper] => 0
            [Spy] => 0
            [the_weapons] => 0
            [the_hat] => 0
            [the_other] => 0
            [set] => есть
        )

)


Обработал его комантой Foreach и вставил функцию обновления строк таблицы - но получилась "Борода" какая-то (не работает). Не обновляются поля строки таблицы (сделал проверку - которая подтверждает что я сделал неправильно запрос):


    foreach ($_POST['items'] as $arrid => $arrtitle) 
        {
            foreach ($arrtitle as $value => $key)
                {
                $resultADD = mysql_query ( "UPDATE items SET 
                                            title='$key',
                                            Scout='$key',
                                            Soldier='$key',
                                            Pyro='$key',
                                            Demoman='$key',
                                            Heavy='$key',
                                            Engineer='$key',
                                            Medic='$key',
                                            Sniper='$key',
                                            Spy='$key',
                                            the_weapons='$key',
                                            the_hat='$key',
                                            the_other='$key',
                                            set='$key',
                                            Slot='$key',
                                            counter='$key',
                                            WHERE id='$arrid'", $db);
                }
                if ($resultADD) {echo "<br>Новые параметры внесены в базу данных<br><br>";} else {echo "<br>Ошибка запроса - параметры не внесены<br><br>";}    
        }


Прикрепил скриншот таблицы для наглядности.

  Ответить  
 
 автор: Lotanaen   (26.09.2011 в 17:20)   письмо автору
 
   для: torxxx   (26.09.2011 в 16:58)
 

поля таблицы возьмите в кавычки: `set` либо не называйте таблицы и ее поля зарезервированными в mysql словами.

  Ответить  
 
 автор: torxxx   (26.09.2011 в 17:42)   письмо автору
 
   для: Lotanaen   (26.09.2011 в 17:20)
 

спасибо за найденную ошибку, поправил.

Но данные все равно не заносятся

  Ответить  
 
 автор: Lotanaen   (26.09.2011 в 17:48)   письмо автору
 
   для: torxxx   (26.09.2011 в 17:42)
 

да... вы второй foreach зачем делаете?

там получится такой же запрос:


$resultADD = mysql_query ( "UPDATE items SET 
                                            title='$arrtitle[title]'
                                            WHERE id='$arrid'", $db);

т.е. так с массивом поступите

  Ответить  
 
 автор: torxxx   (26.09.2011 в 18:11)   письмо автору
 
   для: Lotanaen   (26.09.2011 в 17:48)
 

Если правильно понял, нужно сделать так:


    foreach ($_POST['items'] as $arrid => $arrtitle) 
        {
                $resultADD = mysql_query ( "UPDATE items SET 
                                            'title'=$arrtitle[title],
                                            'Scout'=$arrtitle[Scout],
                                            'Soldier'=$arrtitle[Soldier],
                                            'Pyro'=$arrtitle[Pyro],
                                            'Demoman'=$arrtitle[Demoman],
                                            'Heavy'=$arrtitle[Heavy],
                                            'Engineer'=$arrtitle[Engineer],
                                            'Medic'=$arrtitle[Medic],
                                            'Sniper'=$arrtitle[Sniper],
                                            'Spy'=$arrtitle[Spy],
                                            'the_weapons'=$arrtitle[the_weapons],
                                            'the_hat'=$arrtitle[the_hat],
                                            'the_other'=$arrtitle[the_other],
                                            'set'=$arrtitle[set],
                                            'Slot'=$arrtitle[Slot],
                                            'counter'=$arrtitle[counter]
                                            WHERE 'id'='$arrid'", $db);
                
                if ($resultADD) {echo "<br>Новые параметры внесены в базу данных<br><br>";} else {echo "<br>Ошибка запроса - параметры не внесены<br><br>";}    
        }


Ясно как сказано выше я допустил 1 ошубку (фатальную):

1) нельзя использовать зарезервированные переменные в названия таблиц (в моем случаи set)

2) нельзя так-же делать так:


'title'='$arrtitle[title]' - неправильно
title='$arrtitle[title]' - правильно



                $resultADD = mysql_query ( "UPDATE items SET 
                                            title='$arrtitle[title]',
                                            set='$arrtitle[set]',
                                            WHERE id='$arrid'", $db);

  Ответить  
 
 автор: Lotanaen   (27.09.2011 в 09:27)   письмо автору
 
   для: torxxx   (26.09.2011 в 18:11)
 

зарезервированые слова можно использовать в названиях таблиц и их полей, но лучше всегда при формировании запросов все имена эти брать в апостроф(обратные кавычки) - не ' , а `:

$resultADD = mysql_query ( "UPDATE `items` SET 
                                           `title`='$arrtitle[title]',
                                            `set`='$arrtitle[set]',
                                            WHERE `id`='$arrid'", $db);

  Ответить  
 
 автор: torxxx   (27.09.2011 в 17:30)   письмо автору
 
   для: Lotanaen   (27.09.2011 в 09:27)
 

спасибо учту

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования