Ваша проблема в том, что вы строите строку данных вручную, а не кодируете URI значений данных, которые вы вставляете в строку.Следовательно, любой необработанный символ &
в вашем тексте будет считаться частью URI, а не данных, а это означает, что он будет интерпретироваться как указывающий начало следующего параметра, а не просто как символ в тексте.URI-кодирование этих данных преобразует этот и другие специальные символы в их закодированные эквиваленты, поэтому они не будут неверно интерпретированы.
Теперь вы, конечно, можете это исправить, обернув каждую переменную поля encodeURIComponent()
, ноэто многословно и утомительно:
var dataString = 'name=' + encodeURIComponent(name)
+ '&email=' + encodeURIComponent(email)
+ '&comments=' + encodeURIComponent(comments)
+ '&to=' + encodeURIComponent(to)
+ '&from=' + encodeURIComponent(from)
+ '&budget=' + encodeURIComponent(budget)
+ '&subject=' + encodeURIComponent(subject);
Есть лучшие способы:
В настоящее время ваш $(this).serialize();
не будет работать, поскольку this
представляет нажатую кнопку, а не форму.Однако, если вы укажете на форму, вы можете использовать ее для автоматической сериализации полей внутри нее, и jQuery будет решать любые проблемы с кодированием от вашего имени.Это экономит ручное кодирование и код для выборки каждого значения поля по отдельности (хотя я отмечаю, что в настоящее время это необходимо для проверки, хотя существуют другие способы реализации проверки, которые устранят эту необходимость, но это совсем другая тема).
$.ajax({
type:"POST",
url: sendMailUrl,
data: $("#formy").serialize(),
success: success //Unrelated: I also removed the brackets here, so it becomes a _reference_ to the "success" function - writing success() as you did means the function is immediately executed, and what gets passed to jQuery is the _result_ of the function, which isn't what you want in this case
});
Как видите, это гораздо меньше хлопот.И если в будущем вы когда-нибудь добавите больше полей в форму, вам вообще не придется менять этот бит кода.
Еще один дополнительный момент - у вас будет много проблем спроверить ввод формы с помощью JavaScript.Это приятно и удобно, но не обеспечивает никакой безопасности.На стороне сервера вы, кажется, с радостью вставляете любые значения, которые браузер отправляет прямо в вашу электронную почту.Любой пользователь с небольшим количеством знаний может либо изменить свой JavaScript с помощью своих инструментов разработчика, либо отключить JS, либо просто полностью использовать другой инструмент (например, PostMan или пользовательское приложение) для запуска HTTP-запросов на вашем сервере, даже не касаясь вашей формы.,Они могут потенциально отправлять проблемные значения, которые могут испортить вашу электронную почту - например, другое значение "from" или какой-нибудь неприятный HTML, или, если вы взаимодействуете с базой данных в любом месте вашего приложения, выполните атаки SQL-инъекций, чтобы испортить это.Вы должны всегда проверять все входящие данные в вашем PHP-коде на наличие проблем безопасности и убедиться, что они соответствуют вашим бизнес-правилам, прежде чем использовать их для чего-либо еще.