[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: передача данных
freed-master
может чуток не в тему и все же
есть форма поиска
HTML
<form action="?m=10" method="post">
<input name="search_q" type="text" size="15" maxlength="30" />
<input name="search" type="submit" value="Найти" /></form>

после нажатия кнопки на страницу загружается файл, исполняющий поиск и выводящий результат
PHP
if(isset($_POST['search'])) 
{
  
$search_q = isset($_POST['search_q'])?$_POST['search_q']:null;
  
$search_r mysql_query("SELECT * FROM `table` WHERE `name` LIKE ('%$search_q%')");
  while(
$row mysql_fetch_assoc($search_r)) 
  {
// вывод результата
  
}
}

так вот интересно - при клике мышкой по кнопке найти все работает
а при нажатии энтэр - нифига, пишет supplied argument
на сколько я понимаю - файл загружается, но данные для поиска не передаются...
как быть?



Спустя 4 минуты, 46 секунд (4.10.2009 - 18:29) Gabriel написал(а):
freed-master
у самого такое нашел елементарнейший вывод не жмакать ентер

Спустя 3 минуты, 53 секунды (4.10.2009 - 18:32) SunSet написал(а):
freed-master
выведи запрос через print, посмотришь что туда попадает для поиска.

Спустя 12 минут, 40 секунд (4.10.2009 - 18:45) Pinoplast написал(а):
Сделай проверку submit через if и isset и напишы "падонок нажми кнопку biggrin.gif "

Спустя 15 минут, 10 секунд (4.10.2009 - 19:00) SunSet написал(а):
Pinoplast
PHP
if(isset($_POST['search']))

А это не проверка, не?

Спустя 3 минуты, 49 секунд (4.10.2009 - 19:04) sergeiss написал(а):
Первое.
Цитата (SunSet @ 4.10.2009 - 19:32)
выведи запрос через print, посмотришь что туда попадает для поиска.

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

Второе. У тебя тут широкие ворота для SQL-инъекции. smile.gif

Третье. А сколько у тебя кнопок? Только "Найти" или есть еще в этой форме кнопки? Это очень существенно.

Спустя 6 минут, 36 секунд (4.10.2009 - 19:11) SunSet написал(а):
sergeiss
PHP
print ("SELECT * FROM `table` WHERE `name` LIKE ('%$search_q%')");

tongue.gif
Но я и не сомневаюсь, что и сейчас мой ответ окажется неправильным))))

Спустя 7 минут, 43 секунды (4.10.2009 - 19:18) sergeiss написал(а):
SunSet - я поражаюсь твоим телепатическим способностям... wink.gif
Ты прав, я имел ввиду другое, типа такого (и плюс к этому сделать защиту от SQL-инъекции):
PHP
$str="SELECT * FROM `table` WHERE `name` LIKE ('%$search_q%')";
echo $str.'<br>';

$search_r = @mysql_query( $str ) or die( "Ошибка при выполнении запроса '$str': ".mysql_error() );
  while($row = mysql_fetch_assoc($search_r)) 
{
...
}

Преимущество в том, что мы только в одном месте формируем сам запрос. И потом мы можем его выводить, можем отправлять его в БД, можем выводить в файл... Но если мы что-то поменяем в запросе, то сделаем это только в одном месте.

Спустя 2 минуты, 53 секунды (4.10.2009 - 19:21) Pinoplast написал(а):
Цитата (SunSet @ 4.10.2009 - 16:00)
Pinoplast
PHP
if(isset($_POST['search']))

А это не проверка, не?

незаметил sad.gif

Спустя 3 минуты, 39 секунд (4.10.2009 - 19:25) SunSet написал(а):
sergeiss
Нуу.. .я же советывал просто посмотреть, что попадает в переменную $search_q, потому предложенный мной вариант вполне подошел бы. smile.gif

Спустя 8 минут, 55 секунд (4.10.2009 - 19:34) sergeiss написал(а):
А я и не говорю, что он неправильный... Я только сказал, что ты не угадал, что я имел ввиду biggrin.gif

