Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Подсказка для формы ввода
Форумы портала PHP.SU » PHP » Программирование на PHP » Подсказка для формы ввода

Страниц (1): [1]
 

1. Roman4uk - 07 Июня, 2010 - 20:24:21 - перейти к сообщению
При создании сайта наткнулся на одну задачку. Хотелось при каждом обновлении рядом с формой для поиска появлялась бы подсказка (как у Яндекса). Создал текстовый файл test.txt (в данном примере с 4-мя строками: яблоко, груша, банан, апельсин). На странице разместил следующий код:

PHP:
скопировать код в буфер обмена
  1. <form name='form1' method='post' action=''>
  2. <input type="text" size=15 style="font-size:16px" name='text1' value=''>
  3. <input type="submit" name=go value=Go style="font-size:16px">
  4. <?PHP
  5. $file_array = file("test.txt");
  6.   $count=count($file_array);
  7.   $count--;
  8.   $rand=rand(0, $count);
  9.  ?>
  10. <br>Например:
  11. <a href=# onclick="document.form1.text1.value='<?=$file_array[$rand]?>'"><?=$file_array[$rand];?></a>
  12. </form>


Странность заключается в том, что случайная запись выводится, но в поле формы значение меняется ТОЛЬКО в том случае, если рандомится последняя строка из файла (в данном примере апельин). Та же петрушка и при использовании базы MySQL. В чем ошибка? Подскадите, пожалуйста!!!
2. valenok - 07 Июня, 2010 - 20:55:30 - перейти к сообщению
Посмотри исходники страницы когда из файлы выбирается не апельсин.
Если в них нет ничего подозрительного, можешь их приложить сюда.
(Ту часть со ссылкой, в том виде, в котором она находится в html)
3. Roman4uk - 07 Июня, 2010 - 21:05:44 - перейти к сообщению
функция onclick прекрасно работает, если параметром value передать строковую константу или любую другую объявленную через PHP переменную. Не понятно, почему, она работает только в случае последней строки (последнего элемента массива).
При использовании MySQL-способа, когда рандомится id записи, то опять же значение формы меняется ТОЛЬКО, если случайно выбрана крайняя (с бОльшим id) запись.
Я уже мозг сломал над простой (как мне казалось) задачей. Может это баг?
Хотя функции массивов в PHP и элементарные JS-функции уже много лет работают без ошибок.
(Добавление)
А ведь точно!
Если выбрана любая НЕ КОНЕЧНАЯ запись то код выглядит так:

<a href.... onclic=............'груша
'>? то есть с переводом каретки на новую строку, а при ПОСЛЕДНЕЙ записи возвращается нормальный код, т.к. нет в ней символа "/n".
Спасибо за направление мысли!!!!
А как избавиться от проблемы с переводом строки (каретки) при выборе НЕпоследней строки???
Плиз, поможите!
4. valenok - 07 Июня, 2010 - 21:24:57 - перейти к сообщению
trim
Странно правда. file() делит строки на элементы массивы автоматически обрезая символы перевода строки. Откуда перевод строки вообще появляется в БД я не догадываюсь.
5. Roman4uk - 07 Июня, 2010 - 21:27:56 - перейти к сообщению
Ведь сама рандомная строка выводится без ощибок!!!
Проблема только в функции onclick
(Добавление)
Я уверн, вы профи в PHP-кодинге! Можно как-то иным способом оформить затею с подсказкой для поля ввода?
6. valenok - 07 Июня, 2010 - 22:23:18 - перейти к сообщению
Скопируй сюда получающийся html при разных подсказках и содержимое файла .
7. Roman4uk - 07 Июня, 2010 - 22:32:44 - перейти к сообщению
Вот файл test.txt:
яблоко
груша
банан
апельсин

Если выбрано банан:
<form name='form1' method='post' action=''>
<input type="text" size=15 style="font-size:16px" name='text1' value=''>
<input type="submit" name=go value=Go style="font-size:16px">
<br>Например:
<a href=# onclick="document.form1.text1.value='банан
'">банан
</a>
</form>

Если выбран апельсин (последний в файле):
<form name='form1' method='post' action=''>
<input type="text" size=15 style="font-size:16px" name='text1' value=''>
<input type="submit" name=go value=Go style="font-size:16px">
<br>Например:
<a href=# onclick="document.form1.text1.value='апельсин'">апельсин</a>
</form>
8. JustUserR - 08 Июня, 2010 - 14:03:42 - перейти к сообщению
Roman4uk Получившаяся в вашем случае ошибка еще раз говорит о том что в on_event* аттрибутах не стоит указыть достаточно большой JS-код со вложенными кавычками и тем более подстановочными значениями - поскольку такой аттрибут является частью html-кода и сразу подвеграется ограничением по синтаксисву и экранированию как со стороны html-парсера так и со стороны JS-интерпретатора
Конкретно в вашем случае решение простое - а именно добавить переменную $rnd_text=preg_replace('/(\r?\n)+/igs','',$file_array[$rand]) и выводить в onclick именно ее саму - и желательно произвести ее экранирование с помощью addslashes и замену всех двойных кавычек на одиночные
9. Roman4uk - 08 Июня, 2010 - 17:46:37 - перейти к сообщению
Переделал код на выборку из SQL-базы, добавил функцию trim, и все заработало!
Спасибо вам.
10. JustUserR - 09 Июня, 2010 - 10:40:37 - перейти к сообщению
Roman4uk пишет:
Переделал код на выборку из SQL-базы, добавил функцию trim, и все заработало!
В принципе при использовании текстовой базы данных из файла тоже несложно убрать лишние символы перевода стороки - например с помощью регулярных выражений или функции str_replace Однако при хранении данных в текстовой БД стоит проводить их предварительное шифрование для того чтобы символы в самих данных не могли смешаться с разделительными спецсимволами - и таким образом при обратном разделении данных и дешифровке вы не получите никаких лишних символов которые придется потом убирать

 

Powered by ExBB FM 1.0 RC1