Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение переменной из ключа массива 
:(
    Опции темы
xarakiry
Дата 14.7.2008, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 28.5.2008

Репутация: -1
Всего: -1



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

К примеру есть $_POST['name'] как мне из него сделать $name, т.е в массиве много ключей и всех мне надо перевести в обычный вид. 
--------------------
Все университеты Азербайджана на students.az
PM MAIL WWW   Вверх
bars80080
Дата 14.7.2008, 18:07 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Код

foreach($_POST as $k => $v) {
$$k = $v;
}


но так лучше не делать

зачем такая задача?
PM MAIL WWW   Вверх
xarakiry
Дата 14.7.2008, 19:05 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 28.5.2008

Репутация: -1
Всего: -1



Цитата(bars80080 @ 14.7.2008,  18:07)
Код

foreach($_POST as $k => $v) {
$$k = $v;
}


но так лучше не делать

зачем такая задача?

Это не совсем подходит. Я же говорю надо перевести элемент массива в строковую переменную... а форич просчитывает  массив как элемент - ключ. А требуется из ключа сделать переменную.
из $_POST['name'] в  $name
из $_POST['city']  в $city
и т.д


А надо это чтобы потом проще было работать с переменными, и пропускать через функции. (Во всяком случае для меня так проще)
--------------------
Все университеты Азербайджана на students.az
PM MAIL WWW   Вверх
Fortop
Дата 14.7.2008, 20:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



xarakiry, 
Либо я ничего не понял, либо Вы не поняли приведенного кода.

Судя по сумбурным описаниям, скорее второе. Поэтому перечитайте и перетестируйте образец кода.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Feldmarschall
Дата 14.7.2008, 21:26 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



xarakiry, через функции пропускать удобнее, как раз, массив. В цикле.
Давай ты покажешь нам эти функции, а мы покажем тебе компактный код в три строчки, который с ними работает.
PM   Вверх
xarakiry
Дата 15.7.2008, 20:22 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 28.5.2008

Репутация: -1
Всего: -1



Цитата(Feldmarschall @ 14.7.2008,  21:26)
xarakiry, через функции пропускать удобнее, как раз, массив. В цикле.
Давай ты покажешь нам эти функции, а мы покажем тебе компактный код в три строчки, который с ними работает.

Ну, вот моя функция 

Код


function updatedbitems($link, $db, $unical_number, $dk_nomre, $sehra_qeydi, $diger_nomre,
    $picture1, $picture2, $picture3, $adi, $tapildigi_yer, $tapildigi_vaxt, $tapan_shexs,
    $dovrleshdirilmesi, $tesviri, $oyrenilmesi, $hundurluyu, $eni, $uzunlugu, $chekisi,
    $diametr, $agiz, $govde, $oturacaq, $terkibi, $elave_qeydiler, $veziyyati, $shkafda_yer,
    $tertib_eden, $muzeya_tehvil_ver_vaxt)
{
    /*-----------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
    $unical_number = htmlspecialchars($unical_number);
    $dk_nomre = htmlspecialchars($dk_nomre);
    $sehra_qeydi = htmlspecialchars($sehra_qeydi);
    $diger_nomre = htmlspecialchars($diger_nomre);
    $adi = htmlspecialchars($adi);
    $tapildigi_yer = htmlspecialchars($tapildigi_yer);
    $tapildigi_vaxt = htmlspecialchars($tapildigi_vaxt);
    $tapan_shexs = htmlspecialchars($tapan_shexs);
    $dovrleshdirilmesi = htmlspecialchars($dovrleshdirilmesi);
    $tesviri = htmlspecialchars($tesviri);
    $oyrenilmesi = htmlspecialchars($oyrenilmesi);
    $hundurluyu = htmlspecialchars($hundurluyu);
    $eni = htmlspecialchars($eni);
    $uzunlugu = htmlspecialchars($uzunlugu);
    $chekisi = htmlspecialchars($chekisi);
    $diametr = htmlspecialchars($diametr);
    $agiz = htmlspecialchars($agiz);
    $govde = htmlspecialchars($govde);
    $oturacaq = htmlspecialchars($oturacaq);
    $terkibi = htmlspecialchars($terkibi);
    $elave_qeydiler = htmlspecialchars($elave_qeydiler);
    $veziyyati = htmlspecialchars($veziyyati);
    $shkafda_yer = htmlspecialchars($shkafda_yer);
    $tertib_eden = htmlspecialchars($tertib_eden);
    $muzeya_tehvil_ver_vaxt = htmlspecialchars($muzeya_tehvil_ver_vaxt);
    /*----------------------------------------------------------------------*/
    mysql_select_db($db, $link) or die(mysql_error); //Выбираем базу данных
    $query1 = "START TRANSACTION;";
    $query2 = "UPDATE museum_base SET unical_number='$unical_number',dk_nomre='$dk_nomre',sehra_qeydi='$sehra_qeydi',diger_nomre='$diger_nomre',adi='$adi',tapildigi_yer='$tapildigi_yer',tapildigi_vaxt='$tapildigi_vaxt',tapan_shexs='$tapan_shexs',tesviri='$tesviri',dovrleshdirilmesi='$dovrleshdirilmesi',oyrenilmesi='$oyrenilmesi',hundurluyu='$hundurluyu',eni='$eni',uzunlugu='$uzunlugu',chekisi='$chekisi',diametr='$diametr',agiz='$agiz',govde='$govde',oturacaq='$oturacaq',terkibi='$terkibi',elave_qeydiler='$elave_qeydiler',veziyyati='$veziyyati',shkafda_yer='$shkafda_yer',tertib_eden='$tertib_eden',mezeya_tehvil_ver_vaxt='$mezeya_tehvil_ver_vaxt',picture1='$picture1',picture2='$picture2',picture3='$picture3' WHERE unical_number='$unical_number' ;";
    $query3 = "COMMIT;";
    /*-----------------------------------Конец запросов SQL--------------------------------------*/
    if (!mysql_query($query1))
    {
        die(mysql_error($link));
    }
    if (!mysql_query($query2))
    {
        die(mysql_error($link));
    }
    if (!mysql_query($query3))
    {
        die(mysql_error($link));
    }


}


?>


это я ещё убрал из неё трим...

Знаю знаю выглядит ужасно и не компактно... 
--------------------
Все университеты Азербайджана на students.az
PM MAIL WWW   Вверх
skyboy
Дата 15.7.2008, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



xarakiry, примечание: htmlspecialchars - не для обработки перед вставкой в БД. а для обработки непосредственно перед выводом пользователю
PM MAIL   Вверх
Fortop
Дата 15.7.2008, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(xarakiry @  15.7.2008,  20:22 Найти цитируемый пост)
$unical_number, $dk_nomre, $sehra_qeydi, $diger_nomre,
    $picture1, $picture2, $picture3, $adi, $tapildigi_yer, $tapildigi_vaxt, $tapan_shexs,
    $dovrleshdirilmesi, $tesviri, $oyrenilmesi, $hundurluyu, $eni, $uzunlugu, $chekisi,
    $diametr, $agiz, $govde, $oturacaq, $terkibi, $elave_qeydiler, $veziyyati, $shkafda_yer,
    $tertib_eden, $muzeya_tehvil_ver_vaxt

Это все связанные между собой свойства?
Если да, то создай объект/модель/массив
и передавай в функцию именно его

// FIELD_NAME - это всегда имя из списка имен разрешенных для получения извне данных.
// FIELD_VALUE - сами данные соответствующие этому имени.
// как их лучше профильтровать см. один из приемов организации фильтрации входящих данных
Код

$data  = array( 'FIELD_NAME_1' => 'FIELD_VALUE_1', 
...,
'FIELD_NAME_N' => 'FIELD_VALUE_N');

function updatedbitems($link, array $data) {

    //формирование SQL
    if (count($data) > 0) {
        $sql = 'UPDATE table SET ';
        foreach ($data as $fieldName => $fieldValue) {
            $sql .= $fieldName . ' = \'' . mysql_real_escape_string($fieldValue) . '\', ';
        }
        $sql = substr($sql, 0, -2); // отрезаем лишний пробел и запятую
    }
    // выполнение транзакции
    if (mysql_start_transaction()) {
        if (!mysql_query($sql)) {
            die(mysql_error($link));
        }
        if (!mysql_commit_transaction()) {
            die(mysql_error($link));
        }
    }
}


Это сообщение отредактировал(а) Fortop - 15.7.2008, 21:06


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Feldmarschall
Дата 15.7.2008, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



Это POST
а транзакция ему не нужна
PM   Вверх
xarakiry
Дата 15.7.2008, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 28.5.2008

Репутация: -1
Всего: -1



Цитата(Fortop @ 15.7.2008,  21:04)
Цитата(xarakiry @  15.7.2008,  20:22 Найти цитируемый пост)
$unical_number, $dk_nomre, $sehra_qeydi, $diger_nomre,
    $picture1, $picture2, $picture3, $adi, $tapildigi_yer, $tapildigi_vaxt, $tapan_shexs,
    $dovrleshdirilmesi, $tesviri, $oyrenilmesi, $hundurluyu, $eni, $uzunlugu, $chekisi,
    $diametr, $agiz, $govde, $oturacaq, $terkibi, $elave_qeydiler, $veziyyati, $shkafda_yer,
    $tertib_eden, $muzeya_tehvil_ver_vaxt

Это все связанные между собой свойства?
Если да, то создай объект/модель/массив
и передавай в функцию именно его

// FIELD_NAME - это всегда имя из списка имен разрешенных для получения извне данных.
// FIELD_VALUE - сами данные соответствующие этому имени.
// как их лучше профильтровать см. один из приемов организации фильтрации входящих данных
Код

$data  = array( 'FIELD_NAME_1' => 'FIELD_VALUE_1', 
...,
'FIELD_NAME_N' => 'FIELD_VALUE_N');

function updatedbitems($link, array $data) {

    //формирование SQL
    if (count($data) > 0) {
        $sql = 'UPDATE table SET ';
        foreach ($data as $fieldName => $fieldValue) {
            $sql .= $fieldName . ' = \'' . mysql_real_escape_string($fieldValue) . '\', ';
        }
        $sql = substr($sql, 0, -2); // отрезаем лишний пробел и запятую
    }
    // выполнение транзакции
    if (mysql_start_transaction()) {
        if (!mysql_query($sql)) {
            die(mysql_error($link));
        }
        if (!mysql_commit_transaction()) {
            die(mysql_error($link));
        }
    }
}

Отличный пример ! Вот только последнее не понял... что за функция mysql_start_transaction, я её даже на php.net не нашёл.... ???

Вопросик:
Код


$allowed = ( 'имя_ключа_из_ПОСТ' => 'разрешенный тип или еще лучше имя callback функции для фильтрации и валидации данных',
                    ...,
                    'имя_ключа_из_ПОСТ' => 'разрешенный тип или еще лучше имя callback функции для фильтрации и валидации данных',
                    'имя_ключа_из_ПОСТ' => 'разрешенный тип или еще лучше имя callback функции для фильтрации и валидации данных',
);


не понял что за "разрешенный тип или еще лучше имя callback функции для фильтрации и валидации данных" это как ?
--------------------
Все университеты Азербайджана на students.az
PM MAIL WWW   Вверх
Feldmarschall
Дата 15.7.2008, 22:34 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



xarakiry, это слишком сложно для человека, который впервые узнал про циклы
тебе надо понять две вещи.
1. что любой массив удобнее обрабатывать в цикле. чем городить из него сто переменных и писать каждую отдельной строчкой. Надеюсь, ты это уже понял
2. Что твои данные надо обрабатывать в цикле. Ты уже написал этот цикл? Можно посмотреть?

После того, как напишешь обработку в цикле, можно будет приступить к автоматическому составлению запроса. В цикле, разумеется.
PM   Вверх
Fortop
Дата 16.7.2008, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(Feldmarschall @  15.7.2008,  21:14 Найти цитируемый пост)
Это POST

я понимаю smile но в нем могут идти данные которые не нужно записывать в одну таблицу...
более того бывает даже строго наоборот, нужно записать в разные smile

Цитата(xarakiry @  15.7.2008,  21:56 Найти цитируемый пост)
Вот только последнее не понял... что за функция mysql_start_transaction, я её даже на php.net не нашёл.... ???

Это как раз самое простое smile
тривиальная обертка над твоим
Код

    $query1 = "START TRANSACTION;";
    if (!mysql_query($query1))
    {
        die(mysql_error($link));
    }



Цитата(xarakiry @  15.7.2008,  21:56 Найти цитируемый пост)
не понял что за "разрешенный тип или еще лучше имя callback функции для фильтрации и валидации данных" это как ? 

это значит что все данные полученные из внешних источников должны проверяться. Чтобы ты получил в качестве года именно число, а не надпись "Здесь был Вася".
Дальше идет описание как лучше организовать эту проверку.

В качестве параметра в массиве разрешенных данных можно хранить или имя функции или "имя типа" (т.е. какого типа мы ожидаем данные)
простейший случай - "имя типа"

Код

$allowed = array('user_id' => 'int',
                 'name'    => 'string',
                 'male'     => 'bool');



тогда фильтрация пришедших данных будет выглядеть примерно так

Код

foreach ($_POST as $key => $val) {
    if (array_key_exists($key, $allowed)) {
        switch ($allowed[$key]) {
            case 'int':
                $result[$key] = (int)$val;
            break;
            case 'string':
                // строка остается как есть. 
                $result[$key] = $val;
                // Но если нужно можем и с ней что-то сделать (например привести в верхний регистр)
                // $result[$key] = strtoupper($val);
            break;
            case 'bool':
                // скобки нужны лишь для лучшего понимания - т.е. необязательны.
                $result[$key] = ($val == 'true');
            break;
            default:
            break;
        }
    }
}
//теперь у нас в $result только разрешенные нами переменные  и только тех типов которые мы ожидаем


Но, Feldmarschall, прав - лучше все по порядку. Так удобнее это осваивать.

Это сообщение отредактировал(а) Fortop - 16.7.2008, 00:59


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Feldmarschall
Дата 16.7.2008, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



Цитата(Fortop @  16.7.2008,  00:56 Найти цитируемый пост)
но в нем могут идти данные которые не нужно записывать

та я в курсе. 
как ты правильно заметил, я хотел по порядку.

Короче.
Если уж он тебя так слушает, раскрыв рот, то объясни ему, пожалуйста, что
транзакция на один запрос не имеет смысла.
что в общем случае достаточно перечислить только имена разрешенных полей, а в запросе оформлять, как строки. т.е. функция становится примитивной, и без колбэков.
что в функции updatedbitems нет ни малейшего смысла, и что вообще не нужно делать функции, вызываемые только один раз
что нужна вместо неё create_set_query().



Это сообщение отредактировал(а) Feldmarschall - 16.7.2008, 08:31
PM   Вверх
xarakiry
Дата 16.7.2008, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 28.5.2008

Репутация: -1
Всего: -1



Fortop Да, дейст-но с массивами проще, код уменьшается.
Feldmarschall Да , я слушаю но не раскрыв рот. Если бы я считал себя специалистом я не писал бы в этом разделе, а наверное задавал бы вопросы в разделе профи. Я не считаю что задать вопрос и получить ответ чем то постыдным.  захожу сюда потому что тут люди для разных задач находят интересные решения, что очень радует.
Спасибо большое всем за помощь!  smile 
--------------------
Все университеты Азербайджана на students.az
PM MAIL WWW   Вверх
Feldmarschall
Дата 16.7.2008, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



Цитата(xarakiry @  16.7.2008,  10:19 Найти цитируемый пост)
Если бы я считал себя специалистом я не писал бы в этом разделе, а наверное задавал бы вопросы в разделе профи. Я не считаю что задать вопрос и получить ответ чем то постыдным.  захожу сюда потому что тут люди для разных задач находят интересные решения, что очень радует.

не понял,  чему была эта тирада.

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0686 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.