[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Кнопки редактирования и удаления записей
Athlete
Всем привет! У меня задача: вывожу записи из БД, напротив каждой позиции хочу сделать кнопочку редактирования и удаления записи, у кого нибудь была подобная задачка? В phpMyAdmin это реализовано, но разбираться там мне надо очень долго, может можно как то проще сделать?



Спустя 1 минута, 59 секунд (9.04.2009 - 07:27) Joker написал(а):
Можно) Вот кстати токочто в другом посте выкладывал сылку) там PHP примеры. Там гостевая разжевания на до мелочей прочитай думаю сразу все станет ясным.

Спустя 34 минуты, 4 секунды (9.04.2009 - 08:01) Kuliev написал(а):
Athlete

Вот не большой пример, также можешь сделать и редактирование!

PHP
$sql = ("SELECT * FROM table");
    $result = mysql_query($sql);

    $table = "<form method=GET>";
    $table .= "<table border=0 align=center width=300 cellpadding=4 cellspacing=1><tr bgcolor=#C0c0c0>";
    $table .= "<td>№</td><td>Название</td><td>Del</td></tr>";

     while ($row = mysql_fetch_assoc($result))
     {
         $table .= "<tr bgcolor=#FFDD33><td>".$row['id']."</td><td>".$row['name']."</td>";
        $table .= "<td><input type=checkbox name=id[] value='".$row['id']."'></td></tr>";

     }

    $table .= "<tr><td colspan=3 align=center><input type=submit name=del value='delete'></td></tr>";
    $table .= "</table>";

    echo $table;

if (isset($_GET['del') ? $_GET['del'] : null)
{
     
     for 
($i = 0; $i < count($_GET['id']); $i++)
   {
         $sql = ("DELETE FROM table WHERE id = '".$_GET['id'][$i]."'");
         $result = mysql_query($sql);
    } 

}

Спустя 3 минуты, 2 секунды (9.04.2009 - 08:04) Joker написал(а):
Ну также не получиться) чтоб отредактировать форма нужна а не просто тыкнуть что редактировать.

Спустя 30 минут, 49 секунд (9.04.2009 - 08:35) Kuliev написал(а):
Цитата (Joker @ 9.04.2009 - 05:04)
Ну также не получиться) чтоб отредактировать форма нужна а не просто тыкнуть что редактировать.

В этом коде я удаляю записи, а вот редактировать пусть немного подумает где что добавить! А то всем бы все и даром!

Спустя 3 часа, 30 минут, 14 секунд (9.04.2009 - 12:05) Athlete написал(а):
Спасибо всем, буду пробовать

