Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > не выполняется UPDATE запрос


Автор: Enya 6.11.2006, 16:58
Что делает этот код?
Делает выборку данных из таблицы.
Размещает в определённых полях.
Что нужно?
Что бы внесённые изменения в полях, сохранялись в БД.
Чего код не делает?
Именно не сохраняет новую инфу в БД.
Код

$sql="SELECT * FROM objects";
            $result=mysql_query($sql) or die("SQL Select Error");
            $count=mysql_num_rows($result);
                    
                ?>
                    <table width="500" border="0" cellspacing="1" cellpadding="0" align="center">
                        <form name="form1" method="post" action="control.php?type=2">
                            <tr>
                            <td>
                                <table width="500" border="0" cellspacing="1" cellpadding="0">
                                    <tr>
                                        <td align="center"><strong>Id</strong></td>
                                        <td align="center"><strong>Object Name</strong></td>
                                        <td align="center"><strong>Object type</strong></td>
                                        <td align="center"><strong>Object</strong></td>
                                    </tr>
                                <?php
                                    while($rows=mysql_fetch_array($result)){
                                ?>
                                    <tr>
                                        <td align="center"><? $id[]=$rows['id']; ?><? echo $rows['id']; ?></td>
                                        <td align="center"><input name="obj01[]" type="text" id="obj01" value="<? echo $rows['obj01']; ?>"></td>
                                        <td align="center"><input name="obj02[]" type="text" id="obj02" value="<? echo $rows['obj02']; ?>"></td>
                                        <td align="center"><input name="obj03[]" type="text" id="obj03" value="<? echo $rows['obj03']; ?>"></td>
                                    </tr>
                                <?php
                                    }
                                ?>
                                    <tr>
                                        <td colspan="4" align="center"><input type="submit" name="Submit" value="Submit"></td>
                                    </tr>
                                </table>
                            </td>
                            </tr>
                        </form>
                    </table>
                    <?php
                    
                if(isset($_POST['Submit'])){
                    for($i=0;$i<$count;$i++){
                        $sql_up="UPDATE objects SET obj01='$obj01[$i]', obj02='$obj02[$i]', obj03='$obj03[$i]' WHERE id='$id[$i]'";
                        $result_up=mysql_query($sql_up);
                    }
                }
                if(isset($result_up)){
                    header("location:control.php");
                }

Вот не нравиться вот эта строчка
Код

$sql_up="UPDATE objects SET obj01='$obj01[$i]', obj02='$obj02[$i]', obj03='$obj03[$i]' WHERE id='$id[$i]'";
Пишел, пол Notice переменная не определена.
 smile Чё такое?!

Добавлено @ 17:03 
Код

