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


Автор: Shark 25.3.2016, 15:25
Есть код:
Код

switch(key($_POST))
    {
        case 'add': $a="Добавить"; break;
        case 'view': mysql_query("UPDATE test SET status='0' WHERE id='".$_POST['id']."' ") or die (mysql_error()); break;
        case 'cancel': mysql_query("UPDATE test SET status='1' WHERE id='".$_POST['id']."' ") or die (mysql_error());break;        
        case 'remove': $a="Удаление"; break;
    }

switch висит на кнопках, view и cancel меняются в зависимости от параметра status в БД...

Вопрос: как передать id в mysql запрос?

накатал на скорую руку (не рабтает)
Код

<form action="" method=POST>
<input type=hidden name='id' value='1'>
<input type=submit name='add' value=ADD>
<?php
$tbl=mysql_query("SELECT `status` FROM test ");
while($tbls=mysql_fetch_array($tbl)) {
if($tbls['status'] == '1')
{ echo '<input type=submit name="view" value="VIEW">';}
else
{ echo '<input type=submit name="cancel" value="CANCEL VIEW">';}
}
?>
<input type=submit name='remove' value=REMOVE>

Автор: ksnk 25.3.2016, 17:38
Перед этой строкой `switch(key($_POST))` какая то работа с массивом POST ведется? Если нет, то key($_POST) вернет первый попавшийся ключ массива POST. Например `id`, если он будет идти первым в массиве.

Менее затратно по времени отладки - применять проверки на наличие ключей функцией isset 

Код

$action='donow';

if(isset($_POST['add'])) {
   $action='add';
}elseif (isset($_POST['cancel']) {
   $action='cancel';
} ...

switch($action){
 ...
}

Автор: NFL 26.3.2016, 11:44
Вообще ошибка в проектировании))
Даете submit'ам одно имя (например, action) и дальше просто switch($_POST['action'])

ЗЫ: и забудьте о 5.4 и ниже, а до кучи еще и про mysql_*

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/key(ye_POST)-id56f52e98ae2015bd688b4567#findElement_E7045_56f64bdcae2015ce24cd68f9_0

Автор: Shark 26.3.2016, 14:11
так у меня будет полей 20 где-то... и для каждого делать проверку?

Автор: whatisnot 26.3.2016, 18:29
Цитата(Shark @  25.3.2016,  15:25 Найти цитируемый пост)
WHERE id='".$_POST['id']."'


Слишком смело, да и зачем числовым значениям кавычки.

Автор: ksnk 26.3.2016, 18:42
Цитата(Shark @  26.3.2016,  14:11 Найти цитируемый пост)
так у меня будет полей 20 где-то... и для каждого делать проверку? 

А как иначе?  smile 
Можно вот так, например, если вспомнить про классы 
Код


class makeItNice {

  static function post_add(&$result){
       $result='Добавить';
  }

  static function post_view(&$result){
        return mysql_query("UPDATE test SET status='0' WHERE id=".(0+$_POST['id'])) or die (mysql_error());
  }

 ...

}


foreach($_POST as $key=>$val){

    if(is_callable(array('makeItNice','post_'.$key))){
        call_user_function(array('makeItNice','post_'.$key),$a);
    }
}

Автор: Shark 26.3.2016, 19:00
т.е. вызывать класс, в кейсе?... хм... интересно.. нужно будет подумать над этим

Код

(0+$_POST['id'])


а зачем так писать?

Автор: ksnk 26.3.2016, 19:36
Цитата(Shark @  26.3.2016,  19:00 Найти цитируемый пост)


(0+$_POST['id'])

а зачем так писать?

Это такой хитрый способ приведения к числу. Записывается короче, чем intval и выглядит загадочно  smile.

Автор: Shark 28.3.2016, 09:44
ksnk, Увидел в конце твоего примера цикл foreach, и сделал так:
Код

foreach($_POST as $val=>$key)
{
switch($val)
    {
        case 'add': $a="Добавить"; break;
        case 'view': mysql_query("UPDATE test SET status='0' WHERE id='".(int)$_POST."' ") or die (mysql_error()); break;
        case 'cancel': mysql_query("UPDATE test SET status='1' WHERE id='".(int)$_POST."' ") or die (mysql_error());break;        
        case 'remove': $a="Удаление"; break;
    }
}
?>


Вроде работает. Или все же лучше создать класс и использовать его?


P.S. не работает smile))

Автор: ksnk 28.3.2016, 11:04
В php, конечно, есть своя особенная магия, но к телепатии она отношения не имеет.

(int)$_POST - это что должно быть?

Автор: Shark 28.3.2016, 15:03
Цитата

(int)$_POST - это что должно быть? 

циферка smile))))))


Решил самым бредовым способом, но работает smile))
Код

    foreach($_POST as $val=>$key)
        {
            switch($val)
                {
                    case 'add': $a="Добавить"; break;
                    case 'view': mysql_query("UPDATE test SET status='0' WHERE id='".$_POST['id']."' ") or die (mysql_error());  break;
                    case 'cancel': mysql_query("UPDATE test SET status='1' WHERE id='".$_POST['id']."' ") or die (mysql_error());  break;        
                    case 'remove': $a="Удаление"; break;
                    
                }        
        }
    


?>
<?php

$tbl=mysql_query("SELECT `id`,`status` FROM test ");
while($tbls=mysql_fetch_array($tbl)) {
echo '<form action="index2.php?id='.$tbls['id'].'" method=POST>';
echo "<input type=text name='id' value='".$tbls['id']."'><br />";
echo "<input type=submit name='add' value=ADD>";

if($tbls['status'] == '1')
{ echo '<input type=submit name="view" value="Опубликовать объект">';}
else
{ echo '<input type=submit name="cancel" value="Снять с публикации объект">';}
echo "<input type=submit name='remove' value=REMOVE><br /><br />";
echo "</form>";
}

?>


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

Автор: whatisnot 28.3.2016, 15:51
Цитата(Shark @  28.3.2016,  09:44 Найти цитируемый пост)
(int)$_POST

Это конечно глупость, а вот тут $_POST['id'] как раз и должно быть (int)$_POST['id']. А еще лучше если множество значений:

Код

if($ids = array_diff(array_map('intval', $_POST), [0])) {
    foreach($ids ....) 
}
 

Автор: superVad 1.4.2016, 17:30
http://www.w3schools.com/tags/att_button_value.asp

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