Спустя 8 минут, 37 секунд (9.04.2009 - 12:14) Athlete написал(а):
PHP
if (isset($_GET['del') ? $_GET['del'] : null)
{
     
     for 
($i = 0; $i < count($_GET['id']); $i++)
   {
         $sql = ("DELETE FROM table WHERE id = '".$_GET['id'][$i]."'");
         $result = mysql_query($sql);
    } 

}


Поясните работу цикла, пожалуйста. Не понимаю условие if

Спустя 48 минут, 31 секунда (9.04.2009 - 13:03) sergeiss написал(а):
Цитата (Athlete @ 9.04.2009 - 12:14)
PHP
if (isset($_GET['del') ? $_GET['del'] : null)
{
     
     for 
($i = 0; $i < count($_GET['id']); $i++)
   {
         $sql = (\\"DELETE FROM table WHERE id = '\\".$_GET['id'][$i].\\"'\\");
         $result = mysql_query($sql);
    } 

}


Поясните работу цикла, пожалуйста. Не понимаю условие if

Если говорить честно, то приведенный "образец" - изврат полный!!!

1.
PHP
if (isset($_GET['del') ? $_GET['del'] : null)
легко сокращается до
PHP
if (isset($_GET['del']) )


2. Цикл for в данном случае зачем? Лучше foreach
PHP
foreach( $_GET['id'] as $val )
{
  $sql="DELETE FROM table WHERE id = '$val'";
  $result = mysql_query($sql);
}


PS. В суть примера я даже не вникал, просто сразу бросилось в глаза то, о чем написал.

Спустя 8 минут, 19 секунд (9.04.2009 - 13:11) Kuliev написал(а):
Цитата (sergeiss @ 9.04.2009 - 10:03)
Цитата (Athlete @ 9.04.2009 - 12:14)
PHP
if (isset($_GET['del') ? $_GET['del'] : null)
{
     
     for 
($i = 0; $i < count($_GET['id']); $i++)
   {
         $sql = ("DELETE FROM table WHERE id = '".$_GET['id'][$i]."'");
         $result = mysql_query($sql);
    } 

}


Поясните работу цикла, пожалуйста. Не понимаю условие if

Если говорить честно, то приведенный "образец" - изврат полный!!!

1.
PHP
if (isset($_GET['del') ? $_GET['del'] : null)
легко сокращается до
PHP
шf (isset($_GET['del') )


2. Цикл for в данном случае зачем? Лучше foreach
PHP
foreach( $_GET['id'] as $val )
{
  $sql="DELETE FROM table WHERE id = '$val'";
  $result = mysql_query($sql);
}


PS. В суть примера я даже не вникал, просто сразу бросилось в глаза то, о чем написал.

Какая разница между For и Foreach, в краткости написания или он в 3 раза быстрей перебирает????

Согласен что можно и так написать
PHP
if (isset($_GET['del']))
{
 
// Действие
}


Только в чем разница???

Спустя 16 минут, 58 секунд (9.04.2009 - 13:28) sergeiss написал(а):
Цитата (Kuliev @ 9.04.2009 - 13:11)

Согласен что можно и так написать
PHP
if (isset($_GET['del']))
{
 // Действие
}


Только в чем разница???

Можно понять, если бы ты написал присвоение
PHP
$del_value=isset($_GET['del') ? $_GET['del'] : null;

Но для условия в if это тавталогия типа "масло масляное", т.е. существенная переизбыточность.


Цитата (Kuliev @ 9.04.2009 - 13:11)
Цитата (sergeiss @ 9.04.2009 - 10:03)

2. Цикл for в данном случае зачем? Лучше foreach
PHP
foreach( $_GET['id'] as $val )
{
  $sql=\\"DELETE FROM table WHERE id = '$val'\\";
  $result = mysql_query($sql);
}


PS. В суть примера я даже не вникал, просто сразу бросилось в глаза то, о чем написал.

Какая разница между For и Foreach, в краткости написания или он в 3 раза быстрей перебирает????

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

Спустя 55 секунд (9.04.2009 - 13:29) Kuliev написал(а):
Вот еще статья для размышления я думаю никому лишней не будет!

Циклы: for, foreach, while, count/sizeof() - ускорение 15%-30%
В начале программы создается массив $test из целых чисел (100 000 элементов). Потом один раз запускаются приведенные ниже примеры. Цикл проходит данный массив 3-мя способами (разными циклами) и выполняет кое-какие операции. Не выполнять в цикле ничего нельзя, ибо это будет уже совсем не реальный тест.
PHP
{$x=0; foreach($test as $n) { $x=sprintf("test%08i",$i); }} 
{
$x=0; for ($it=0$it<100000$it++) { $x=sprintf("test%08i",$i); }} 
{
$x=0$it=0; while($it<100000) { $x=sprintf("test%08i",$i); $it++; }} 
{
$x=0; for ($it=0$it<count($test); $it++) { $x=sprintf("test%08i",$i); }} 
{
$x=0$it=0; while($it<count($test)) { $x=sprintf("test%08i",$i); $it++; }} 
{
$x=0$co=count($test); for ($it=0$it<$co$it++) { $x=sprintf("test%08i",$i); }} 
{
$x=0$co=count($test); $it=0; while($it<$co) { $x=sprintf("test%08i",$i); $it++; }}


Почему sprintf, а не реальное echo? echo использовать нельзя, т.к. от него будет немерянный буфер (OUTPUT в браузер или консоль).

Теперь о деле. Бесспорный вывод - использование foreach сильно тормозит дело, а между for и while большой разницы нет. (На голом тесте for/while/foreach {..} тормоза foreach - 30%). Это не удивительно, т.к. foreach делает копию массива, на что тратиться масса времени (хотя это только слухи).

Вывод с count() не столь очевиден, потому что от разного текста в цикле % тормознутости от самого быстрого варианта резко возрастает... Я взял цикл с небольшой нагрузкой - проход по огромному массиву $test + форматирование функцией sprintf. Как видите, варинты с count() и заменяющей эту функцию перемнной $co различаются на 10% по скорости между собой (не смотрите на варинант с константой в 100000, заранее знать кол-во элементов невозможно).

Вывод о не ассоциативных массивах: 1) foreach существенно замедляет работу 2) использование count() в простых циклах - замедленение 10%. Но на сложных циклах потери от лишних запусков count() будут абсолютно незаметны, так что ситуация не очевидна.

Сравнение count() и sizeof().

Судя по мануалу - это алиасы. Об этом написано на страницах самих функций и дополнительной странице "Appendex => Aliases list". Что же мы видим на массиве в 100000 элементов:
PHP
{$x=0; for ($it=0$it<count($test); $it++) { $x=sprintf("test%08i",$test[$it]);}} 
{
$x=0; for ($it=0$it<sizeof($test); $it++) { $x=sprintf("test%08i",$test[$it]);}}

Пусть тесты будут иметь погрешности... Но результат один - count() заметно отстает по скорости от sizeof()! Хм, я бы к записи в мануале сделал приписку: "The sizeof() function is an alias for count(), but последний сильно тормозит!"

Если кол-во элементов в массиве меньше 65000 (64К), то эти функции по скорости практически не различимы. Тут вывод простой - переходим на использование sizeof(), как ускоренного алиаса count(). Это принесет свои результаты на огромных массивах.

Ассоциативные массивы: тестирование разных способов перебора

С ними наблюдается таже проблема: на разных по величине массивах разные функции эффективны, но лучше всех foreach!

Массив в 200 элементов и 1000 повторов программы:
PHP
{$x=0; foreach($test as $k=>$v) { $x=sprintf("%s=>%s\n",$k,$v); }} 
{
$x=0reset($test); while (list($k$v) = each($test)) { $x=sprintf("%s=>%s\n",$k,$v); }} 
{
$x=0$k=array_keys($test); $co=sizeof($k); for ($it=0$it<$co$it++) { $x=sprintf("%s=>%s\n",$k[$it],$test[$k[$it]]); }} 
{
$x=0reset($test); while ($k=key($test)) { $x=sprintf("%s=>%s\n",$k,current($test)); next($test); }}

Резюме:

- sizeof() лучше, чем count()
- в циклах sizeof лучше вообще заменить на переменную
- for и while практически не отличимы
- для перебора простых индексных массивов нужно использовать for или while
- для перебора ассоциативных массивов нужно использотьва foreach
Источник статьи!


Спустя 5 минут, 59 секунд (9.04.2009 - 13:35) sergeiss написал(а):
Разница в скорости, говоришь? wink.gif
"Сколько вешать в граммах?" (С)

Там если при миллионе циклов будет разница в тысячные доли секунды, то уже ладно. Да и то эту разницу еще надо суметь точно оценить.

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

Да еще и не факт вовсе, что for будет быстрее.

Спустя 5 минут, 50 секунд (9.04.2009 - 13:41) sergeiss написал(а):
Цитата (Kuliev @ 9.04.2009 - 13:29)
$x=sprintf("test%08i",$i);

И еще позволь заметить (это типа "шпилька") - тот, кто проводил тест, даже не догадывался о том, что в указанном мной выражении (это из приведенного тобой теста) используется неоптимальный код. Который тормозит скрипт tongue.gif tongue.gif tongue.gif
Правильно в данном случае будет
PHP
$x=sprintf('test%08i',$i);

Мелочь, вроде бы. Но сколько-то процентов ускорения можно получить wink.gif

Спустя 20 минут, 40 секунд (9.04.2009 - 14:01) Kuliev написал(а):
sergeiss

Я насколько заметил ты постоянно придераешся к массивам!
Конкретно к циклу FOR предлагая альтернативу FOREACH!

Извините, но я знаю какой массив и какую размерность я формирую в скрипте, согласно этому я и выбираю цикл перебора данного массива!

В приведенном мной примере кода индексом массива будет числовой массив а не ассоциативный, по этому я использую в нем цикл FOR

Хотя по большому счету разница при выборе цикла в данном коде не принципиальна, кому что нравиться! wink.gif

Спустя 13 минут, 18 секунд (9.04.2009 - 14:15) sergeiss написал(а):
Ты лучше не спорь, а запусти свой пример... Он не будет работать smile.gif

1. Потому что там допущена одна существенная ошибка: у тебя не набор чекбоксов, а один чекбокс, судя по его имени. Которое не является массивом.
Поэтому в форму для обработки будет передано значение последнего из чекбоксов.

2. Даже если ты и сделаешь имя name="id[]", то все равно не будет работать. Потому что на принимающей стороне в массиве $_GET['id'] будут не все чекбоксы, как ты предполагаешь, а только те, что были выбраны.
Поэтому там будет как раз массив с пропусками индексов. Для которого только foreach подойдет.

Можно будет и for использовать... Но только вовсе не так, как ты это делаешь. А немного по-другому. Но все равно по сути это получится тот же foreach smile.gif
Так зачем мудрить? Может, сразу использовать то, что надо?

Спустя 14 минут, 7 секунд (9.04.2009 - 14:29) Kuliev написал(а):
Цитата


sergeiss

2. Даже если ты и сделаешь имя name="id[]", то все равно не будет работать. Потому что на принимающей стороне в массиве $_GET['id'] будут не все чекбоксы, как ты предполагаешь, а только те, что были выбраны.
Поэтому там будет как раз массив с пропусками индексов. Для которого только foreach подойдет.


Все исправил, все работает отлично!

Мне и нужны только отмеченные чекбоксы для удаления!!!
PHP
Array
(
    [
id] => Array
        (
            [
0] => 1
            
[1] => 4
            
[2] => 6
            
[3] => 7
            
[4] => 10
        
)

    [
del] => Delete
)


Спустя 5 часов, 23 минуты, 48 секунд (9.04.2009 - 19:52) kirik написал(а):
Оо..) Опять холивор по поводу производительности smile.gif
У вас уже все работает, а я с недавних пор вместо foreach стал использовать while. Результат тот же что и у foreach, но без потерь в памяти cool.gif
PHP
while(list($key, $val) = each($array))
{
    // .....
}
reset($array);


Или для конкретного случая:
PHP
while(list(, $val) = each($_GET['id']))
{
    $sql="DELETE FROM table WHERE id = '$val'";
    $result = mysql_query($sql);
}
reset($_GET['id']);

*первая переменная в list() пропущена не случайно.

ЗЫ. отвлекся от цикла, взгляд упал на запрос.. Ну кто же делает запросы в цикле?

Спустя 11 часов, 37 секунд (10.04.2009 - 06:53) Kuliev написал(а):
kirik
Цитата

ЗЫ. отвлекся от цикла, взгляд упал на запрос.. Ну кто же делает запросы в цикле?

Объясни как удалить несколько строк из БД не используя цикл!!!

Спустя 14 минут, 54 секунды (10.04.2009 - 07:08) Joker написал(а):
Просто)

PHP
mysql_query("DELETE FROM `table` WHERE `id`='1' OR `id`='2'");


PHP
mysql_query("DELETE FROM `table` WHERE `id`>'1'");


PHP
mysql_query("DELETE FROM `table` WHERE `id`<>'1'");

Спустя 11 минут, 53 секунды (10.04.2009 - 07:20) Kuliev написал(а):
Цитата (Joker @ 10.04.2009 - 04:08)
Просто)

PHP
mysql_query("DELETE FROM `table` WHERE `id`='1' OR `id`='2'");


PHP
mysql_query("DELETE FROM `table` WHERE `id`>'1'");


PHP
mysql_query("DELETE FROM `table` WHERE `id`<>'1'");

Это понятно, но у меня если ты заметил из массива разные ID!

Спустя 3 минуты, 14 секунд (10.04.2009 - 07:23) Joker написал(а):
Фонтазию подключи))) Темболее первый запрос там разные ид написаны читай внимательнее.

