2015-02-01 10 views
0

이 오류에 대한 다른 모든 질문은이 경우가 아닌 이스케이프해야하는 예약어와 관련되어 있으므로이 질문은 중복되는 질문이 아닙니다.Mysql LongBlob 구문 오류 또는 액세스 위반

내가 문자열의 연결 플러스 file_get_contents을 사용하여 파일 내용입니다 일반 쿼리를 가지고 쿼리는 다음과 같이 표시됩니다

CALL sp_student_booking_application_attachment_insert(
    'foreignkey code', -- varchar(255) 
    'filename.pdf', -- varchar(255) 
    'application/pdf', -- varchar(255) 
    file content, -- longblob: not quoted 
    file_size -- integer(11): not quoted 
); 

가게 절차는 INSERT 문 단지 래퍼 인 똑같은데.

동일한 작은 파일을 업로드하면 10kb가 작동하지만 더 큰 다른 파일에서는 작동하지 않지만 200kb의 PDF를 업로드 할 수있었습니다. 특정 PDF 만 적어 두십시오. 더 작아도 다른 pdf를 사용하면 작동하지 않습니다. 내가 할 수있는 유일한 오류는 다음과 같습니다

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?s(??\n??W?hcvӔ???.???a&??5+\"+w?? c??-?ƄqܷL,???-L?b?|)??K?71' at line 5 

그래서 내가 ''와``사용하여,하지만 난 여전히 같은 문제가 발생하여 파일 내용 값을 인용했습니다. 그러나 내가 phroughyadmin 파일을 업로드하려고 할 때 2MB의 파일도 업로드합니다.

이 이미지/파일이 json 변수의 비누 서비스를 통해 이동하고 파일 내용이 base64로 인코딩 된 다음 비누 서버에서 json으로 구문 분석되고 base64가 디코딩되는 것이 유용 할 수 있습니다. 내가 확인한 파일은 양면에 비누 클라이언트/비누 서버와 같은 크기이므로 PHP 나 비누 관련 문제가 아닙니다. my.conf의의 max_allowed_packet에

은/탈출 쿼리에 삽입하는 데이터를 마스킹하기 위해 적절한 조치를 적용하지 않았다처럼 996776960.

+2

쿼리에 삽입하는 데이터를 이스케이프/마스크하기위한 적절한 방법을 적용하지 않은 것처럼 보입니다 ... 실제로 그렇게하는 방법을 보여줍니다. (당신이 완전히 처리하지 않았다고 가정하면 파일 내용을 SQL 문으로 연결하면됩니다.) – CBroe

+0

예를 들어 여기에 설명 된 기본 이스케이프 처리 http://stackoverflow.com/a/7052685/1427878 물론 당신이해야 할 절대적인 최소 ... 당신은? – CBroe

+0

@CBroe 저는 여러분이 말한 것을 보았습니다. 기본적으로 원시 쿼리는 문자열의 연결입니다. " '".addslashes ($ filecontent)와 같은 것을 사용하고있었습니다. "', 그렇지 않았습니다. 충분히, 그래서 그 원시, pdo 준비 성명을 대체하려고 노력하고 그것은 작동합니다.그래서 만약 당신이 대답을 게시하면 나는 당신에게 200을 줄 것입니다 : – peterpeterson

답변

1

이 보인다.

파일에서 읽은 이진 데이터에는 SQL 구문에서 의미가있는 문자 (예 : 작은 따옴표 ')와 매핑되는 바이트 시퀀스가 ​​포함될 가능성이 큽니다. 올바르게 처리되지 않았습니다.

addslashes은이 기능을 사용하지 않습니다. 모든 데이터베이스 인터페이스는이를 위해 전용 함수/메소드를 제공해야합니다. mysql_real_escape_string 인 PHP mysql 드라이버 (depreacted)의 경우 mysqli의 경우 mysqli_real_escape_string resp가됩니다. mysqli::real_escape_string. 이러한 함수/메소드는 특히이 특정 목적을 위해 설계되었으며 연결의 문자 집합과 같은 요인을 고려합니다.

다른 방법 (더 나은 방법)은 준비 문을 사용하는 것입니다. 이들로 인해 실제 SQL "명령"과 데이터는 서로 별도의 데이터베이스로 보내 지므로 데이터가 SQL 문 구문을 망가 뜨리는 경우는 더 이상 발생하지 않습니다.