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

Форум PHP

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

 

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

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

тема: Визуальная корректировка строк одномерного массива.
 
 автор: Владимир55   (25.07.2007 в 12:22)   письмо автору
 
 

Имеется одномерный массив переменных $ssilka[$j], которые я вывожу на экран вот таким образом:

for ($j = 1; $j <= $n_ss; $j++)
    {
       echo $ssilka[$j];
    }


А хотелось бы сделать так, чтобы эти сроки выводились не просто на экран, а в форму, где каждую из них можно с клавы подкорректировать, и одной кнопкой "Ввод" сохранить корректировку.

Даже не представляю, как бы такое осуществить...

   
 
 автор: buro   (25.07.2007 в 12:27)   письмо автору
 
   для: Владимир55   (25.07.2007 в 12:22)
 

А массив Вы от куда берёте?

   
 
 автор: cheops   (25.07.2007 в 12:29)   письмо автору
 
   для: Владимир55   (25.07.2007 в 12:22)
 

А массив откуда берётся из файла, базы данных, сессии?

   
 
 автор: Киналь   (25.07.2007 в 12:31)   письмо автору
 
   для: Владимир55   (25.07.2007 в 12:22)
 

Дык...
>

>for ($j = 1; $j <= $n_ss; $j++)
>    {
>       echo "<input type=text size=70 name='$j' value='$ssilka[$j]'><p>";
>    }
>


Дальше дело техники)

   
 
 автор: Владимир55   (25.07.2007 в 13:09)   письмо автору
 
   для: Киналь   (25.07.2007 в 12:31)
 

Массив формируется непосредственно при работе скрипта (без базы, без сессии). Рецепт Киналь подошел просто шикарно, но довести его до конца я не сумел...

У меня получается так:


for ($j = 1; $j <= $n_ss; $j++)
    {
       echo "<input type=text size=70 name='$j' value='$ssilka[$j]'><p>";
    }

echo '<input type="submit" value="Ввести" name="B2">' ;


А теперь, как я понимаю, надо вытаскивать глобальные переменные

for ($j = 1; $j <= $n_ss; $j++)
    {
       $ssilka[$j] = _POST[$ssilka[$j]];
       echo $ssilka[$j];
    }


Разумеется, эта конструкция не работает, а как надо, я не знаю!

   
 
 автор: Trianon   (25.07.2007 в 13:18)   письмо автору
 
   для: Владимир55   (25.07.2007 в 13:09)
 

Во-первых, все поля нужно поместить в тег формы.
Во-вторых, отключить magic_quotes_gpc - это делается в в .htaccess
В третьих, не забывать про функцию htmlspecialchars() которая преобразует plain-text в html-код
<?php 
echo "<form action =? method=post>";
for (
$j 1$j <= $n_ss$j++) 
       
$ssilka[$j] = $_POST[$ssilka[$j]]; 

for (
$j 1$j <= $n_ss$j++) 
       echo 
"<input type=text size=70 name=\"$j\" value=\""
      
htmlspecialchars($ssilka[$j])
      . 
"\"><p>"

echo 
'<input type="submit" value="Ввести" name="B2"></form>' 
?>



>А теперь, как я понимаю, надо вытаскивать глобальные переменные
$_POST - это массив входных параметров, пришедших с формы, отправленной методом POST

   
 
 автор: Владимир55   (25.07.2007 в 14:23)   письмо автору
 
   для: Trianon   (25.07.2007 в 13:18)
 

К сожалению, так не получилось... Пустые окна в форме, и больше ничего достичь не удалось.

Попробовал вот так:

echo "<form action =? method=post>";
for ($j = 1; $j <= $n_ss; $j++)
       echo "<input type=text size=70 name=\"$j\" value=\""
      . htmlspecialchars($ssilka[$j])
      . "\"><p>";
echo '<input type="submit" value="Ввести" name="B1"></form>' ;


if (isset($_POST['B1']))
    {
    echo "Скорректированный результат:<br>";
        for ($j = 1; $j <= $n_ss; $j++)
            {
            $ssilka[$j] = $_POST[$ssilka[$j]];
               echo $ssilka[$j];
               echo "<br>";
               }
     }


Теперь в окнах формы есть первоначальный текст, но после нажатия на кнопку "Ввести" пишется только "Скорректированный результат:"

Что-то еще надо изменить в части вывода глобальных переменных, но что?
===============
В .htaccess сделал записи:
php_flag magic_quotes_gpc Off
php_flag magic_quotes_runtime Off

Так надо?

   
 
 автор: buro   (25.07.2007 в 14:41)   письмо автору
 
   для: Владимир55   (25.07.2007 в 14:23)
 

