Jump to content
  • 0

Submit и PHP


mopnex161rus
 Share

Question

Всем привет!

У меня вот такая проблема появилась:

Есть форма,в ней калькулятор и кнопочка "=" которая выдает итог чисел.

Так же есть кнопка "Отправиться форму" в той же форме где и кнопка "="

Проблема в том что эти обе кнопки как вы догадались пытаются отправить форму чего не надо((Надо что бы одна выводила итог то есть "=" а вторая отправляла форму....

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

Подскажите можно ли как нибудь это решить?

Я кажется видел где то что у формы заданный id или класс и вот его можно абсолютно к любой кнопки в любой части сайта привязать,только как я не знаю(((

Edited by mopnex161rus
Link to comment
Share on other sites

23 answers to this question

Recommended Posts

  • 0

Поставить событие на клик?

Ну как получается у меня в форме 2 кнопки и надо так что бы одна выдавала итог суммы а другая делала отправку формы,у меня же сейчас они обе отправляют и так же сумму выводят))То есть работают абсолютно одинаково)

Вот как их отучить такое вытворять?)))

Link to comment
Share on other sites

  • 0

Ну так и вешайте на событие onClick для одной кнопки — this.submit(); (отправку формы), для другой — функцию, которая у вас результат калькулятора высчитывает.

Link to comment
Share on other sites

  • 0

Ну так и вешайте на событие onClick для одной кнопки — this.submit(); (отправку формы), для другой — функцию, которая у вас результат калькулятора высчитывает.

Это конечно хорошо да вот только у меня что у одной submit что у другой,и смысл мне ставить onClick это разве не одно и тоже будет?

Или может быть для подсчета суммы есть ещё какие события другие?

Люди я далеко не АС в этом деле,только учусь не сердитесь)))

Link to comment
Share on other sites

  • 0

<form action="gold.php" method="post">
<span>Кол-во: <span style="color:#FF0000">*</span></span><input name="sum" type="text" size="2" maxlength="20" style="margin-left:64px;" />
<span>- </span><select name="valuta">
<option value="wmr">WMR</option>
<option value="wmz">WMZ</option>
</select>
<input name="itog" type="submit" value=" = " style="margin-left:5px;" /><span> Итог: <? echo $result ?></span><br />
<div align="right" style="margin-right:25px;"><font size="-2" color="red">Минимум 1000 Максимум 30000!</font></div></span>
<span>Оставьте коментарий:</span><br />
<textarea name="coment_gold" cols="40" rows="5"></textarea><br /><br />
<p align="center"><input name="reset" type="reset" value="Сбросить" /></p><br />
<p align="center"><input name="submit" type="submit" value="Оформить заказ" /></p><br />
<p align="center">Поля отмеченные <span style="color:#FF0000">*</span> обязательны к заполнению!</p>
</form>

Ещё раз напишу на всякий случай,надо что бы:

<input name="itog" type="submit" value=" = " style="margin-left:5px;" /> показывал итог и не более

а <p align="center"><input name="end" type="submit" value="Оформить заказ" /> отправлял форму в БД (вместе и итогом)

И ещё сразу спрошу пока тут.Когда я заношу в базу информацию со всех полей почему то все заносится кроме текстовых полей по типу

<textarea name="coment" cols="40" rows="5"></textarea>

Код вот такой(без проверок без нечего)

$result2 = mysql_query("INSERT INTO zxc (world,fac,name,sum,coment,num) VALUES ('$world', '$fac','$nik','$result','$coment','$ran')");
if ($result2 == 'true') {echo "<p>Ваша категория успешно добавлена!</p>";}
else {echo "<p>Ваша категория не добавлена!</p>";}

В чем может быть причина?

Edited by mopnex161rus
Link to comment
Share on other sites

  • 0

mopnex161rus, во-первых, у вас на обоих кнопках стоит type="submit". Естественно, что в таком случае обе они будут отправлять форму.

