php: изменение эффектов mysql_real_escape_string на двоичные

Я создал веб-страницу, где пользователи могут отправить PDF-файл, который затем вставляется в базу данных MySQL в среднюю ячейку для последующего поиска.

Все это прекрасно работает, за исключением случаев, когда PDF содержит изображения или встроенные шрифты, и в этом случае изображения повреждаются, и любой текст с использованием шрифта исчезает (Acrobat отображает сообщение о недостающем шрифте).

Я решил, что проблема возникает из-за передачи данных в формате pdf через mysql_real_escape_string_function. Я перешел на base64_encode / base64_decode при отправке / поиске, который исправил проблему для всех новых файлов, но у меня есть около 25 уже отправленных PDF-файлов, которые мне нужно уметь читать.

Можно ли отменить эффекты mysql_real_escape_string? Или эти файлы повреждены без ремонта?

mysql_real_escape_string() помещает обратную косую черту в эти символы.

 \x00, \n, \r, \, ', " and \x1a 

Дело в том, что если ваш двоичный вывод имеет обратную косую черту, это бинарные данные, его можно будет очень сложно исправить. При этом нет никакой магической функции, чтобы отменить эту функцию.

Несомненно, следует исправить. Вам просто нужно выяснить, что именно делает mysql_real_escape_string. Я считаю, вам просто нужно удалить любые косые черты, которые непосредственно предшествуют CR, LF, TAB, одиночной кавычки, двойной кавычки, NUL или другой косой чертой. Должно быть однострочное исправление регулярного выражения.

Честно говоря, я не знаю, что еще может быть. Когда я изменил этот бит кода, он устранил проблему, и я нашел другие экземпляры в Интернете, где у людей была такая же проблема (но без решений).

Вот код вставки:

 function db_value( $mysqli, $value ) { if( empty($value) ) return "''"; if( get_magic_quotes_gpc() ) $value = stripslashes($value); if( !is_numeric($value) || ($value[0] == '0' && $value != 0) ) $value = "'".mysqli_real_escape_string($mysqli, $value)."'"; return $value; } function saveToDatabase( $data, $fileTempName, $abstractFileName ) { $fileHandle = fopen( $fileTempName, 'r' ); $abstractFile = fread( $fileHandle, filesize( $fileTempName ) ); fclose( $fileHandle ); $abstractFileMimeType = $fileUpload->get_mime(); $mysqli = connect_to_database(); if( $mysqli != FALSE ) { $insertQuery = "INSERT INTO `paper_submissions` ( `name`, `affiliation`, `email`, `phone_number`, `title`, `abstract`, `abstract_file`, `abstract_file_name`, `abstract_file_mime_type`, `requests_financial_support`, `HTTP_USER_AGENT`, `REMOTE_ADDR` ) VALUES ( ".db_value( $mysqli, $data['submitter_name'] ).", ".db_value( $mysqli, $data['submitter_affiliation'] ).", ".db_value( $mysqli, $data['submitter_email'] ).", ".db_value( $mysqli, $data['submitter_phone'] ).", ".db_value( $mysqli, $data['paper_title'] ).", ".db_value( $mysqli, $data['abstract_text'] ).", ".db_value( $mysqli, $abstractFile ).", ".db_value( $mysqli, $abstractFileName ).", ".db_value( $mysqli, $abstractFileMimeType ).", ".db_value( $mysqli, $data['request_financial_support'] ).", ".db_value($mysqli, $_SERVER['HTTP_USER_AGENT']).", ".db_value($mysqli, $_SERVER['REMOTE_ADDR'])." )"; $insertResult = $mysqli->query( $insertQuery ); close_database( $insertResult, $mysqli ); return $insertResult; } return FALSE; } 

И вот код извлечения:

 $selectQuery = "SELECT `abstract_file_name`, `abstract_file_mime_type`, `abstract_file` FROM `paper_submissions` WHERE `id` = ".db_value( $mysqli, $id ); $result = $mysqli->query( $selectQuery ); if( $result != FALSE ) { if( $result->num_rows ) { $paper = $result->fetch_array( MYSQL_ASSOC ); $fileSize = strlen( $paper['abstract_file'] ); header( 'Date: '.gmdate( "D, d MYH:i:s" ).' GMT' ); header( 'Expires: Thu, 19 Nov 1981 08:52:00 GMT' ); header( 'Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0' ); header( 'Pragma: no-cache' ); header( 'Content-Type: '.$paper['abstract_file_mime_type'].'; charset=utf-8' ); header( 'Content-Length: '.$paper['abstract_file_size'] ); header( 'Content-Disposition: inline; filename="'.$paper['abstract_file_name'].'"' ); echo $paper['abstract_file']; exit(); } } 

Олафур,

Я собрал это из руководства php и даже попробовал следующее:

 $search = array( "\\0", "\\n", "\\r", "\\\\", "\\'", "\\\"", "\Z", ); $replace = array( "\x00", "\n", "\r", "\\", "'", "\"", "\x1a" ); $desiredString = str_replace( $search, $replace, $escapedString ); 

Кажется, что это хорошо работает при работе с текстом, но применение его к двоичным данным только ухудшает PDF (например, абзацы отсутствуют).