Спустя 4 минуты, 52 секунды (4.10.2009 - 19:39) SunSet написал(а):
sergeiss
Извольте не согласиться!!
Поскольку, я первым предложил вывести запрос, то как раз ты неправильно меня понял) Мой вариант вполне обходится без занесения в переменную)
Твой вариант скорее подходит для улучшения самой конструкции, которую автор привел, так как и без нее можно было обойтись для вывода tongue.gif

Спустя 1 минута, 43 секунды (4.10.2009 - 19:40) sergeiss написал(а):
SunSet давай (оба) не будем флудить в теме, находящейся не во Флейме...

Спустя 31 минута, 45 секунд (4.10.2009 - 20:12) freed-master написал(а):
Цитата
Resource id #8
Ошибка при выполнении запроса 'Resource id #8': You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Resource id #8' at line 1

лично мне эта надпись мало о чем говорит...

Спустя 2 минуты, 39 секунд (4.10.2009 - 20:15) sergeiss написал(а):
Цитата (freed-master @ 4.10.2009 - 21:12)
You have an error in your SQL syntax

"У вас есть ошибка в синтаксисе SQL".

Сделай же наконец-то, чёрт побери, вывод на экран текста подготовленного запроса, до попытки выполнить его, и выложи этот запрос сюда! Потому что "гадать на кофейной гуще" весьма проблематично.

Спустя 13 минут, 8 секунд (4.10.2009 - 20:28) freed-master написал(а):
но именно это я и сделал!!!
сейчас убрал вообще все, оставил толко
Цитата
вывод на экран текста подготовленного запроса
и при нажатии энтер ничего не увидел, а при клике мышкой - Resource id #8

Спустя 2 минуты, 24 секунды (4.10.2009 - 20:30) sergeiss написал(а):
Я вот не пойму... Ты на самом деле не понимаешь, или прикидываешься? smile.gif Я тебе говорю, что выведи на экран (у себя!!!) текст запроса. Как это сделать - я в этой теме уже показывал (да и не только я). Привел полный код.
Затем тупо скопируй этот текст и покажи его здесь.

И покажи также полный текст этой части скрипта, как он сейчас выглядит

Спустя 6 минут, 16 секунд (4.10.2009 - 20:37) glock18 написал(а):
# - комментарий в mysql

в эту переменную, которая попадает в строку - попадает идентификатор соединения или что-то подобное

Спустя 8 минут, 5 секунд (4.10.2009 - 20:45) freed-master написал(а):
кажется понял, надеюсь
сделал:
PHP
print ("SELECT * FROM `table` WHERE `name` LIKE ('%$search_q%')");
получил
Цитата
SELECT * FROM `table` WHERE `name` LIKE ('%мой_запрос%')

нееее... погодите ка
то что выше (цитата) это при нажатии мышкой по кнопке, но это и так работает,
а при нажатии энтэр - попрежнему ничего

Спустя 8 минут, 29 секунд (4.10.2009 - 20:53) sergeiss написал(а):
Поставь в начале скрипта строку
PHP
var_dump$_POST)
и посмотри, что у тебя передается в массиве $_POST.
Возможно, что у тебя при нажатии энтера просто не передается информация о кнопке smile.gif Потому что реально она не нажата.

Браузер какой?

Спустя 13 минут, 14 секунд (4.10.2009 - 21:06) freed-master написал(а):
результат
Код
array(1) { ["search_q"]=> string(10) "пенал" }

Цитата
Браузер какой?
IE6
кстати в опере все работает unsure.gif

Спустя 2 часа, 17 минут, 24 секунды (4.10.2009 - 23:24) sergeiss написал(а):
Честно говоря, не знаю даже, что и сказать.... Пробовал сейчас всяко, "со словами и без слов" smile.gif, но не только в Опере, но и в ИЭ 6.0 всё работает "как часы". То есть, ежели я нажимаю Энтер в текстовом поле, то происходит как бы программное нажатие кнопки типа "submit".
Пробовал разные варианты, чтобы отловить, что же было нажато на самом деле: ничего не помогает.

