programing

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

randomtip 2022. 9. 11. 16:55
반응형

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 이스케이프 문자를 사용합니다.

\\\'

"mysql_real_escape_string($val)" 내의 변수(또는 데이터)를 전달하기만 하면 됩니다.

서 ''는$val이치노

저도 같은 문제가 있어서 이렇게 해결했어요.

$text = str_replace("'", "\'", $YourContent);

더 좋은 방법이 있을지도 모르지만, 나한테도 효과가 있었고, 너도 효과가 있을 거야.

mysql_real_message_string() 또는 str_replace() 함수는 문제를 해결하는 데 도움이 됩니다.

http://phptutorial.co.in/php-echo-print/

언급URL : https://stackoverflow.com/questions/2687866/escaping-single-quote-in-php-when-inserting-into-mysql

반응형