PHP
mysql_query("DELETE FROM `table` WHERE
`id`='1' OR 
`id`='2' OR
`id`='3' OR
`id`='4' OR
`id`='5' OR
`id`='6' OR
`id`='7' OR
`id`='8'


"
);


Могу еще сказать как из масива с ид сделать такую строку)

Спустя 1 час, 10 минут, 19 секунд (10.04.2009 - 08:33) sergeiss написал(а):
Ежели очень НЕ нравится foreach, то можно и так делать (я сам же об этом недавно где-то тут писал smile.gif):
PHP
// пусть $arr - массив с данными
for( $a=reset$arr ); $a != false$a=next$a ) )
{
// тело цикла
}

Можно убрать "!= false" в условии, но будет менее наглядно.

Но только в итоге получаем, по сути дела, тот же самый foreach!!!

Спустя 21 минута, 39 секунд (10.04.2009 - 08:55) kirik написал(а):
Цитата (Kuliev @ 9.04.2009 - 22:53)
Объясни как удалить несколько строк из БД не используя цикл!!!

SQL
DELETE FROM `table` WHERE `id` IN(1,3,5,2)

или как Joker написал с помощью OR (так как при большом количестве удаляемых записей ("от нескольких сотен до нескольких тысяч записей") IN будет тупить. Доказано FatCat)

