0

我的后端有一个脚本,可以让我保存默认的注册电子邮件。它适用于某些消息,但有些则不起作用。我将该字段设置为“longtext”和“utf8_general_ci”。我当前的代码将保存此消息:

您好,这是来自您的房地产公司的默认电子邮件。如果您收到这封电子邮件,则表示您已注册我们的网站。您好,这是来自您的房地产公司的默认电子邮件。如果您收到这封电子邮件,则表示您已注册我们的网站。

如果您正在寻找德克萨斯“牧场”房屋,那么您来对地方了。

但不会保存这个:

新的“深空灰色”iPhone 5s 将在下周五(9 月 20 日)苹果旗舰手机上市时加入银色和金色机型。去年,iPhone 5 有白色和黑色可供选择。

这一变化意味着 iPhone 5s 不再提供纯黑色,Apple 选择将铝制背面和侧面更改为较浅的灰色阴影。设备的前后玻璃保持黑色。

我不知道为什么它会保存某些消息,然后不保存其他消息......这是我的代码:

管理页面上的 jQuery:

$(function() { 
$( "#defaultemail-ebook-submit" ).click(function() {
    $("#defaultemail-ebook-form").ajaxSubmit({url: 'defaultemails.php', type: 'post', success: alert("Email with ebook has been set!")})
});
});

默认电子邮件.php:

$defaultemailebook = $_REQUEST['defaultemail-ebook'];

if (isset($_POST['defaultemail-ebook'])) {
mysql_query("UPDATE default_emails SET email_ebook='". $defaultemailebook ."' WHERE id = '1'");

echo $defaultemailebook;
}

每当我提交这些电子邮件时,即使是那些不提交的,我总是会收到成功警报……有人知道为什么会发生这种情况吗?

4

2 回答 2

0

您需要处理提交的文本中可以包含撇号 (') 字符的事实。当您的代码遇到一个撇号时,它会将其视为字符串的结尾。

这不仅是未保存文本的问题,还容易受到 SQL 注入的影响。

您需要通过更改执行 SQL 的方式或通过在文本中捕获单引号并处理它们来安全地处理字符串。

于 2013-09-11T00:14:54.130 回答
0

一个更强大的解决方案是使用像PDO这样的扩展,并带有准备好的语句。这有效地为您转义了输入,并且比使用像 addlashes() 之类的函数更安全。

例如,在您的 defaultemails.php 脚本中:

//make sure the email address is set
if(!isset($_POST['defaultemail-ebook'])) { //it's better to use $_POST over $_REQUEST if you know it's a POST field
    //handle email address not provided
}

$emailAddress = $_POST['defaultemail-ebook'];

//validate the email address
if(!filter_var($emailAddress, FILTER_VALIDATE_EMAIL)) {
    //handle invalid email address
}

//update the database
$dbh = new PDO('mysql:dbname=dbname;host=127.0.0.1', 'username', 'password'); //replace with your details
$sth = $dbh->prepare('UPDATE default_emails SET email_ebook = ? WHERE id = 1;');
$sth->execute(array($emailAddress));

echo $emailAddress;
于 2013-09-11T00:48:06.660 回答