2011-10-31 6 views
1
$categories_query ="SELECT p.products_id 
, p.products_quantity 
, p.products_price 
, p.products_status 
,p.products_image 
, pd.products_name 

FROM products_description AS pd 
INNER JOIN products AS p 
ON p.products_id = pd.products_id 
WHERE p.products_status = 1 and p.products_id <> $pid and pd.products_name LIKE CONCAT(LEFT('$products_name',10),'%')"; 

상대적인 항목이없는 경우에도 일부 페이지가 정상적으로 실행됩니다. 그러나 $products_nameA Bug's Life "Multi Pak" Special 2003 Collectors Edition 일 때 오류를 보여줍니다 :SQL 명령이 왜 오류를 표시합니까?

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 Life "Multi Pak" Special 2003 Collectors Edition',10),'%')' at line 11 
in: 
[SELECT p.products_id... 

왜? 어떻게 수정해야할까요?

답변

1

$ products_name의 예제 값에 '기호가 포함되어 있으므로 SQL 쿼리가 엉망입니다. 쿼리의 순간 부분에서

주 ... 그

(LEFT ('벅스 라이프'멀티 박세리 "특수 2,003 컬렉터 에디션 ', 10) 같은 것이 그 '와 g 사이'는 첫 번째 아포스트로피를 끝내고 나머지 $ products_name은 실행 된 쿼리의 문자열 값이 아닙니다.

대신 준비된 구문을 사용해야합니다. 현재 코드의 취약점.

편집 : http://php.net/manual/en/mysqli.prepare.php

  • PDO : : 제가 개인적으로 PDO를 원합니다 http://php.net/manual/en/pdo.prepared-statements.php
  • 당신도

    +0

    대신 준비된 문을 사용해야합니까? 어떻게해야합니까? 감사합니다. – dreamchaser

    +0

    @dreamchaser 코드 예제 링크가있는 답변을 업데이트했습니다. –

    2

    $ product name에 mysql_real_escape_string()을 사용해야합니다. " '"가 그 오류의 원인이고, mysql_real_escape_string()이이를 수정합니다. mysql로 ​​보내기 전에 항상 모든 변수를 필터링해야합니다. 그렇지 않으면 mysql injection trough malicious sql codel을 위험에 빠뜨릴 수 있습니다. mysql_real_escape_string() on php.net

    관련 문제