2013-07-14 54 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?