может лучше объяснить суть скрипта... зачем Вам обрабатывать то, что появляется в процессе? смысл плиз... Вы же эти данные потом будете использовать или они так и висят в воздухе?

   
 
 автор: Владимир55   (25.07.2007 в 15:02)   письмо автору
 
   для: buro   (25.07.2007 в 14:41)
 

Скрипт сформировал массив строк в автоматическом режиме, подбирая их из выдачи Яндекса по формальным признакам. А теперь я хочу взглянуть на результат и вручную подправить то, что мне не нравится. Потом эти строки этого массива ложатся нужным мне образом в текстовый файл, который и является результатом работы скрипта.
Сам скрипт уже работает и меня вполне устраивает, так что осталось только отладить корректировку, о кодах которой я и пишу.

   
 
 автор: Trianon   (25.07.2007 в 15:12)   письмо автору
 
   для: Владимир55   (25.07.2007 в 14:23)
 

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

php_flag magic_quotes_gpc Off
да, именно так.

php_flag magic_quotes_runtime
это, к счастью - значение по умолчанию

   
 
 автор: Владимир55   (25.07.2007 в 15:25)   письмо автору
 
   для: Trianon   (25.07.2007 в 15:12)
 

В теле файла ins.php происходит обращение к Яндексу, из выдачи которого формируется одномерный массив переменных. Вот такой:

echo $ssilka[1]; Кайт-школа Акватории лета
echo $ssilka[2]; Лет 10 назад человек работал по соседству, в одном издательстве
echo $ssilka[3]; Обувь для лета: модные тренды 2007
echo $ssilka[4]; Сумчатое настроение на лето
echo $ssilka[5]; Архитектурное Летоэтого года может кардинально изменить Вашу жизнь!

Из этих строк я формирую текстовый файл, который мне и нужен.

Скрипт работает уже несколько дней и прекрасно справляется с порученным ему делом.

Однако иногда возникает необходимость внести некоторые исправления в сформированные строки. Вот взгляните на последнюю строку - там слово "Лето" слилось со следующим словом. Надо бы это вручную исправить, а потом весь массив строк записать в те же переменные $ssilka[ ], чтобы скрипт продолжил свою работу.

С имеющимися кодами он этого не делает. Даже вот так не выводит скорректированные тексты, хотя в переменных $ssilka[ ], которые я для контроля вывожу ниже, они есть:

echo "<form action =? method=post>";
for ($j = 1; $j <= $n_ss; $j++)
       echo "<input type=text size=70 name=\"$j\" value=\""
      . htmlspecialchars($ssilka[$j])
      . "\"><p>";
echo '<input type="submit" value="Ввести" name="B1"></form>' ;


if (isset($_POST['B1']))
    {
    echo "Скорректированный результат:<br>";
    $ssilka[1] = $_POST[$ssilka[1]];
    echo $ssilka[1];
    $ssilka[2] = $_POST[$ssilka[2]];
    echo $ssilka[2];
    $ssilka[3] = $_POST[$ssilka[3]];
    echo $ssilka[3];
    }

echo $ssilka[1];
echo $ssilka[2];
echo $ssilka[3];


Можно прочесть только "Скорректированный результат:"

   
 
 автор: Trianon   (25.07.2007 в 15:43)   письмо автору
 
   для: Владимир55   (25.07.2007 в 15:25)
 

Так не выйдет.
Запрос, который получает данные с яндекса
и запрос, который получает данные из формы редактирования
- это два разных запроса

<?php 

 
// разместите здесь код, который обращается 
 // к яндексу и вытаскивает массив строк $ssilka[]
 // .......
 // .......

 // код , создающий форму, и вписывающий в нее данные их массива с яндекса
 
echo "<form action=update_lines.php method=post>\r\n";
 foreach(
$ssilka as $key =>$line)
    echo 
