2013-07-14 2 views
0

PHP에서 MySql 데이터베이스 테이블에 특정 문자를 저장하는 데 문제가 있습니다. WYSIWYG 편집기를 사용하여 페이지 컨텐츠를 작성하고이를 DB에 저장합니다. 내 코드에 ' '또는 아포스트로피가 있으면 html 텍스트가 DB에 저장되지 않습니다. 다음은 내 코드입니다 : 저장하는 데이터베이스에 대한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_을 사용하는 경우, 문 준비를 사용, 항상 prepared statements를 사용하지 않는, 당신은 mysqli_query()를 사용하고 볼 수 있지만 수 있습니다.

그리고 또 다른 한가지

mysql_real_escape_stringmysqli_real_escape_string()

2

사이먼 _eQ의 대답에 그 변경해야합니다 있도록 mysql_ 기능하지 mysqli_ 's입니다 제대로 내용을 저장하는 방법에 대한 올바른 것입니다. 그러나, 나는 당신이 직면하고있는 문제가 당신의 데이터베이스가 SQL Injection에 개방되어 있다는 경고 신호임을 ​​지적 할 가치가 있다고 생각했다. 기본적으로 콘텐츠가 저장되지 않은 이유는 '검색어'의 일부로 간주 되었기 때문입니다. 삽입물에서이 기능을 이용하는 것이 더 어렵지만 많은 해커가 선택한 데이터베이스에서 악의적 인 작업을 수행하고이를 이유로 쿼리를 삭제합니다.

$ 콘텐츠를 이스케이프하려고 시도하는 동안 (Simon이 지적한대로 잘못된 이스케이프 기능을 사용했지만) $ page 변수가 이스케이프되지 않는 것처럼 보입니다. 일반적으로 페이지가 POST 또는 GET을 통해 전달 된 값이라고 가정합니다. 이렇게 조작하면 ...

mysqli를 사용하여 SQL 삽입을 피하는 방법을 살펴 보는 것이 좋습니다 매번 문제점을 해결하면 코드가 항상 안전하다는 확신을 가질 수 있습니다. 여기

더 많은 정보와 링크는 ... How can I prevent SQL injection in PHP?