Точнее говоря, получил какие-то "мутные" варианты, которые мне самому не нравятся smile.gif

Хотя сама задача, вобще-то, интересная.

Спустя 29 минут, 49 секунд (4.10.2009 - 23:54) sergeiss написал(а):
"И всё-таки она вертится!" biggrin.gif

Нашел я вариант, он был одним из первых у меня. Только я там ошибку сначала допустил. Потом ее исправил, и всё работает.

1. Тип кнопки делаем не submit, а button.
2. Вводим дополнительное поле с именем и айди hid.
3. Делаем функцию submit_correct на JS.
Код
function submit_correct( )
{
 if( document.getElementById('hid').value != 'sav' ) return false;
 return true;
}

4. Для формы делаем обработчик
Код
onsubmit="return submit_correct();"

5. Для кнопки (из п.1) делаем обработчик
Код
onclick="document.getElementById('hid').value='sav'; document.getElementById('text_editor').submit();"


Здесь text_editor - это имя и айди формы.

Что происходит.
При сабмите проверяется, была ли нажата нужная кнопка. В ИЭ (6.0) нажатие Энтер в текстовом поле вообще ни к чему не приводит, поэтому форма по нажатию Энтер не запускаетсяч.
Опера (у меня 9.25) при нажатии Энтер в текстовом поле игнорирует всякие кнопки, и Опера пытается сделать сабмит (зараза такая...). Но тут мы видим в обработчике, что у hid нету величины! А это означает, что не была нажата кнопка запуска. Поэтому возвращаем false и submit формы не делается.
Далее. На принимающей стороне нужно проверить величину в $_POST['hid'] и выполнить нужные действие. А мы можем сделать несколько кнопок для разных действий, и писать в hid разные величины. И надо будет в submit_correct проверить несколько вариантов, прежде, чем возвращать false.
Тогда Энтеры в текстовых полях будут также игнорироваться, а мы сможем на принимающей стороне быть более-менее уверены, что юзер выбрал то действие, что хотел.

PPS. SunSet - если скажешь, что я не прав - порву на британский флаг! wink.gif

Спустя 9 минут, 28 секунд (5.10.2009 - 00:03) SunSet написал(а):
sergeiss
А что я? А я ничё laugh.gif Я в JS вообще ноль, так что тут можешь писать что угодно, я не возражу))) biggrin.gif

Спустя 1 минута (5.10.2009 - 00:04) sergeiss написал(а):
Цитата (SunSet @ 5.10.2009 - 01:03)
Я в JS вообще ноль, так что тут можешь писать что угодно, я не возражу)))

Хм... Красиво отмазался! biggrin.gif

Спустя 1 день, 9 часов, 28 минут, 50 секунд (6.10.2009 - 09:33) sergeiss написал(а):
Ну так и чего - помогло, что ли?

Спустя 7 часов, 18 минут, 38 секунд (6.10.2009 - 16:52) freed-master написал(а):
не очень... или я глуповат... или где... кнопка теперь вообще никак не нажимается... т.е. запрос на выборку не выполняется...
получилась така картина:
Код
<script type="text/javascript">
<!--
function submit_correct( )
{
if( document.getElementById('hid').value != 'sav' ) return false;
return true;
}
//-->
</script>

<form action="?m=10" method="post" onsubmit="return submit_correct();">
 <input name="search_q" type="text" size="15" maxlength="30" />
 <input type="hidden" name="hid" id="hid" />
 <input name="search" type="button" value="Найти" onclick="document.getElementById('hid').value='sav'; document.getElementById('search_q').submit();" />
</form>
принимающая сторона:
PHP
if(isset($_POST['hid'])) 
{
  
// Запрос
}