Как я вижу, нужный результат у вас считается в самом скрипте. Если вам нужно, чтобы результат считался сразу без перезагрузки страницы, нужно оформить JS-функцию, которая будет считать результат и выводить его, и повесить её выполнение на событие onClick кнопки «=».

То есть всё будет выглядеть так:


<script type="text/javascript>
function calculate(){
// содержимое функции
}
</script>
...
<input name="itog" type="button" value=" = " style="margin-left:5px;" onClick="calculate();"/>

Link to comment
Share on other sites

  • 0

Спасибо большое!java ещё не осваивал,рановато ещё)))

Скажите пожалуйста а в содержимое функции что писать?

<script type="text/javascript>

function calculate(){

// содержимое функции

}

</script>

Link to comment
Share on other sites

  • 0

hypnocolor скажите пожалуйста а как сделать если несколько значений например надо сложить с числом WMR или WMZ у них естественно разные значения..не получается что то(((

Вот обычный написал:

function calculate() {
var a = document.getElementById("digitA").value;
var r = document.getElementById("digitB").value = 0.020;
var z = document.getElementById("digitC").value = 0.060;
var g = a*r;
var x = a*z;
document.getElementById("summa").value = g;

}

А вот как сделать условие на вывод var x ?

Edited by mopnex161rus
Link to comment
Share on other sites

  • 0

rus, ну, это если не важно, будет страница перезагружаться или нет, необходимости чего из слов автора я так до конца и не понял.

Зато, теперь есть варианты для любого развития событий :)

Link to comment
Share on other sites

  • 0

Конечно бы хотелось без перезагрузки страницы,сам калькулятор я то сделал только вот на 2 условия не магу понять как сделать(в коде выше)

Может быть в java есть условия наподобие if else но как бы я не пробовал методом тыка не чего не выходит...выдает только одно значение(и то значение которое я записываю в else)(((

Link to comment
Share on other sites

  • 0

Я что-то не допонимаю или.... ? а что мешает по нажатию на кнопку выполнить JS-скрипт и вернуть FALSE дабы форма не ушла в отправку?

Хотя с другой стороны, если вопрос в этой теме и нужно чтобы всё работало без перезагрузки, то Ajax спасёт. Самый лучший способ воспользоваться jQuery

Link to comment
Share on other sites

  • 0

в общем было время и сделал супер простенький Ajax-калькулятор с отправкой результата на почту (функцию mail() писать не стал :rolleyes: )

вот основной файл (форма + JS)

<!DOCTYPE html>
<html>
<head>
<title>Калькулятор от Gold Dragon</title>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></script>
</head>
<body>
<div id="form1">
<form>
<p><label for="q1">Число А: </label><input id="q1" type="text"/></p>
<p><label for="q2">Число Б: </label><input id="q2" type="text"/></p>
<p><input type="button" id="but1" value="Проверить"/><input disabled="disabled" type="button" id="but2" value="Отправить"/></p>
</form>
</div>
<hr/>
<div id="form2"></div>
<script>
$(function () {
// просто проверяем
$("#but1").click(function () {
$.post(
"itog.php",
{
task:"calculation",
q1:$("#q1").val(),
q2:$("#q2").val()},
function (data) {
$("#form2").hide().html(data).show(300);
$("#but2").removeAttr("disabled");
}
);
});
// отправляем
$("#but2").click(function () {
$.post(
"itog.php",
{
task:"mail",
q1:$("#q1").val(),
q2:$("#q2").val()},
function (data) {
$("#form2").hide().html(data).show(300);
}
);
});
});
</script>
</body>
</html>

вот файл itog.php (Обработка Ajax-запроса на стороне сервера)

<?php
// проверяем а из файла ли вызван скрипт или из адресной строки
if(isset($_SERVER['HTTP_REFERER'])){

// получаем данные
$task = (isset($_POST["task"])) ? $_POST["task"] : '';
$q1 = (isset($_POST["q1"])) ? $_POST["q1"] : '';
$q2 = (isset($_POST["q2"])) ? $_POST["q2"] : '';
$result = '';

// проверяем число ли А
$error = preg_match("#^\d+$#", $q1);
if(!$error){
$result .= "<p>Число А не введено или не является числом</p>";
}
// проверяем число ли Б
$error = preg_match("#^\d+$#", $q2);
if(!$error){
$result .= "<p>Число Б не введено или не является числом</p>";
}

if($result == ""){
$result .= "<p>Сумма = " . ($q1 + $q2)."</p>";
}

if($task == "calculation"){
echo $result;
} elseif($task == "mail"){
// тут отправляем куда нужно и делаем что-то ещё
$result .= "<p>Данные успешно отправлены на почту!</p>";
echo $result;
} else{
echo "Обнаружена попытка взлома кода";
}
}else{
echo "Обнаружена попытка взлома кода";
}

надеюсь отгадал вопрос :)

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

ps

сделал пару проверок на валидность введённых данных и на безопасность запроса :)

Edited by Gold Dragon
Link to comment
Share on other sites

  • 0

в общем было время и сделал супер простенький Ajax-калькулятор с отправкой результата на почту (функцию mail() писать не стал :rolleyes: )

вот файл itog.php (Обработка Ajax-запроса на стороне сервера)

<?php
// проверяем а из файла ли вызван скрипт или из адресной строки
if(isset($_SERVER['HTTP_REFERER'])){

// получаем данные
$task = (isset($_POST["task"])) ? $_POST["task"] : '';
$q1 = (isset($_POST["q1"])) ? $_POST["q1"] : '';
$q2 = (isset($_POST["q2"])) ? $_POST["q2"] : '';
$result = '';

// проверяем число ли А
$error = preg_match("#^\d+$#", $q1);
if(!$error){
$result .= "<p>Число А не введено или не является числом</p>";
}
// проверяем число ли Б
$error = preg_match("#^\d+$#", $q2);
if(!$error){
$result .= "<p>Число Б не введено или не является числом</p>";
}

if($result == ""){
$result .= "<p>Сумма = " . ($q1 + $q2)."</p>";
}

if($task == "calculation"){
echo $result;
} elseif($task == "mail"){
// тут отправляем куда нужно и делаем что-то ещё
$result .= "<p>Данные успешно отправлены на почту!</p>";
echo $result;
} else{
echo "Обнаружена попытка взлома кода";
}
}else{
echo "Обнаружена попытка взлома кода";
}

надеюсь отгадал вопрос :)

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

ps

сделал пару проверок на валидность введённых данных и на безопасность запроса :)

зачем же такой кошмар устраивать... еще парсить число через регулярки x_x

<?php // проверяем, файл вызван скриптом или из адресной строки
if(isset($_SERVER['HTTP_REFERER'])){
// получаем данные
$task = (isset($_POST['task'])) ? $_POST['task'] : '';
$q1 = (isset($_POST['q1'])) ? (int)$_POST['q1'] : '';
$q2 = (isset($_POST['q2'])) ? (int)$_POST['q2'] : '';
$error = '';

if(!$q1) // проверяем, число ли А
$error .= '<p>Число А не введено или не является числом</p>';

if(!$q2) // проверяем, число ли Б
$error .= '<p>Число Б не введено или не является числом</p>';

if($error) { // если ошибка - выводим ее текст и прекращаем работу
echo $error;
return false;
}

// если ошибок нет - продолжаем обработку данных
if($task == 'calculation') {
echo '<p>Сумма = ' . ($q1 + $q2) . '</p>';
} elseif($task == 'mail') {
// тут отправляем куда нужно и делаем что-то ещё
echo '<p>Данные успешно отправлены на почту!</p>';
} else {
return false;
}
} else {
return false;
}

Edited by NeoXidizer
Link to comment
Share on other sites

  • 0

здесь, кстати, насколько я понимаю, потенциальная уязвимость. Проверили, что это число, кнопка отправить доступна, но затем можно спокойно изменить число на зловредный код и отправить. Так что лучше как то так

html:

<!DOCTYPE html>
<html>
<head>
<title>Калькулятор от Gold Dragon, доработал NeoXidizer</title>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
</head>
<body>
<div id="form1">
<form method="post">
<p><label for="q1">Число А: </label><input id="q1" type="text"/></p>
<p><label for="q2">Число Б: </label><input id="q2" type="text"/></p>
<p><input type="button" id="but1" value="Проверить"/><input disabled="disabled" type="button" id="but2" value="Отправить"/></p>
</form>
</div>
<hr/>
<div id="form2"></div>
<script>
$(function () {
// функция проверки введеных данных
function checkData() {
$("#but2").attr("disabled", true);
$.post("itog.php",{
task:"calculation",
q1:$("#q1").val(),
q2:$("#q2").val()
},
function (data) {
$("#form2").hide().html(data).show(300);
if( parseInt($("#q1").val()) && parseInt($("#q2").val()) )
$("#but2").removeAttr("disabled");
}
);
}

// Функция отправки данных
function sendData() {
$.post("itog.php",{
task:"mail",
q1:$("#q1").val(),
q2:$("#q2").val()
},
function (data) {
$("#form2").hide().html(data).show(300);
}
);
}

// Проверяем данные по клику на кнопку
$("#but1").click(function () {
checkData();
});

// Отправляем данные, предварительно проверив их еще раз
$("#but2").click(function () {
if( parseInt($("#q1").val()) && parseInt($("#q2").val()) ) // Проверяем введеные данные повторно и отправляем форму
sendData();
else // Если что-то пошло не так, то проверяем данные повторно через php
checkData();
});
});
</script>
</body>
</html>

и у меня подозрение, что отправляемые к функции mail данные все равно нужно будет проверять повторно и чуть тщательней, но уже хочется спать и голова не варит, плюс нет функции отправки, чтобы убедиться, что все безопасно :)

