MySQL에 삽입할 때 PHP에서 단일 따옴표 이스케이프 [중복]

이해할 수 없는 난감한 문제가 있습니다…

SQL 문은 다음 두 개입니다.

  • 첫 번째는 폼의 정보를 데이터베이스에 입력합니다.
  • 두 번째는 위에서 입력한 데이터베이스에서 데이터를 가져와 이메일을 보낸 다음 트랜잭션 세부 정보를 기록합니다.

문제는 단일 따옴표가 두 번째 항목에서만 MySQL 오류를 트리거하는 것으로 보인다는 것입니다.첫 번째 인스턴스는 문제 없이 작동하지만 두 번째 인스턴스는 다음 명령을 트리거합니다.mysql_error().

폼의 데이터는 폼에서 캡처되는 데이터와 다르게 처리됩니까?

질문 1 – 문제 없이(단일 따옴표를 벗어나지 않고) 작동합니다.

$result = mysql_query("INSERT INTO job_log (order_id, supplier_id, category_id, service_id, qty_ordered, customer_id, user_id, salesperson_ref, booking_ref, booking_name, address, suburb, postcode, state_id, region_id, email, phone, phone2, mobile, delivery_date, stock_taken, special_instructions, cost_price, cost_price_gst, sell_price, sell_price_gst, ext_sell_price, retail_customer, created, modified, log_status_id) VALUES ('$order_id', '$supplier_id', '$category_id', '{$value['id']}', '{$value['qty']}', '$customer_id', '$user_id', '$salesperson_ref', '$booking_ref', '$booking_name', '$address', '$suburb', '$postcode', '$state_id', '$region_id', '$email', '$phone', '$phone2', '$mobile', STR_TO_DATE('$delivery_date', '%d/%m/%Y'), '$stock_taken', '$special_instructions', '$cost_price', '$cost_price_gst', '$sell_price', '$sell_price_gst', '$ext_sell_price', '$retail_customer', '".date('Y-m-d H:i:s', time())."', '".date('Y-m-d H:i:s', time())."', '1')"); 

Query 2 – 따옴표(예: O’Brien)를 사용하여 이름을 입력할 때 실패합니다.

$query = mysql_query("INSERT INTO message_log (order_id, timestamp, message_type, email_from, supplier_id, primary_contact, secondary_contact, subject, message_content, status) VALUES ('$order_id', '".date('Y-m-d H:i:s', time())."', '$email', '$from', '$row->supplier_id', '$row->primary_email' ,'$row->secondary_email', '$subject', '$message_content', '1')"); 


질문에 대한 답변



(양쪽의 스니펫에 있는) 각 문자열은, 다음과 같이 이스케이프해야 합니다.mysql_real_escape_string().

http://us3.php.net/mysql-real-escape-string

두 개의 쿼리가 다르게 동작하는 이유는 아마도 다음과 같습니다.magic_quotes_gpc를 on으로 합니다(이것은 좋지 않은 생각인 것을 알 필요가 있습니다).즉, $_GET, $_POST 및 $_COOKIES에서 수집된 문자열은 사용자를 위해 이스케이프됩니다(즉,"O'Brien" -> "O'Brien").

데이터를 저장한 후 다시 가져오면 데이터베이스에서 가져온 문자열은 자동으로 이스케이프되지 않습니다.당신은 돌아올 것이다"O'Brien"그래서, 당신은 그것을 통과시켜야 합니다.mysql_real_escape_string().




2015년에 이 솔루션을 찾고 앞으로 나아가야 할 분들을 위해…

mysql_real_escape_string()이 함수는 PHP 5.5.0에서 권장되지 않습니다.

참조: php.net

경고

이 확장자는 PHP 5.5.0에서 폐지되어 향후 삭제될 예정입니다.대신 MySQLi 또는 PDO_MySQL 확장을 사용해야 합니다.자세한 내용은 MySQL: API 가이드 및 관련 FAQ를 참조하십시오.이 기능을 대신할 수 있는 것은 다음과 같습니다.

mysqli_real_escape_string()

PDO::quote()




디버깅에 도움이 되도록 다음과 같은 작업을 수행해야 합니다.

$sql = "insert into blah values ('$myVar')"; echo $sql; 

작업 쿼리에서 단일 따옴표는 백슬래시와 함께 이스케이프됩니다.이것은 magic_quotes_gpc 설정을 통해 PHP에 의해 자동으로 수행되었을 수도 있고, 사용자가 코드의 다른 부분에서 수행했을 수도 있습니다(추가 슬래시와 스트립슬래시는 찾는 함수일 수도 있습니다).

매직 쿼트 참조




당신은 몇 가지 일을 잘 해내고 있어요.

  • 올바른 MySQL 견적이 없습니다( )mysql_real_escape_string())
  • 잠재적인 자동 ‘인용어음’ — gpc_displays_displays 설정을 확인합니다.
  • 내장된 문자열 변수, 즉 PHP가 변수를 올바르게 찾는 방법을 알아야 합니다.

첫 번째 쿼리에 대한 매개 변수에 따옴표로 묶인 값이 없을 수도 있습니다.이 예는 결국 적절한 이름이고 두 번째 쿼리만 이름을 다루고 있는 것 같습니다.




PHP와 MySQL을 모두 생략하고 다음을 수행할 수 있습니다.

<? $text = '<a href="javascript:window.open(\'http://www.google.com\');"></a>'; ?>

이는 MySQL을 다음과 같이 반영합니다.

<a href="javascript:window.open('http://www.google.com');"></a> 

어떻게 작동합니까?

PHP와 MySQL의 아포스트로피는 모두 백슬래시와 아포스트로피를 사용하여 이스케이프할 수 있습니다.

' 

MySQL에 삽입하기 위해 PHP를 사용하기 때문에 MySQL에 백슬래시를 쓸 수 있는 PHP가 필요합니다.이를 위해 백슬래시-apostrophe와 함께 백슬래시-백슬래시라는 PHP 이스케이프 문자를 사용합니다.

\'