Спустя 18 минут, 47 секунд (6.10.2009 - 17:10) kl95 написал(а):
По моему легче будет вставить индекс в то поле, по которому ты будешь искать и сделать такой запрос:
SQL
$result = mysql_query("SELECT * FROM table WHERE MATCH(text) AGAINST('$_POST['search']')",$db);

Я обычно таким запросом пользуюсь и у меня все работает, и нажатием на кнопку и на enter. smile.gif

Спустя 12 минут, 15 секунд (6.10.2009 - 17:23) sergeiss написал(а):
kl95 - тут вопрос в том, чтобы сделать универсальное, кроссбраузерное решение, чтобы юзер мог только нажатием кнопки отправить форму.

freed-master - а это чего такое? smile.gif
Код
document.getElementById('search_q').submit();

Ты хочешь выполнить submit для текстового поля? wink.gif А надо для кнопки:
Код
document.getElementById('search').submit();

Кстати. По этой причине я стараюсь давать более осмысленные имена, чтобы не путаться в них.

И еще. Сравнение правильное
PHP
if(isset($_POST['hid']))

Но далее, при обработке запроса надо еще проверить величину из этого поле, т.е. что содержится в $_POST['hid']. А вдруг там не 'sav', а что-то другое? "Ушлый" юзер может это сделать легко и просто. Либо - ты можешь организовать несколько кнопок, с разными значениями. И тогда действия будут разные.

Спустя 14 минут, 12 секунд (6.10.2009 - 17:37) glock18 написал(а):
Цитата
kl95 - тут вопрос в том, чтобы сделать универсальное, кроссбраузерное решение, чтобы юзер мог только нажатием кнопки отправить форму.


так просто? smile.gif я думал, что вы тут что-то серьезное решаете:

HTML
var keydownHandler = function(event) {
return event.keyCode != 13;
}


HTML
<input type="text" onkeydown="return keydownHandler(event);" name="search" />

Спустя 26 минут, 19 секунд (6.10.2009 - 18:03) freed-master написал(а):
glock18, не мог бы ты прокоментировать
Код
var keydownHandler = function(event) {
return event.keyCode != 13;
}


Спустя 3 минуты, 9 секунд (6.10.2009 - 18:06) kl95 написал(а):
Цитата
тут вопрос в том, чтобы сделать универсальное, кроссбраузерное решение, чтобы юзер мог только нажатием кнопки отправить форму.

Так можно просто задать кнопке имя. Например:
HTML
<input type="button" name="sub_btn">
Потом в php коде(обработчике, на который ссылается форма) написать
PHP
if(isset($_POST['sub_btn']))
{
/* выполнять скрипт поиска */}
else
{echo
" Вы не нажали кнопку поиска";}

Да и потом, есть же на javascript скрипт, который запрещает выделение, нажатие правой кнопки мыши. Может что то подобное можно найти и для клавиши enter. smile.gif

Спустя 23 минуты, 59 секунд (6.10.2009 - 18:30) sergeiss написал(а):
Цитата (glock18 @ 6.10.2009 - 18:37)
var keydownHandler = function(event) {
return event.keyCode != 13;
}

Я что-то подобное пытался сделать, но проблема в том, что в Опере этот код не анализируется... Эта зараза smile.gif при нажатии Энтера сразу делает сабмит формы. Даже при отсутствии кнопки типа submit! kl95 - это и для тебя ответ.

Моё же решение было протестировано мной в ИЭ 6.0 и в Опере 9.25.

Так что, господа, прежде чем критиковать, вникните в суть проблемы smile.gif
Суть проблемы:
Код
как сделать, чтобы (независимо от браузера) юзер не мог нажать Энтер для отправки формы, а мог ее отправить только по нажатию кнопки.

Прошу выложить сюда конкретный код (компактный и понятный), который можно вставить в скрипт и проверить в любых браузерах. Я вполне допускаю, что я что-то допустил и есть другие варианты решения. Но я их не нашел.

