$stmt=$con->query("insert into tbl(data) values(0x".$data1['hex'].")");
이것은 SQL 문이며 잘 작동합니다. 가치
0xFFD8FFE000104A46494600010101006000600000FFDB00430...
데이터베이스에 저장되고 확인하면 이미지가 저장됩니다. 그러나 나는 PDO를 사용하여 이것을하려고하는데 저장된 값이 다르고 이미지가 표시되지 않습니다. 내 코드는 다음과 같습니다.
$datastring = file_get_contents("image.JPG");
$data1 = unpack("H*hex", $datastring);
$data = '0x'.$data1['hex'];
$stmt=$conp->prepare("insert into tbl(data) values(:data)");
$stmt->bindparam(':data', $data);
$stmt->execute();
데이터베이스의 가치
0x30786666643866666530303031303461343634393436303...
무엇이 차이를 만드는가? 내가 뭔가 잘못하고 있습니까? PHP 5.6에서 Microsoft pdo_odbc 드라이버와 함께 SQL Server 2008R2를 사용하고 있습니다.
첫 번째 Google 히트 mssql varbinary pdo
: https://social.msdn.microsoft.com/forums/sqlserver/en-US/221dcea2-438d-4a3a-b438-b98bff8f3d57/using-pdostatementbindvalue-to-update-varbinary-fields
$sth->bindParam(1, $pswd, PDO::PARAM_LOB, 0, PDO::SQLSRV_ENCODING_BINARY);
따라서 $stmt->bindParam(':data', $data, PDO::PARAM_LOB, 0, PDO::SQLSRV_ENCODING_BINARY);
작동해야합니까?
편집 : Aaaaah, 바보 나 : 물론 이것은 작동하지 않습니다. 바이너리를 전달하는 것이 아닙니다. 문자열은 16 진수로 인코딩 된 것처럼 보이는 임의의 ASCII 문자열입니다. 다음과 같은 사이트로 이동하십시오. http://www.rapidtables.com/convert/number/hex-to-ascii.htm 을 붙여넣고 0x30786666643866666530303031303461343634393436303
ASCII로 변환하면 무엇을 얻습니까? 0xffd8ffe000104a4649460
, 원본 데이터.
PDO / MSSQL이 16 진수로 변환하는 바이너리 데이터를 전달한다고 생각하므로 0
ASCII는 30
16 진수, x
is 78
, f
is 66
등입니다. 아이디어를 얻으 셨기를 바랍니다.
첫 번째 작업 예제와의 차이점은 미묘합니다. 전달 된 값 ( 0x...
)을 따옴표로 묶지 않으므로 16 진수 형식의 "진정한 이진"으로 처리됩니다. PDO 접근 방식에서 전달 된 값은 예를 들어 SQL 주입 공격을 방지하기 위해 PDO에 의해 내부적으로 "인용"됩니다. 첫 번째 예제에 따옴표를 넣으면 PDO와 동일한 결과를 얻을 수 있습니다.
무엇을해야합니까? 16 진수 인코딩은 잊어 버리고 odbc 드라이버 / MSSQL이 변환을 처리하도록합니다. $datastring
대신 통과 $data
하면 괜찮을 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다