CREATE TABLE `objects` (
  `id` int(11) NOT NULL auto_increment,
  `obj01` varchar(100) NOT NULL default '',
  `obj02` varchar(100) NOT NULL default '',
  `obj03` varchar(100) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf-8; 

Автор: Nbuth 6.11.2006, 20:56
Ну во первых, id у тебя в посте вообще не передается, строчки 18-27 надо заменить примерно так:
Код

while($rows=mysql_fetch_array($result)){
    ?>
    <tr>
        <td align="center"><input name="id[]" type="hidden" value="<?=$rows['id'];?>"><? echo $rows['id']; ?></td>
        <td align="center"><input name="obj01[]" type="text" id="obj01" value="<? echo $rows['obj01']; ?>"></td>
        <td align="center"><input name="obj02[]" type="text" id="obj02" value="<? echo $rows['obj02']; ?>"></td>
        <td align="center"><input name="obj03[]" type="text" id="obj03" value="<? echo $rows['obj03']; ?>"></td>
        </tr>
    <?php
}


ну и сам запрос надо переделать примерно так:
Код

$sql_up="UPDATE objects SET obj01='".$_POST['obj01'][$i]."', obj02='".$_POST['obj02'][$i]."', obj03='".$_POST['obj03'][$i]."' WHERE id=".$_POST['id'][$i].";";


и прейдется перенести ещё UPDATE запрос на верх страницы, иначе у тебя header("location:control.php"); не сработает

Автор: Enya 6.11.2006, 22:16
Странно. А вот в этом уроке написано так:http://www.phpeasystep.com/mysqlview.php?id=10

Автор: check 6.11.2006, 23:56
Цитата(Enya @  6.11.2006,  22:16 Найти цитируемый пост)
в этом уроке написано так
Там показан запрос в общем виде.  SQL-запрос это строка,  
поэтому переменные туда нужно подставлять как в строку.

Автор: Nbuth 6.11.2006, 23:59
Enya, ну во первых, в этом уроке все написано, с учетом того что register_globals стоит в On, а у тебя наверняка в off
во вторых переменая id у них и в этом примере не передается, х.з., наверно очепятка у них там какая, или ещё, что. (для проверки можешь сунуть в обработчик кнопки такой текст ?><pre><? print_r($_POST); ?></pre><? и увидешь что там передается, а что нет)
ну и в последних, думаю если ты оставишь header("location:update_multiple.php"); на том месте, где он сейчас стоит, то столкнешся, примерно с таким сообщением: Warning: Cannot modify header information - headers already sent by ...

З.Ы.: так что выкинь этот урок, впринципе, ничего хорошего я в нем вообще не увидел, ни  одного толкового коментария, ни одного описания функции ... 

Автор: check 7.11.2006, 00:07
Цитата(Nbuth @  6.11.2006,  20:56 Найти цитируемый пост)
и прейдется перенести ещё UPDATE запрос на верх страницы, иначе у тебя header("location:control.php"); не сработает 
А причем тут запрос?
Ошибка возникнет из-за того что заголовки отправляются после вывода в браузер.  Но это легко лечится буферизацией вывода: первой строчкой в скрипте пишешь ob_start(); последней ob_end_flush();

Автор: Nbuth 7.11.2006, 09:11
check, не спорю, можно сделать и так, но мы получим один совершенно не нужный запрос, а следовательно лишняя нагрузка на сервер.

а если вообще уберем header(), то получим страницу со старыми данными, что тоже как-то не особо  smile 

Автор: Enya 7.11.2006, 10:48
Nbuth, теперь данные в таблицу вставляются.
Но при следующем редактирование в поля не вставляются уже существующие данные (из SELECT запроса), кликаю на редактирование а поля пустые, хотя в БД записи есть. И если не все поля заполнены то он их перезапишет пустыми.

Автор: Nbuth 7.11.2006, 11:01
Enya, покажи код, так трудно говорить, что у тебя там

Автор: Enya 7.11.2006, 11:11
Nbuth, вот
Код

echo '<h3>Edit objekt</h3>';
        echo '<li><a href="'.$_SERVER['PHP_SELF'].'?type=1">Добавить запись</a>';
        echo '<li><a href="'.$_SERVER['PHP_SELF'].'?type=3">Удаление объектов</a>';
        echo '<li><a href="'.$_SERVER['PHP_SELF'].'">Вернуться</a>';
        
            $sql="SELECT * FROM objects";
            $result=mysql_query($sql) or die("SQL Select Error");
            $count=mysql_num_rows($result);
                    
                ?>
                    <table width="500" border="0" cellspacing="1" cellpadding="0" align="center">
                        <form name="form1" method="post" action="control.php?type=2">
                            <tr>
                            <td>
                                <table width="500" border="0" cellspacing="1" cellpadding="0">
                                    <tr>
                                        <td align="center"><strong>Id</strong></td>
                                        <td align="center"><strong>Object Name</strong></td>
                                        <td align="center"><strong>Object type</strong></td>
                                        <td align="center"><strong>Object</strong></td>
                                    </tr>
                                <?php
                                    while($rows=mysql_fetch_array($result)){
                                ?>
                                    <tr>
                                        <td align="center"><input name="id[]" type="hidden" value="<?=$rows['id'];?>"><? echo $rows['id']; ?></td>
                                        <td align="center"><input name="obj01[]" type="text" id="obj01" value="<? echo $rows['obj01']; ?>"></td>
                                        <td align="center"><input name="obj02[]" type="text" id="obj02" value="<? echo $rows['obj02']; ?>"></td>
                                        <td align="center"><input name="obj03[]" type="text" id="obj03" value="<? echo $rows['obj03']; ?>"></td>
                                    </tr>
                                <?php
                                    }
                                ?>
                                    <tr>
                                        <td colspan="4" align="center"><input type="submit" name="Submit" value="Submit"></td>
                                    </tr>
                                </table>
                            </td>
                            </tr>
                        </form>
                    </table>
                    <?php
                    
                if(isset($_POST['Submit'])){
                    for($i=0;$i<$count;$i++){
                        $sql_up="UPDATE objects SET obj01='".$_POST['obj01'][$i]."', obj02='".$_POST['obj02'][$i]."', obj03='".$_POST['obj03'][$i]."' WHERE id=".$_POST['id'][$i].";";
                        $result_up=mysql_query($sql_up);
                    }
                }
                if(isset($result_up)){
                    header("location:control.php");
                }

Автор: -=Ustas=- 7.11.2006, 11:23
Enya, попробуй так:
Код

<?php

if (isset($_POST['Submit'])) {
    $count = sizeof($_POST['id']);
    for ($i = 0; $i < $count; $i++) {
        $sql = 'UPDATE 
                    `objects` 
                SET 
                    `obj01` = \''.$_POST['obj01'][$i].'\', 
                    `obj02` = \''.$_POST['obj02'][$i].'\', 
                    `obj03` = \''.$_POST['obj03'][$i].'\' 
                WHERE 
                    `id` = '.$_POST['id'][$i];
        mysql_query($sql);
    }

    header('location: control.php');
   
} else {

    $sql    = "SELECT * FROM `objects` ORDER BY `id` DESC";
    $result = mysql_query($sql) or die("SQL Select Error");
    $count  = mysql_num_rows($result);
                    
?>

    <table width="500" border="0" cellspacing="1" cellpadding="0" align="center">
    <form name="form1" method="post" action="control.php?type=2">
    <tr><td>
        <table width="500" border="0" cellspacing="1" cellpadding="0">
            <tr><td align="center"><strong>Id</strong></td>
                <td align="center"><strong>Object Name</strong></td>
                <td align="center"><strong>Object type</strong></td>
                <td align="center"><strong>Object</strong></td>
            </tr>
            
            <?php
            
            while ($obj = mysql_fetch_object($result)) {
            
            ?>
            
            <tr><td align="center"><input type="hidden" name="id[]" value="<?=$obj->id?>"><?=$obj->id?></td>
                <td align="center"><input name="obj01[]" type="text" id="obj01" value="<?=$obj->obj01?>"></td>
                <td align="center"><input name="obj02[]" type="text" id="obj02" value="<?=$obj->obj02?>"></td>
                <td align="center"><input name="obj03[]" type="text" id="obj03" value="<?=$obj->obj03?>"></td>
            </tr>
            
            <?php
            }
            ?>
            <tr><td colspan="4" align="center"><input type="submit" name="Submit" value="Submit"></td>
            </tr>
        </table>
    </td></tr>
    </form>
    </table>
    
<?php
}
?>
                
?>

Автор: Enya 7.11.2006, 14:01
-=Ustas=-, что-то не то. Не сохраняет.
Вот сам http://www.nasha.lv/123/control.php

Автор: -=Ustas=- 7.11.2006, 15:06
Цитата(Enya @  7.11.2006,  14:01 Найти цитируемый пост)
-=Ustas=-, что-то не то. Не сохраняет.


Всмысле не сохраняет?!

Автор: Enya 7.11.2006, 15:28
-=Ustas=-, я же ссылку дала.
Попробуй сам.
Ну, нажимаю редактировать.
Вбиваю данные в поля.
Данные не попадают в БД.
Смотрелда в ручную.

Автор: -=Ustas=- 7.11.2006, 15:56
Enya, нормально все сохраняется. Только что пробовал.

Автор: Enya 7.11.2006, 16:26
-=Ustas=-, примите мои извинения. Я просто не много запарилась с этим update.
Мне ещё каждую строчку, перелопатить - не хочу чтоб мимо ушей прошло.

Автор: Enya 7.11.2006, 17:24
И так типичная ошибка, повторяется. Теперь с удалением.
Я вот решила не много сама, как пока поняла внести изменения. 
Теперь сообщения об неопределённости переменных не появляется.
Массив id-шек, отправляется, но удаление не происходит. smile 
Код

$sql="SELECT * FROM objects";
            $result=mysql_query($sql);
            $count=mysql_num_rows($result);

            ?>
                <table width="400" border="0" cellspacing="1" cellpadding="0" align="center">
                    <tr>
                        <td><form name="form1" method="post" action="">
                        <table width="400" border="0" cellpadding="3" cellspacing="1" bgcolor="#CCCCCC">
                            <tr>
                                <td bgcolor="#FFFFFF">&nbsp;</td>
                                <td colspan="4" bgcolor="#FFFFFF"><strong>Delete multiple rows in mysql</strong> </td>
                            </tr>
                <tr>
                    <td align="center" bgcolor="#FFFFFF">#</td>
                    <td align="center" bgcolor="#FFFFFF"><strong>Id</strong></td>
                    <td align="center" bgcolor="#FFFFFF"><strong>Object Name</strong></td>
                    <td align="center" bgcolor="#FFFFFF"><strong>Object type</strong></td>
                    <td align="center" bgcolor="#FFFFFF"><strong>Object</strong></td>
                </tr>
            <?php
            while($rows=mysql_fetch_array($result)){
            ?>
                <tr>
                    <td align="center" bgcolor="#FFFFFF"><input name="checkbox[]" type="checkbox" id="checkbox[]" value="<? echo $rows['id']; ?>"></td>
                    <td bgcolor="#FFFFFF"><? echo $rows['id']; ?></td>
                    <td bgcolor="#FFFFFF"><? echo $rows['obj01']; ?></td>
                    <td bgcolor="#FFFFFF"><? echo $rows['obj02']; ?></td>
                    <td bgcolor="#FFFFFF"><? echo $rows['obj03']; ?></td>
                </tr>
            <?php
            }
            ?>
            
                <tr>
                    <td colspan="5" align="center" bgcolor="#FFFFFF"><input name="delete" type="submit" id="delete" value="Delete"></td>
                </tr>
            <?
                // Check if delete button active, start this
                if(isset($_POST['delete'])){
                    for($i=0;$i<$count;$i++){

                        $del_id = $_POST['delete'][$i]; //вот здесь я  сама внесла изменения
                        $sql_del = "DELETE FROM objects WHERE id='$del_id'";
                        $result_del = mysql_query($sql_del);
                    }
                }
                
                ?><pre><? print_r($_POST); ?></pre><?
                

            ?>
                </table>
                    </form>
                        </td>
                    </tr>
                </table>
            <?php


Добавлено @ 17:24 
http://www.nasha.lv/123/control.php?type=3

Автор: -=Ustas=- 7.11.2006, 18:44
Enya, ну вот опять вы за своё!!!

Добавлено @ 18:52 
Код

<?php

if (isset($_POST['delete'])) {
    $count = sizeof($_POST['id']);
    $idString = implode(',', $_POST['id']);
    $sql = 'DELETE FROM `objects` WHERE `id` IN('.$idString.')';
    mysql_query($sql);
}

$sql    = 'SELECT * FROM objects ORDER BY `id` DESC';
$result = mysql_query($sql);

?>
<table width="400" border="0" cellspacing="1" cellpadding="0" align="center">
<tr><td><form name="form1" method="post" action="">
    <table width="400" border="0" cellpadding="3" cellspacing="1" bgcolor="#CCCCCC">
    <tr><td bgcolor="#FFFFFF">&nbsp;</td>
        <td colspan="4" bgcolor="#FFFFFF"><strong>Delete multiple rows in mysql</strong> </td>
        </tr><tr>
             <td align="center" bgcolor="#FFFFFF">#</td>
             <td align="center" bgcolor="#FFFFFF"><strong>Id</strong></td>
             <td align="center" bgcolor="#FFFFFF"><strong>Object Name</strong></td>
             <td align="center" bgcolor="#FFFFFF"><strong>Object type</strong></td>
             <td align="center" bgcolor="#FFFFFF"><strong>Object</strong></td>
         </tr>
         
         <?php
         
         while ($rows = mysql_fetch_array($result)) {
             
         ?>
         
         <tr><td align="center" bgcolor="#FFFFFF"><input name="id[]" type="checkbox" value="<?=$rows['id']?>"></td>
             <td bgcolor="#FFFFFF"><?=$rows['id']?></td>
             <td bgcolor="#FFFFFF"><?=$rows['obj01']?></td>
             <td bgcolor="#FFFFFF"><?=$rows['obj02']?></td>
             <td bgcolor="#FFFFFF"><?=$rows['obj03']?></td>
         </tr>
         
         <?php
         }
         ?>
            
         <tr><td colspan="5" align="center" bgcolor="#FFFFFF"><input name="delete" type="submit" id="delete" value="Delete"></td></tr>
     </table>
     </form>
</td></tr>
</table>            

Автор: Enya 7.11.2006, 21:39
-=Ustas=-, слушайте, давайте вы хоть на пальцах алгоритм объясните, я то понимаю что допускаю туже ошибку второй раз.

Автор: SelenIT 7.11.2006, 21:52
Enya, насколько я понимаю, Ваша проблема была в том, что Вы не сразу видели внесенные изменения? Так нужно сначала сделать изменения (update|delete), а потом вывести текущее состояние (select), а у Вас была обратная последовательность...

Автор: Mystery_of_being 7.11.2006, 22:49
По этой теме... 


Мне движок магазинный дали.. там все  переменный были такие  $_POST[&name];  без кавычек... И мне чтобы все это работало пришлось везде тупо ставить кавычки, а у други все работало ... почему ? 

Автор: -=Ustas=- 8.11.2006, 10:18
Mystery_of_being, нет, не по этой. Одна тема - один вопрос, читай основы PHP.

Добавлено @ 10:32 
Enya, ты не правильно обращалась к ПОСТ-массиву, в котором у тебя были нужные тебе массивы, и соответственно циклы неправильные были.

Автор: Enya 8.11.2006, 10:53
-=Ustas=-, 
Код

$count = sizeof($_POST['id']);
    $idString = implode(',', $_POST['id']);
    $sql = 'DELETE FROM `objects` WHERE `id` IN('.$idString.')';
    mysql_query($sql);
в $count получаем кол-во элементов из массва $_POST['id'], а вот потом хотелось бы увидеть ваш комментарий
Код

$idString = implode(',', $_POST['id']);
$sql = 'DELETE FROM `objects` WHERE `id` IN('.$idString.')';

Автор: -=Ustas=- 8.11.2006, 11:14
Ну на самом деле, эта конструкция, чтоб бы обойтись одним запросом без цикла
Код

// Преобразуем массив ID-ишников в строку через запятую (для оператора IN в SQL-запросе)
// на выходе имеем вид, тип 12,32,43,54,64,332
$idString = implode(',', $_POST['id']);
// т.е. здесь мы в SQL-запросе имеем такой вид - DELETE FROM `objects` WHERE `id` IN(12,32,43,54,64,332)
// Оператор IN равносилен запросу DELETE FROM `objects` WHERE `id` = 12 AND `id` = 32 AND `id` = 43 AND `id` =54 AND `id` = 64 AND `id` = 332;
$sql = 'DELETE FROM `objects` WHERE `id` IN('.$idString.')';

Надеюсь понятно обяснил?!  smile 

Автор: Enya 8.11.2006, 11:23
-=Ustas=-, конечно! я просто не знала, что есть такой оператор в SQL 
Код

IN

Как-то не сталкивалась. Спасибо! smile  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)