Mysql longtext不会保存某些文字?

时间:2013-09-11 00:08:58

标签: php mysql jquery

我的后端有一个脚本,允许我保存默认注册电子邮件。它可以处理一些消息,但有些消息却没有。我将字段设置为“longtext”和“utf8_general_ci”。我当前的代码将保存此消息:

  

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

     

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

但不会保存这个:

  

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

     

这一变化意味着iPhone 5s不再采用真正的黑色,而苹果则选择将铝背面和侧面改为浅灰色。设备的玻璃背面和正面保持黑色。

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

管理页面上的jQuery:

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

defaultemails.php:

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

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

echo $defaultemailebook;
}

每当我提交这些电子邮件时,即使是那些未提交的电子邮件,我也会收到成功警报......任何人都有任何想法为什么会发生这种情况?

3 个答案:

答案 0 :(得分:0)

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

这不仅是未保存文本的问题,而且还容易受到SQL注入的攻击。<​​/ p>

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

答案 1 :(得分:0)

一个更强大的解决方案是使用像PDO这样的扩展,并使用预处理语句。这有效地为您输出了输入,并且比使用addslashes()等函数更安全。

例如,在你的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;

答案 2 :(得分:0)

忽略了一个明显的事实,即您的代码对sql和脚本注入攻击非常开放。您需要转义要存储的值。

如果您使用的是mysql函数,请在输入字符串上使用mysql_escape_string函数。

但是,请在将代码置于现场之前处理注射攻击。

相关问题