"$key : ".<input name=var[$idvalue=\".htmlspecialchars($line).""\"></br>\r\n";
 echo 
"<input value=Update type=submit /></form>\r\n";

?>



<?php // это файл update_lines.php

  
if(isset($_POST['var']))
  {
      
$ssilka $_POST['var'];

  
//    здесь разместите Ваш код, который из массива $ssilka 
  //    сформирует окончательный файл.
  // .......
  // .......
  
}

?>

   
 
 автор: Владимир55   (25.07.2007 в 16:00)   письмо автору
 
   для: Trianon   (25.07.2007 в 15:43)
 

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

Сначала скрипт работает с Яндексом и формирует массив. При этом Яндексу посылается нужное количество запросов, какждый из которых обрабатывается надлежащим образом - так и формируется массив строк $ssilka[ ].

Когда сформировано требуемое количество элементов массива, общения с Яндексом прекращается. Всё, про Яндекс и запросы к нему забыли, ибо это уже в прошлом. Теперь работаем только с набранным массивом. С теми кодами, о которых я писал. И я никак не могу понять, почему они не работают? Очевидно, что не работает вот это

echo "<input type=text size=70 name=\"$j\" value=\""
      . htmlspecialchars($ssilka[$j])
      . "\"><p>";

ибо в глобальную переменную информация не попадает!

   
 
 автор: Trianon   (25.07.2007 в 16:09)   письмо автору
 
   для: Владимир55   (25.07.2007 в 16:00)
 

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

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

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

Есть мааааааленькое исключение из этого правила, которое касается содержимого переменной $_SESSION. Но если Вы не понимаете предыдущего - в сторону сессий Вам смотреть категорически рано.

   
 
 автор: Владимир55   (25.07.2007 в 16:26)   письмо автору
 
   для: Trianon   (25.07.2007 в 16:09)
 

Я все это понимаю, и я всё это учел. Более того, проверил сохранность элементов массива. Вот взгляните на код в этой ветке (25.07.2007 в 15:25) - там ниже отлаживаемого кода дополнительно выводятся первые три элемента массива, из которых я вижу, что содержимое в них есть, оно не пропало и не должно было пропасть, поскольку из файла я не уходил и его не перезапускал.
На практике я эти же три элемента вывожу и до отлаживаемой части кода - на всякий случай.

Подобные вещи я проверяю первым делом, всегда размещая ловушки в узловых частях скрипта.

Так что дело не в этом. Дело, вероятнее всего, в коде ввода в глобальные переменные.

   
 
 автор: Trianon   (25.07.2007 в 16:45)   письмо автору
 
   для: Владимир55   (25.07.2007 в 16:26)
 

Вы не всё учли.
Вы не учли того, что код , который нарисовал форму, и код, который обработал её поля после нажатия кнопки Ввести - это код РАЗНЫХ скирптов.
Второй скрипт указывается в теге - <form action=скрипт.

Да, у Вас там стоит вопрос , что означает, грубо говоря - файл той же страницы.
Файл то тот же. Но вызов скрипта из этого файла по событию отправки формы - уже другой - новый вызов.
И в новом вызове у Вас будет скрипт от начала выполняться заново. C несуществующим массивом $ssilka (правда уже с непустым $_POST)

Так что хотите Вы этого или нет, Вам придется рассмотреть эти две реинкарнации одного скрипта независимо.

Хотя я полагаю, Вам было бы проще явно разбить скрипт на два...


Кстати $_POST[] можно вывести так:

print_r($POST);

   
 
 автор: Владимир55   (25.07.2007 в 20:02)   письмо автору
 
   для: Trianon   (25.07.2007 в 16:45)
 

Разумеется, Вы совершенно правы!

Я целый день долбился любом в этот скрипт, и лишь теперь до меня дошло, как оно есть на самом деле.

Большое Вам спасибо!

И за советы как таковые, и за само желание донести правильные сведения до моей головы!

   
 
 автор: Trianon   (25.07.2007 в 20:06)   письмо автору
 
   для: Владимир55   (25.07.2007 в 20:02)
 

Донес-то Poison... его благодарите.
Я не смог.

   
 
 автор: buro   (25.07.2007 в 16:34)   письмо автору
 
   для: Владимир55   (25.07.2007 в 16:00)
 


echo "<input type=text size=70 name=\"peremen".$j."\" value=\"" 
      . htmlspecialchars($ssilka[$j]) 
      . "\"><br/>"; 

а так не покатит? (там переменные цифрами как то мутно мне кажется) потом принимайте файлом переменные и записывайте в файл или базу. чего уж тут мудрить :)

по сути задачка проще простого. скрипт получает из яндекса, массив опять же формирует скрипт, редактируете, нажимаете, записывает скрипт

   
 
 автор: Владимир55   (25.07.2007 в 16:58)   письмо автору
 
   для: buro   (25.07.2007 в 16:34)
 

*** а так не покатит? ***
А фиг его разберет...

Делаю вот такой простейший код:

$ssilka[1] = "ПЕРВЫЙ текст №1";
$ssilka[2] = "ВТОРОЙ текст №2";
$ssilka[3] = "ТРЕТИЙ текст №3";

for ($j = 1; $j <= 3; $j++)
    {
       echo "<input type=text size=70 name=\"peremen".$j."\" value=\""
      . htmlspecialchars($ssilka[$j])
      . "\"><br/>";
    }
echo '<input type="submit" value="Ввести" name="B2">' ;

