2013-07-14 78 views
0

我在从PHP中将某些字符保存到MySql数据库表时遇到麻烦。我有一个WYSIWYG编辑器,通过它我可以创建页面内容并将它们保存到数据库中。当我的代码中有' '或撇号时,html文本不会保存到数据库中。以下是我的代码:使用PHP和MySQL保存HTML

在将数据发送到服务器:

function SaveContent() 
    { 
     var content = CKEDITOR.instances.ContentEditor.getData(); 
     content = content.replace(/"/g, "'"); 
     var page = document.getElementById("hfpage").value; 

     if (window.XMLHttpRequest) 
     { 
      // code for IE7+, Firefox, Chrome, Opera, Safari 
      xmlhttp=new XMLHttpRequest(); 
     } 
     else 
     { 
      // code for IE6, IE5 
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     xmlhttp.onreadystatechange=function() 
     { 
      if (xmlhttp.readyState==4 && xmlhttp.status==200) 
      { 

       location.href=document.referrer; 
      } 
     } 
     //alert(content); 
     xmlhttp.open("GET","savecontent.php?content="+content+"&page="+page,true); 
     xmlhttp.send(); 
    } 

PHP代码的数据库中保存:我已经在使用“mysql_real_escape_string”

//save content editted/added through the HTML editor 
function SaveContent($page, $content, $user) 
{ 
    $con = $this->OpenConnection(); 
    //first check if the content exists, if so do an update 
    $sql = "SELECT * FROM sitecontent WHERE Page = '" . $page . "'"; 
    $content = mysql_real_escape_string($content); 
    $rowcount = mysqli_num_rows(mysqli_query($con,$sql)); 
    if($rowcount > 0) 
    { 
     //run update 
     $sql = 'UPDATE `sitecontent` SET `Content`="' . $content . '", `UpdatedBy`="' . $user . '", `LastUpdated`= NOW() WHERE `Page` = "' . $page . '"'; 
     $result = mysqli_query($con,$sql); 
     //echo $sql; 
    } 
    else 
    { 
     //run insert 
     $sql = 'INSERT INTO `sitecontent` (`Page`, `Content`, `LastUpdated`, `UpdatedBy`) VALUES ("' . $page . '","' . $content . '", NOW(),"'. $user . '")'; 
     $result = mysqli_query($con,$sql); 
    } 
} 

通知,因为我已经看到了一些帖子在论坛上,但这没有帮助。

欣赏有人能帮我解决问题。

+3

如果你正在使用'mysqli_query()'你应该使用准备好的语句。 – samayo

回答

2

首先你要混合mysql_mysqli_,你应该坚持只有一个。

$content = mysql_real_escape_string($content); 
    $rowcount = mysqli_num_rows(mysqli_query($con,$sql)); 

在上面的代码中,我可以看到你正在使用mysqli_query()但是,你不使用prepared statements始终,用预处理语句,当您使用mysqli_,因为这是它被造的。

而另一件事,则mysql_real_escape_stringmysql_功能,而不是mysqli_的,所以你需要改变,要mysqli_real_escape_string()

2

西蒙_eQ的答案是正确的关于如何正确保存您的内容。不过,我认为值得注意的是,您遇到的问题是一个警告标志,表明您的数据库已开放给SQL注入。基本上,你的内容没有被保存的原因是因为'被视为查询的一部分。在插入中利用这一点很难,但许多黑客在select中对数据库执行恶意操作,并因此删除查询。

看看你的代码,而你试图逃避你的$内容(尽管使用错误的转义函数,西蒙指出)你的$页变量似乎并没有逃脱。我通常会假设页面是通过POST或GET传递的值,如果是这样的话可以操作...

我建议您查看如何避免使用mysqli进行sql注入,因为它不仅有助于您每次解决问题都意味着您可以确信自己的代码始终安全。

下面是详细信息的链接... How can I prevent SQL injection in PHP?