так же не стоит забывать о тех, кто слишком умный и отключает свойство "disabled" у кнопки через инспектор, а затем спокойно отправляет свою форму (для этого данные фильтруются в php), а так же о тех, кто попросту отключает javascript - у них форма работать не будет

UPD. обновил php код на предыдущей странице для более осмысленной проверки на ошибки, вне зависимости от посылаемой формы

Edited by NeoXidizer
Link to comment
Share on other sites

  • 0
уже хочется спать и голова не варит,
и это правильно :rolleyes:

NeoXidizer, ну ты навертел :) я ведь только обозначил решение.. Ну коль ты так, то тогда чуть расширю.

Во-первых, по регулярки. Твоё исправление может боком выйти для автора вопроса. Ты пошёл самым простым путём и решил число сразу привести в соответствие при помощи intval(). Теперь почему нет :)

- мы не знаем какое число будет складываться, да и вообще что будет складываться. Это может быть и большое число, и дробное число, и число не в десятичном виде. В моём варианте достаточно поменять условие в регулярке. В твоём - перестраивать логику кода.

- твой код пропустит строки типа "23ру" или "ло": он всё превратит в ноль. А это значит что в итоге всё равно будет число

- Твои условия становятся абсолютно не работоспособными если одно из чисел будет ноль ;)