Спустя 2 часа, 23 минуты, 4 секунды (10.04.2009 - 11:18) Kuliev написал(а):
Цитата (sergeiss @ 10.04.2009 - 05:33)
Ежели очень НЕ нравится foreach, то можно и так делать (я сам же об этом недавно где-то тут писал smile.gif):
PHP
// пусть $arr - массив с данными
for( $a=reset( $arr ); $a != false; $a=next( $a ) )
{
// тело цикла
}

Можно убрать "!= false" в условии, но будет менее наглядно.

Но только в итоге получаем, по сути дела, тот же самый foreach!!!

Вот видишь, что и следовало доказать! Вариантов много как решить одну задач. Каждый выбирает то что ему нравиться и то что он считает лучшим!
Цитата

Цитата (Kuliev @ 9.04.2009 - 22:53)
Объясни как удалить несколько строк из БД не используя цикл!!!

SQL
DELETE FROM `table` WHERE `id` IN(1,3,5,2)

или как Joker написал с помощью OR (так как при большом количестве удаляемых записей ("от нескольких сотен до нескольких тысяч записей") IN будет тупить. Доказано FatCat)


Спасибо учту на будущее! huh.gif

Спустя 49 минут, 26 секунд (10.04.2009 - 12:08) sergeiss написал(а):
Цитата (Kuliev @ 10.04.2009 - 11:18)
Цитата (sergeiss @ 10.04.2009 - 05:33)
Ежели очень НЕ нравится foreach, то можно и так делать (я сам же об этом недавно где-то тут писал smile.gif):
PHP
// пусть $arr - массив с данными
for( $a=reset( $arr ); $a != false; $a=next( $a ) )
{
// тело цикла
}

