PHP에서 Serialize 함수는 PHP 변수를 문자열로 변환하는 일반적인 방법입니다. 특히 복잡한 데이터 (예 : 배열, 객체)를 데이터베이스 또는 파일에 저장합니다. 그러나 저장 또는 검색 중에주의를 기울이지 않으면 데이터 손상 또는 불일치가 발생할 수 있습니다. 이 기사는 PHP의 직렬화 기능을 사용하여 데이터를 데이터베이스에 올바르게 저장하고 가능한 손상 문제를 피하는 방법을 설명합니다.
직렬화 함수는 PHP 변수를 저장 및 전송할 수있는 문자열 형식으로 변환합니다. 배열이나 객체를 데이터베이스에 저장 해야하는 경우 PHP의 직렬화 기능은이 복잡한 데이터를 간단한 문자열로 변환 할 수 있기 때문에 매우 유용합니다. 이 문자열을 데이터베이스의 필드에 저장 한 다음 비 제외 기능을 사용하여 나중에 원래 배열 또는 객체로 복원 할 수 있습니다.
예를 들어 배열이 있다고 가정합니다.
$data = array("name" => "Alice", "age" => 30, "city" => "New York");
Serialize 함수를 사용하여 문자열로 변환하십시오.
$serializedData = serialize($data);
echo $serializedData;
출력은 다음과 유사한 문자열 표현입니다.
a:3:{s:4:"name";s:5:"Alice";s:3:"age";i:30;s:4:"city";s:8:"New York";}
Serialize 함수를 사용하여 데이터를 문자열로 변환 한 후 데이터베이스에 데이터를 저장할 수 있습니다. 사용자 기본 설정을 저장하기위한 환경 설정 필드가 포함 된 사용자 라는 간단한 데이터베이스 테이블이 있다고 가정합니다. Serialize 함수를 사용하여 배열 데이터를 문자열로 변환하고 데이터베이스에 삽입 할 수 있습니다.
// 데이터베이스에 연결했다고 가정하십시오
$data = array("theme" => "dark", "language" => "en");
$serializedData = serialize($data);
// 데이터베이스 쿼리를 사용하여 데이터를 삽입하십시오
$sql = "INSERT INTO users (preferences) VALUES (:preferences)";
$stmt = $pdo->prepare($sql);
$stmt->execute(['preferences' => $serializedData]);
이 예에서는 사용자의 환경 설정이 데이터베이스의 기본 설정 필드에 직렬화 된 문자열로 저장됩니다.
데이터베이스에서 저장된 직렬화 된 데이터를 검색하면 비 제외 기능을 사용하여 원래 PHP 데이터 유형으로 복원하십시오. 사용자의 선호도를 얻고 배열로 복원하고 싶다고 가정합니다.
// 데이터베이스에서 직렬화 된 문자열을 검색합니다
$sql = "SELECT preferences FROM users WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute(['id' => 1]);
$row = $stmt->fetch();
// 사용 unserialize 데이터를 복원하십시오
$preferences = unserialize($row['preferences']);
print_r($preferences);
현재 $ 기본 설정은 연관 배열이됩니다.
Array
(
[theme] => dark
[language] => en
)
직렬화 및 비 제외 기능을 사용하는 경우 특히 데이터베이스에서 데이터를 검색 할 때 잠재적 위험에 특히주의해야합니다.
데이터베이스 및 테이블의 문자 세트가 올바르게 설정되어 있는지 확인하고 UTF-8 문자 세트는 일반적으로 문자 인코딩 문제를 피하는 데 사용됩니다. 그렇지 않으면, 직렬화 된 문자열은 일관되지 않은 문자 인코딩으로 인해 데이터 손상을 유발할 수 있습니다.
데이터베이스 작업을 수행 할 때 사용자가 입력 한 데이터를 SQL 쿼리에 직접 포함시키지 마십시오. SQL 주입 공격을 피하기 위해 항상 준비된 진술을 사용하십시오.
Unserialize 기능을 사용하면 사막화 실패가 발생할 수 있습니다. 현재 @ 연산자를 사용하여 오류를 억제하고 사막화 결과가 허위 인지 확인하고 적절한 오류 처리 조치를 취할 수 있습니다.
$preferences = @unserialize($row['preferences']);
if ($preferences === false) {
// 사제화가 실패했습니다,처리 오류
echo "Failed to unserialize data.";
}
Serialize 기능은 매우 강력하지만 경우에 따라 JSON_ENCODE 및 JSON_DECODE 기능을 대신 사용하는 것을 고려할 수도 있습니다. JSON 형식은 일반적으로 다른 언어 및 플랫폼과 상호 작용하기가 더 쉽고 처리 될 때 PHP 특이 적 직렬화 메커니즘에 의존하지 않습니다.
// 사용 json_encode 그리고 json_decode
$data = array("theme" => "dark", "language" => "en");
$jsonData = json_encode($data);
// 데이터베이스에 저장하십시오
$sql = "INSERT INTO users (preferences) VALUES (:preferences)";
$stmt = $pdo->prepare($sql);
$stmt->execute(['preferences' => $jsonData]);
// 데이터베이스에서 검색하고 복원합니다
$sql = "SELECT preferences FROM users WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute(['id' => 1]);
$row = $stmt->fetch();
$preferences = json_decode($row['preferences'], true);
print_r($preferences);
JSON은 특히 외부 시스템과의 데이터 교환이 필요할 때 직렬화 보다 더 넓은 호환성을 가지고 있습니다.
요약
PHP의 직렬화 기능을 사용하면 복잡한 데이터를 데이터베이스에 쉽게 저장할 수 있지만 실제로 작동하는 경우에도 데이터 손상을 방지하기 위해주의를 기울여야합니다. 문자 세트의 정확성을 확인하고, 전처리 명세서를 사용하여 SQL 주입을 방지하고, 사막화 오류를 처리하십시오. 또한 특히 다른 언어 나 플랫폼과 상호 작용할 때 JSON_ENCODE 및 JSON_DECODE를 직렬화 대안으로 사용하십시오.