Спустя 5 минут, 20 секунд (6.10.2009 - 18:36) glock18 написал(а):
sergeiss
код рабочий. увы оперы нет у меня, но у оперы по-любому должна быть не менее развитая событийная модель. может там не event.keyCode, а event.шоЗаКнопкаНажал.

freed-master
возвращается false если нажат enter, иначе true. обратчик передает это значение дальше. если возвращен false, то события не будут дальше инициироваться, и сабмита не будет.

В любом случае решение этой проблемы на стороне сервера - ужас smile.gif

Спустя 10 минут, 54 секунды (6.10.2009 - 18:46) kl95 написал(а):
sergeiss
Цитата
kl95 - это и для тебя ответ

Ответ на
Цитата
Да и потом, есть же на javascript скрипт, который запрещает выделение, нажатие правой кнопки мыши. Может что то подобное можно найти и для клавиши enter.

Или на пример, который я вставил?

Спустя 9 минут, 41 секунда (6.10.2009 - 18:56) freed-master написал(а):
господа, кажется мы запутались... я про суть проблемы:
Цитата
как сделать, чтобы (независимо от браузера) юзер не мог нажать Энтер для отправки формы, а мог ее отправить только по нажатию кнопки.

суть состоит в обратном:

как сделать, чтобы (независимо от браузера) юзер МОГ нажать Энтер для отправки формы

Спустя 5 минут, 50 секунд (6.10.2009 - 19:02) sergeiss написал(а):
Цитата (glock18 @ 6.10.2009 - 19:36)
В любом случае решение этой проблемы на стороне сервера - ужас

Кто тебе это сказал? blink.gif У меня решение - на стороне клиента, через JS.

А Оперу поставь себе, очень полезно будет smile.gif Потому что есть реальная разница между ИЭ и Оперой. Пусть и небольшая, но есть.

glock18 - вот скажи, ты так предлагаешь сделать?

Код
function submit_correct()
{
return event.keyCode != 13;
}

И в форме
Код
onsubmit="return(submit_correct());


Если так, то в Опере не работает smile.gif

Для проверки в текстовом поле ставлю код:
Код
onkeydown=" alert( event.keyCode );"

даже пробую его расширить до
Код
onkeydown=" alert( event.keyCode ); if( event.keyCode==13) return false;"

Бесполезняк! В Опере происходит отправка формы.


freed-master - тут получается вот какая проблема. При нажатии Энтера в текстовом поле (см. чуть выше в этом сообщении) поведение форм разное в разных браузерах. Если использовать "поведение по умолчанию", то тогда ты и получаешь проблему: у тебя кнопка типа submit как бы и не нажата получается.
Если нужно, чтобы юзер мог нажать эту кнопку, то тогда оставь код, как я его тебе дал, и в обработчике нажатия кнопки (см. выше в этом сообщении) сделай программный submit нужной кнопки. Можно даже сделать отдельную функцию на JS, которая сначала настроит нужные параметры скрытых полей, а потом сделает программное нажатие кнопки.

Спустя 1 день, 20 часов, 58 минут, 2 секунды (8.10.2009 - 16:00) freed-master написал(а):
Все оказалось до безобразия просто.
Форма:
HTML
<form action="?m=10" method="post">
<input name="search_q" type="text" />
<input name="search" type="submit" value="Найти" />
</form>

На принимающей стороне вместо:
PHP
if(isset($_POST['search']))

Сделал проверку:
PHP
if(isset($_POST['search_q']))

tongue.gif

Спустя 39 минут, 30 секунд (8.10.2009 - 16:40) sergeiss написал(а):
Если тебя устраивает полученное решение, то ОК smile.gif
Но учти, что в случае использования 2-х кнопок с разными функциями этот вариант уже не будет работать. Потому что ты тогда не сможешь понять, какую фичу хотел использовать юзер.
А для одной кнопки можно и так.


_____________
Всем, кто заинтересован, могу помочь начать зарабатывать на forex.
Пишите в личку или на e-mail: flash-dirt@yandex.ru
Быстрый ответ:

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