if (isset($_POST['B2']))
    {
    echo "<br>Скорректированный результат:<br>";
    $ssilka[1] = $_POST[$ssilka[1]];
    echo $ssilka[1];
    $ssilka[2] = $_POST[$ssilka[2]];
    echo $ssilka[2];
    $ssilka[3] = $_POST[$ssilka[3]];
    echo $ssilka[3];
    }


Первоначальный текст в форме прописывается, а больше никакой реакции!

У меня уже спортивный интерес преобладает над практическим, так что либо этот код у меня заработает, либо не знаю что я с ним сделаю...

   
 
 автор: buro   (25.07.2007 в 18:07)   письмо автору
 
   для: Владимир55   (25.07.2007 в 16:58)
 

что же вы делаете?... это и не должно по сути работать :)



  $ssilka[1] = "ПЕРВЫЙ текст №1";
$ssilka[2] = "ВТОРОЙ текст №2";
$ssilka[3] = "ТРЕТИЙ текст №3";
echo"
<form action='?act=3' method='post'>";// тройка означает скока сылок как я считаю
for ($j = 1; $j <= 3; $j++) 
    { 
       echo "<input type=text size=70 name=\"peremen".$j."\" value=\"" 
      . htmlspecialchars($ssilka[$j]) 
      . "\"><br/>"; 
    } 
echo '<input type="submit" value="Ввести" >' ; 
echo "</form>";
if ($_GET['act']=="3")
{
for ($j = 1; $j <= 3; $j++) 
    {
 echo "".$_POST["peremen$j"]."<br/>";
    }
}


ну примерно так должно выглядеть... работает проверил

   
 
 автор: Владимир55   (25.07.2007 в 19:40)   письмо автору
 
   для: buro   (25.07.2007 в 18:07)
 

Да, так заработало, БОЛЬШОЕ спасибо! Правда, пока только на макете, в отдельном файле, а в скрипте не хочет. Но уж это мы его уговорим...

И в этой связи такой вопрос.
При запуске файла со скриптом в его адресе появляется добавка ?act=3 (точнее, ?act=N, где N - число элементов массива).

Какова её сущность?

   
 
 автор: Trianon   (25.07.2007 в 19:48)   письмо автору
 
   для: Владимир55   (25.07.2007 в 19:40)
 

это попытка передать GET-параметром признак наличия полей POST ....
Довольно неуклюжая :(

Да. В принципе, POST-запрос может передавать и POST и GET-переменные одновременно.
На практике такая методика обычно только усложняет алгоритм.

   
 
 автор: Poison   (25.07.2007 в 18:51)   письмо автору
 
   для: Владимир55   (25.07.2007 в 16:58)
 

Владимир55 вам же Trianon написал рабочий пример? и обьяснил, а вы непоймете что после того как яндекс забьет инфу в ваш массив и вы отредактируете данные, нажмете сохранить и ваш скрипт снова полезет к яндексу...

По примеру ошибка очевидна:

<%
$ssilka[1] = "ПЕРВЫЙ текст №1"; 
$ssilka[2] = "ВТОРОЙ текст №2"; 
$ssilka[3] = "ТРЕТИЙ текст №3"; 

for ($j = 0; $j < sizeOf($ssilka); $j++) 
    { /* Здесь вы даете полям имена типа 0,1,2,3 и тд */
       echo "<input type=text size=70 name=\"".$j."\" value=\"" 
      . htmlspecialchars($ssilka[ $j ]) 
      . "\"><br/>"; 
    } 
echo '<input type="submit" value="Ввести" name="B2">' ; 

if (isset($_POST['B2'])) 
    { /* А здесь? их и нужно искать по  0,1,2,3 и тд */
    echo "<br>Скорректированный результат:<br>"; 
    $ssilka[1] = $_POST[0]; 
    echo $ssilka[1]; 
    $ssilka[2] = $_POST[1]; 
    echo $ssilka[2]; 
    $ssilka[3] = $_POST[2]; 
    echo $ssilka[3]; 
    }

   
 
 автор: Владимир55   (25.07.2007 в 19:25)   письмо автору
 
   для: Poison   (25.07.2007 в 18:51)
 

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

Теперь я понимаю, о какой ситуации говорил Trianon! Спасибо ему - он опытный человек и предусмотрел всякие варианты.
Но такой ситуации у меня не бывает. Ибо после того, как я отредактирую данные, мне уже незачем лезть в Яндекс и скрипт не понадобится по крайней мере несколько дней...

Видимо, я потому и не понял его предостережения, что в голове не было такого алгоритма. Но на будущее приму к сведению! Большое спасибо!

   
Rambler's Top100
вверх

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