Можно убрать "!= false" в условии, но будет менее наглядно.

Но только в итоге получаем, по сути дела, тот же самый foreach!!!

Вот видишь, что и следовало доказать! Вариантов много как решить одну задач. Каждый выбирает то что ему нравиться и то что он считает лучшим!

Как раз это доказывает, что лучше использовать foreach smile.gif Не зря же его придумали.

PS. Я это говорю больше не для сравнения разных типов циклов, они хороши каждый для своих целей. А больше для того, что мне непонятно, зачем люди начинают "изобретать велосипеды": кто-то хочет делать всё через один тип цикла, хотя он не везде удобен; другой хочет сделать работу с данными через файлы, вместо БД; ну и так далее в том же духе. Вот только ЗАЧЕМ?

Спустя 1 час, 37 минут, 58 секунд (10.04.2009 - 13:46) Kuliev написал(а):
sergeiss
Цитата

Вот только ЗАЧЕМ?


Ну наверное все приходит с ОПЫТОМ!

Спустя 2 месяца, 19 дней, 18 часов, 54 минуты, 55 секунд (30.06.2009 - 08:40) Athlete написал(а):
Kuliev
Подскажи, что ты исправил, так и не разобрался с данной задачей. Я так понимаю, что для того чтобы кнопка submit работала, нужна форма, нужен обрабатывающий скрипт, а в варианте, который ты предлагаешь я не вижу ни формы, ни скрипта.

Спустя 51 минута, 46 секунд (30.06.2009 - 09:32) twin написал(а):
Цитата
У вас уже все работает, а я с недавних пор вместо foreach стал использовать while. Результат тот же что и у foreach, но без потерь в памяти
А ты в курсе, что while медленнее чем foreach почти в 10 раз?

Спустя 1 час, 42 минуты, 15 секунд (30.06.2009 - 11:14) Alchemist написал(а):
twin, откуда дровишки ?

Спустя 31 минута (30.06.2009 - 11:45) twin написал(а):
Мерял )))

Спустя 15 минут, 58 секунд (30.06.2009 - 12:01) jetistyum написал(а):
очередной спор на сколько наносекунд один оператор быстрее другого smile.gif
да фигня все это.... и for и foreach обычно не используют на больших массивах, тем более по много раз... если гнаться за производительностью, нужно забыть про разного рода фреймворки сразу... но посмотрите тенденцию.... по поиску работы нужны только программеры на фреймворках ZF, Symfony, etc. потому что если нужна производительность, то не проблема взять нормальный хостинг, нужна еще больше - еще более нормальный, т.к. производительность сказывается на проектах не типа "гостевая книга" ... а там где хороший проект, хорошая посещаемость и прибыль, совсем не сложно взять нормальный хостинг, а не гнаться за оптимизацией каждого for вместо foreach (я не отрицаю идею оптимального написания кода, но только не в "параноидальной форме") лично я всегда писал везде foreach ... и ни один проект от этого не загнулся wink.gif ну удобнее мне так... оптимальнее может и писать for .... а еще оптимальнее на питоне, C++, С, а может и на асме wink.gif

Спустя 51 минута, 20 секунд (30.06.2009 - 12:53) twin написал(а):
Во пробило biggrin.gif
Да не спорил ни кто, просто я к сведению. Недавно мерял, вот к слову и пришлось. А то что не гнаться за оптимизацией - это ты зря. Сегодня один хостинг, завтра другой... Продукт должен быть качественным вне зависимости от.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.