Во-вторых, проверка на стороне JS - это просто нецелесообразно. Это же проверка на стороне клиента. Коль мы используем Ajax, то всё же безопаснее и правильнее делать это на стороне сервера.

В-третьих, я даже и не рассчитываю на людей которые отключают JS B) Ну это просто глупо в наше время..

В-четвёртых. Однозначно кнопка будет активироваться при любом варианте: и ошибочном и правильном.. Если честно, то я это сделал лишь только для того чтобы показать возможность. Я бы вообще сделал чтобы при успешном прохождении проверки с сервера возвращался целый код кнопки с функцией отправки :)

Т.е. алгоритм следующий

- отсылаем данные на сервер

- проверяем

- если не верно, то отправляем предупреждение

- если верно, то блокируем (удаляем) поля для ввода новых данных, отправляем код кнопки отправки, отправляем код с кнопкой редактировать результат

Ну и напоследок про безопасность отправки данных.. Тут вообще ни каких проблем.. Отсылаем то результат в теле письма, т.ч. нет ни каких проблем сделать его "безопасным" даже стандартными функциями :rolleyes:

ps

я вообще помешанный малость на безопасности. Вчера когда начал писать код, понял что просто запутаю товарищей. Вот решил и малость упростить. Но если сама идея пода правильная, то могу выложить почти полный "безопасный" код :boast: Там я ещё и выпадающий список предусмотрел с арифметическими функциями, мало ли понадобится не только складывать...

