2017-02-23 70 views
1

Я пытаюсь вставить данные в одном файле в в колонку LONGBLOB через PHP вместе с некоторыми другими данными, как имя файла, размер в байтах, SHA256 контрольной суммы и т.д.Что именно означает «Не удается отправить длинные данные для нестроковых/не двоичных типов данных»?

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

INSERT INTO DB_NAME.TABLE_NAME (SHA256SUM, FILE_NAME, FILE_DATA) VALUES (?, ?, ?) 

так что мой PHP код в настоящее время выглядит следующим образом:

$mysqli_query = 'INSERT INTO DB_NAME.TABLE_NAME (SHA256SUM, FILE_NAME, FILE_DATA) VALUES (?, ?, ?)'; 
$stmt = $mysqli->prepare($mysqli_query); 
$null = NULL; 
$stmt->bind_param("ssb", $sha256sum, $_FILES['career_application_FILE_UPLOAD']['name'], $null); 
$stmt->send_long_data(0, file_get_contents($_FILES['career_application_FILE_UPLOAD']['tmp_name'])); 
$stmt->execute(); 

Это в значительной степени то, что предлагает Oracle right here.

Но по какой-то причине это просто не работает для меня. (И поверьте мне, я пробовал последние 3 часа.)

Он продолжал возвращать общую ошибку MySQL «COLUMN FILE_DATA НЕ МОЖЕТ БЫТЬ НУЛЛ».

Поэтому я включил значения NULL в столбце FILE_DATA, а затем INSERT будет работать, но столбец FILE_DATA (который должен быть заполнен данными BLOB) просто читает NULL.

Так что значения отключены NULL на колонке FILE_DATA и я поставил $stmt_error = $stmt->error; линию только после send_long_data секции, и я поймал следующее сообщение об ошибке:

Can't send long data for non-string/non-binary data types

Я попытался расшифровке, что это значит, и не смог, поэтому я прошу о помощи.

Я собираюсь поспать, и, надеюсь, утром я могу ответить на свой собственный глупый вопрос ... У меня просто такое чувство, что это нечто совершенно очевидное. Я слишком устал, чтобы заметить это прямо сейчас.

Некоторые детали:

  • Я бегу этот код на Debian 8 и Nginx v1.6.2
  • Я четверной проверил, что мой MySQL max_allowed_packet устанавливается по умолчанию 16776192 (который не имеет значения в любом случае, поскольку файлы, которые я пытаюсь загрузить, составляют от нескольких байтов до нескольких килобайт)
  • Я попытался загрузить все различные типы файлов (txt, mov, png, pdf и т. д.)
  • Я не незнакомы с PHP или MySQL вообще, я работал с ними как для o ver 10 лет сейчас
  • Я даже попытался установить сопоставление LONGBLOB в двоичном формате, так как сопоставление всей таблицы было ascii ... но изменить значение LONGBLOB не удалось, и это не имеет значения, поскольку, как я сказал первоначально. phpMyAdmin не имеет проблем с вставкой файлов в колонку LONGBLOB)

Спасибо за чтение.

+1

Пожалуйста, добавьте фактическую структуру таблицы, что связано с вашей ошибкой и операцией sql, а также с соответствующим сообщением об ошибке и кодом ошибки. Также я заметил '$ stmt-> send_long_data (0,' первый параметр, должен ли он быть 2 нет ?! –

+0

@BalazsVago большое вам спасибо. Я неверно истолковал, каков был первый параметр send_long_data, который решил это! для 2, так как это был третий параметр ... smh! – darkAsPitch

ответ

0

В моей глупости я не смог прочитать спецификацию для send_long_data в ее полном объеме и просто предположил, что 0 был ничтожным заполнитель для чего-то.

Это не несущественно.

Это должно было быть 2.Приравнивать третий параметр MySQL INSERT.