Link to comment
Share on other sites

  • 0

Во-первых, по регулярки. Твоё исправление может боком выйти для автора вопроса. Ты пошёл самым простым путём и решил число сразу привести в соответствие при помощи intval(). Теперь почему нет :)

- мы не знаем какое число будет складываться, да и вообще что будет складываться. Это может быть и большое число, и дробное число, и число не в десятичном виде. В моём варианте достаточно поменять условие в регулярке. В твоём - перестраивать логику кода.

- твой код пропустит строки типа "23ру" или "ло": он всё превратит в ноль. А это значит что в итоге всё равно будет число

- Твои условия становятся абсолютно не работоспособными если одно из чисел будет ноль ;)

Ну если отталкиваться от того, что мы не знаем, что там нужно, то наш код может быть абсолютно не верным :)

- Не усмотрел. Тогда можно просто приравнивать к float, если нужны дробные

- Не пропустит. A = 23ру, B = 2, Сумма = 25. Про приравнивание просто строки к 0 не предусмотрел, однако думаю, что это не так страшно, так как сумма все равно сложится (с нулем), и ничего опасного для отправки - нет. Темболее пользователю доступен предпросмотр результата.

- Исправимо

Во-вторых, проверка на стороне JS - это просто нецелесообразно. Это же проверка на стороне клиента. Коль мы используем Ajax, то всё же безопаснее и правильнее делать это на стороне сервера.

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

В-третьих, я даже и не рассчитываю на людей которые отключают JS B) Ну это просто глупо в наше время..
Скажите это тысячам пользователей аддона NoScript :)

Ну и напоследок про безопасность отправки данных.. Тут вообще ни каких проблем.. Отсылаем то результат в теле письма, т.ч. нет ни каких проблем сделать его "безопасным" даже стандартными функциями :rolleyes:

Ну мало ли, вдруг ему приспичит отправляемые данные добавлять в БД, и в любом случае, читать письма-пустышки - трата времени Edited by NeoXidizer
Link to comment
Share on other sites

  • 0
Почему нецелесообразно? Это позволяет предупредить неопытного пользователя. Это разгружает сервер. Это добавляет безопасность (как я сказал - запретить отсылать форму, если числа проверили, а затем изменили на что-то другое.
Не спорю(!) Но только исключительно для предупреждения, а не для проверки. Безопасности это не очень поможет :) Хотя я бы воспользовался валидатором при вводе: можно использовать нововведения в HTML5, можно воспользоваться уже созданными плагинами к jQuery, ну или самому написать.
Скажите это тысячам пользователей аддона NoScript
не буду :rolleyes: Я люблю делать красивые сайты и удобные для пользователей. Нравится им пулится просто в текст, ну что ж, я не против.. :) Пусть живут в прошлом десятилетии
- Не пропустит. A = 23ру, B = 2, Сумма = 25.
в любом случае не правильно. Я сам иногда ошибаюсь и вместо "0" нажимаю "-" или вместо "1" нажимаю "ё". Нужно, мне кажется, пользователю в такой ситуации дать возможность исправить ошибку, а не игнорировать.

А по почте особо вообще никакой задачи не стояло, так что просто обозначил :) Действительно, непонятно куда и что отсылается.. На mail ли ;)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy